image

看到美美的網站嗎?其實對於上線中的網站,自動備份是很基本的需求。只要有資料部份,就必需要有備份,畢竟如果網站毀損,要救回來必定要花大錢,還不一定能救得回來。

天界之舟官網

 

上圖摘自 https://heavenfortress.com ,超級推薦一覽!!!

目前維運的網站是採用 WordPress 的方案,雖然主機商有提供自動備份的解決方案,但是因為要多花錢,且備份容量只有 1GB,不是很夠用,所以想自己建立一個自動化備份的方式。

WordPress 備份什麼?

WordPress 主要依賴 mysql 及 php 檔案目錄執行,所以如果需要備份,主要就是定期備份 『mysql 資料庫』及『整個網頁目錄』兩者。

這樣假設網站資料毀損(WordPress 在更新前,都會建議大家先備份整個網站),可透由這兩個備份項目將網站快速復原。

以下將介紹使用 rsync 備份的方式, rsync 的好處在於可以比對目的端及來源端檔案的差異,並且只更新有變化的部分,對於網路傳輸非常有效率。

如果是使用傳統的 scp 的話,因為是完整覆蓋檔案,會一次傳輸整個資料夾,但用了 rsync 之後,只會把有變化的檔案傳輸過去,非常節省流量。
 

為什麼要自己備份?

  1. 實行異地備援,雞蛋不要放在同個籃子上,再怎麼穩定的(雲端)硬碟也有出問題的可能。
  2. 採用主機商的備援方案,我們很難掌握實際上資料被放到哪裡。
  3. 確保我們手邊有完整資料,而不是全部資料都在網路上。
  4. WordPress 也有自己的備份插件,但是通常要另外收費,且有容量上限。

不過備份自己來,就必須要自己寫腳本、準備空間處理備份硬碟的問題,所以這裡要評估是否要自己來😂。

 

需求

備份示意圖

主機商端:

  1. 主機商提供的伺服器需支援 Shell 及 SSH 存取權限。
    (這一步非常重要,因為 rsync 備份需要 SSH shell 存取)。
  2. mysql 登入的帳號密碼,可以從 wp-config.php 找。
  3. 主機的網路流量沒有使用限制為佳。

本地端:

  1. Linux 系統為佳,較易設定及安裝必要套件。
    (其實 Windows 也能跑,但是步驟會更複雜一點,改天寫一篇教學)
  2. 足夠大的備份用硬碟或是雲端硬碟。
  3. 支援 ssh 指令。
  4. 支援 rsync 指令。
  5. 足夠大的網路頻寬。

 

步驟

  1. 確認伺服器的 SSH private key 已經設定完成,且打通 Shell 存取權限。
  2. 下載伺服器的 SSH private key 至本地端,通常會把 key 放到 ~/.ssh 資料夾底下。
  3. 遠端登入到伺服器,匯出 MySQL 資料庫。
  4. 利用 rsync 將檔案備份至本機端。
  5. 資料夾打包成壓縮檔,並將檔名命名為備份日期。
  6. 將壓縮檔搬移至預備份的雲端硬碟/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"

 

腳本自動化處理

有幾種方法,搭配上述的腳本,就可以每日/週/月將整個網站備份到我們想要的地方了!!!

  1. 使用 crontab 定期執行腳本,可以通過以下方式設定。
    crontab -e
  2. 使用 Jenkins 或其他套件管理任務( 可以用 Docker image 或是自己抓 Jenkins 來跑)

 

延伸資料

Rsync、crontab、ssh、jenkins 用法及詳細介紹~敬請期待。

如果有任何想法或是問題,非常歡迎留言/email 討論喔!

arrow
arrow
    創作者介紹
    創作者 首陽 的頭像
    首陽

    首陽問路

    首陽 發表在 痞客邦 留言(5) 人氣()