使用 rsync 備份透過 Docker 架設的 WordPress

這篇勉強算是之前《自行透過 Docker 建立 WordPress 網站》的後續,不過主要應該還是在記錄自己這邊稍微玩一下 rsync 這個 Linux 下的備份工具(維基百科)的紀錄了。

首先,Heresy 這邊是要在跑 WordPress 的機器(以下簡稱 WP)上,另外跑一個 rsync daemon 來讓另一台備份用的電腦(以下簡稱 Backupper)連進來、把資料備份到 Backupper上。

設定 rsync daemon

這部份是要在 WP 上跑的。

如果在 Ubuntu 系統中已經裝好 rsync 的話,可以透過「systemctl status rsync」來確認 rsync daemon 有沒有跑起來。一般來說,剛裝好因為沒有設定對應的資料,所以應該會是不會執行起來的。

要設定的話,基本上就是去建立「/etc/rsyncd.conf」這個檔案設定檔;這邊採用的內容如下:

[wordpress]
  comment = backup myBlog
  hosts allow = *
  #hosts deny = *
  path = /home/ubuntu/myBlog
  auth users = backupper
  uid = root
  gid = root
  secrets file = /etc/rsyncd.secrets
  read only = yes
  dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

這邊是建立一個名為「wordpress」的 module,允許所有的 IP 可以連入,用來認證的帳號是「backupper」;「uid」和「gid」則都是「root」、應該是代表處理檔案時的角色、群組。

要注意的是,這邊的「backupper」帳號並不是 Linux 系統裡的帳號,帳號的資訊是要另外寫在 /etc/rsyncd.secrets 這個檔案;裡面的內容格式就是「account:password」這樣的形式;這邊的話就是:

backupper:my_password

然後重點是這個檔案要設定僅有 root 可以讀取,建議可以用下面的指令修改:

chmod 600 /etc/rsyncd.secrets
chown root.root /etc/rsyncd.secrets

允許存取的路徑則是「/home/ubuntu/myBlog」這個資料夾;由於這邊是純粹是要備份,所以設定成唯讀。

都改好後,就可以透過「systemctl start rsync」來啟動 rsync,或是在修改後,也可以透過「systemctl restart rsync」來重新啟動、套用更新。

另外,由於 rsync daemon 是走 873 port,所以如果有防火牆要記得設定。

另外,由於 rsync daemon 走的連線應該是沒有加密的,所以建議僅在內部網路使用;如果要對外的話,可能還是走 SSH 的模式會比較合適。


簡單的使用

要測試 rsync daemon 有沒有成功跑起來,一個方法就是到別台電腦,用下面的指令測試:

rsync rsync://server_ip

如果可以正確連上的話,他應該會列出有設定的 module、以及對應的註解,以這邊來說就是「wordpress」。

而如果要一次性地備份 WP 上的資料的話,則可以透過下面的指令來進行:

rsync -avz --password-file=./pwdfile backupper@server_ip::wordpress /mnt/backup

這樣的指令,就可以把 WP 上的的「/home/ubuntu/myBlog」這個資料夾,整個複製到
Backupper 的「/mnt/backup」資料夾了。

這邊要注意的是,rsync 預設應該是會用 SSH 來連線,如果是要透過 rsync daemon 模式來執行的話,則是要透過「–password-file」這個參數,來指定登入用的密碼檔案;這邊的密碼檔案是「./pwdfile」,裡面的內容就是之前在 WP 電腦上、/etc/rsyncd.secrets 這個檔案裡的密碼的部分,也就是「my_password」。

而帳號的指定,則是要加在 server 的前面,用「@」來連接。

至於其他的參數,其實 rsync 的參數多到爆炸,要完全搞懂也得花不少時間…有興趣的話,可以參考官方的說明文件(連結)。

這邊使用的是「-avz」,其中「v」是代表「verbosity」、是用來讓程式輸出更多資訊用的,「z」則是要求傳輸過程要壓縮;「a」則是「archive mode」、相當於「-rlptgoD」這一大串,基本上如果是要整個備份的話,大多都是會用這個參數。


備份前先匯出資料庫

而這邊會選擇使用 rsync daemon 模式,主要還有一個原因,是因為 rsync daemon 有支援在執行前/後都執行自己的腳本。

要做到這件事,可以在「/etc/rsyncd.conf」這個檔案中,加入「pre-xfer
exec
」,就可以在開始輩分前先執行備份的前置作業了~

Heresy 這邊的作法,基本上就是在「/etc/rsyncd.conf」最後,加入一行:

pre-xfer exec = docker exec heresy_db bash -c /backup/dump.sh

這邊是在 heresy_db 這個用來跑 mySQL 資料庫的 Docker 容器中,去執行 /backup/dump.sh 這個腳本;腳本的內容,則就是透過 mysqldump 這個指令,把所有的資料庫匯出成一個 SQL 檔了。

他的指令是:

mysqldump --all-databases -p$MYSQL_ROOT_PASSWORD > /backup/dump.sql

至於 /backup 這個資料夾,則是在建立 heresy_db  這個 docker 容器時,要另外掛進去的。

docker-compose.yml 裡就是變成下面的形式:

heresy_db:
   image: mysql:latest
   container_name: heresy_db
   volumes:
      - ../db_data:/var/lib/mysql
      - ../db_dump:/backup
      - ./config/my.cnf:/etc/mysql/my.cnf

這邊就是把外面「../db_dump」這個資料夾掛進去,而 dump.sh 這個檔案也就是在這個資料夾裡。

如此一來,當透過 rsync 備份的時候,他就會先把資料庫都匯出成 dump.sql
這個檔案了~ 如此一來,也就可以避免直接複製 mySQL 的檔案的潛在問題了。


這部分的東西可以參考 with_backup 這個分支,初始化的狀況大概會像下面的流程:

git clone -b with_backup https://github.com/KHeresy/wordpress_with_docker_compose.git myBlogchmod +x ./myBlog/db_dump/dump.sh

cp ./myBlog/rsync_conf/* /etc
chmod 600 /etc/rsyncd.secrets
chown root.root /etc/rsyncd.secrets
systemctl restart rsync

cd myBlog/nginx/
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout ssl.key -out ssl.csr

cd ../docker
docker-compose up -d

當然,這邊要會有一些要修改的東西;而特別要注意的是,如果本來就有 rsync 的相關設定的話,就不能直接用複製的方法蓋掉設定擋了。

而之後,就是看自己要怎麼用 rsync 來備份,調整好參數後,再加到 crontab 裡面就可以定時備份了~

另外,如果是使用 Synology 的 NAS 的話,其實也可以考慮透過他的「Active Backup for Business」(官網)來做自動備份;要備份 rsync 的資料的話,是要選擇它裡面的「檔案伺服器」這個分類,然後新增的時候選「rsync 伺服器」、「rsync module 模式」,接下來就都是圖形化的介面設定了。


參考:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。