看到美美的網站嗎?其實對於上線中的網站,自動備份是很基本的需求。只要有資料部份,就必需要有備份,畢竟如果網站毀損,要救回來必定要花大錢,還不一定能救得回來。
上圖摘自 https://heavenfortress.com ,超級推薦一覽!!!
目前維運的網站是採用 WordPress 的方案,雖然主機商有提供自動備份的解決方案,但是因為要多花錢,且備份容量只有 1GB,不是很夠用,所以想自己建立一個自動化備份的方式。
WordPress 備份什麼?
WordPress 主要依賴 mysql 及 php 檔案目錄執行,所以如果需要備份,主要就是定期備份 『mysql 資料庫』及『整個網頁目錄』兩者。
這樣假設網站資料毀損(WordPress 在更新前,都會建議大家先備份整個網站),可透由這兩個備份項目將網站快速復原。
以下將介紹使用 rsync 備份的方式, rsync 的好處在於可以比對目的端及來源端檔案的差異,並且只更新有變化的部分,對於網路傳輸非常有效率。
如果是使用傳統的 scp 的話,因為是完整覆蓋檔案,會一次傳輸整個資料夾,但用了 rsync 之後,只會把有變化的檔案傳輸過去,非常節省流量。
為什麼要自己備份?
- 實行異地備援,雞蛋不要放在同個籃子上,再怎麼穩定的(雲端)硬碟也有出問題的可能。
- 採用主機商的備援方案,我們很難掌握實際上資料被放到哪裡。
- 確保我們手邊有完整資料,而不是全部資料都在網路上。
- WordPress 也有自己的備份插件,但是通常要另外收費,且有容量上限。
不過備份自己來,就必須要自己寫腳本、準備空間處理備份硬碟的問題,所以這裡要評估是否要自己來😂。
需求
主機商端:
- 主機商提供的伺服器需支援 Shell 及 SSH 存取權限。
(這一步非常重要,因為 rsync 備份需要 SSH shell 存取)。 - mysql 登入的帳號密碼,可以從 wp-config.php 找。
- 主機的網路流量沒有使用限制為佳。
本地端:
- Linux 系統為佳,較易設定及安裝必要套件。
(其實 Windows 也能跑,但是步驟會更複雜一點,改天寫一篇教學) - 足夠大的備份用硬碟或是雲端硬碟。
- 支援 ssh 指令。
- 支援 rsync 指令。
- 足夠大的網路頻寬。
步驟
- 確認伺服器的 SSH private key 已經設定完成,且打通 Shell 存取權限。
- 下載伺服器的 SSH private key 至本地端,通常會把 key 放到 ~/.ssh 資料夾底下。
- 遠端登入到伺服器,匯出 MySQL 資料庫。
- 利用 rsync 將檔案備份至本機端。
- 資料夾打包成壓縮檔,並將檔名命名為備份日期。
- 將壓縮檔搬移至預備份的雲端硬碟/NAS 上。
指令檔案
以下說明請參閱註解
#!/bin/bash #設定 private key的位置 private_key=~/.ssh/my_key.id_rsa #設定 SSH 欲登入的帳號及伺服器 target_host=my_account@heavenfortress.com #設定要拿來同步的資料夾位置 mirror_dir="/Volumes/Samsung_T5/heavenfortress_mirror" #設定要拿來存放備份檔案的資料夾位置 gdrive="/Volumes/GoogleDrive/我的雲端硬碟/天界之舟/heavenfortress.com.bak" #設定備份檔檔案名稱,這裡會帶日期 target_file_name=/Volumes/Samsung_T5/heavenfortress.com.`date +%Y%m%d`.zip #登入遠端,並將目前的資料庫複製出來 ssh -i $private_key $target_host 'mysqldump -p"資料庫密碼" -u 資料庫帳號 資料庫名稱 > sql_backup/www.sql' mkdir -p $mirror_dir #將剛剛的資料庫同步至本地端 rsync -e "ssh -i $private_key" --progress -aHv $target_host:~/sql_backup $mirror_dir #將整個網頁資料夾 www 同步至本地端 rsync -e "ssh -i $private_key" --progress -aHPv --del $target_host:~/www $mirror_dir #將同步好的資料夾壓縮成 zip 檔案,並且命名帶上日期 zip -yr -9 $target_file_name $mirror_dir #將壓縮檔移動至存放備份檔的資料夾中 mv $target_file_name "$gdrive"
腳本自動化處理
有幾種方法,搭配上述的腳本,就可以每日/週/月將整個網站備份到我們想要的地方了!!!
- 使用 crontab 定期執行腳本,可以通過以下方式設定。
crontab -e
- 使用 Jenkins 或其他套件管理任務( 可以用 Docker image 或是自己抓 Jenkins 來跑)
延伸資料
Rsync、crontab、ssh、jenkins 用法及詳細介紹~敬請期待。
如果有任何想法或是問題,非常歡迎留言/email 討論喔!
文章標籤
全站熱搜
留言列表