本文詳細好讀版也會發表於個人網站,也歡迎追蹤個小小粉絲團 https://www.facebook.com/garynil.tw/ 看各種土砲實驗和教學(?
手邊長期維護了幾個架在日本 VPS 上以 Linux LAMP 為環境的網站服務,包含了 Wordpress,Drupal,PHP,nodeJS,純靜態 html 等架構
當然維持網站服務的穩定性除了良好的資安設定外,最重要的就是定期定時備份了
如同 macOS 的 TimeMachine 一樣,網站出問題甚至被攻擊下線時有越接近時間點的快照備份真的能拯救很多東西
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-62391693f8c5716dd2a2569163cd7fe3.jpg)
過去幾年我在 Linux 上是使用 Backup GEM 來備份資料庫與檔案結構,蠻穩定的,還能搭配 IFTTT 產生通知,但缺點就是這套件作者已經沒在更新了,所以只能使用超舊的 ruby 2.3.8 環境來安裝,環境超難安裝每次都要花一小時以上就算了,並且依賴的套件如 openSSL 都沒更新,安全性就會有疑慮
剛好利用這次從 Backup GEM 跳槽到 GoBackup for Linux 的機會來研究看看利用備份檔搭配 NAS 套件 Docker 的特性來架個每天會更新的分站,
所以這篇文章也可以看成:
1. 如何用 Synology NAS 建 Wordpress
2. 如何用 GoBackup 備份 Linux / Wordpress
3. 如果還原備份至 Docker Wordpress Container
4. 如何還原資料庫至 Docker mySQL Container
超級萬用(?)
文章段落
1. 安裝 GoBackup for Linux
2. Go 備份排程
3. 佈屬 mySQL Docker Container 容器
4. mySQL Docker Container 還原資料庫
5. Wordpress Docker Container 設定並還原
我的架構構想如下:
▼ 簡單來說,我在主機上本來就會排程每幾個小時 / 每天透過 backup 套件備份 mySQL 資料庫和檔案至 NAS 端,這部分是透過 GoBackup 搭配 Crontab 排程來實現,打包整個備份並 scp 傳輸至 NAS
備份檔會依照排程定時備份至 NAS 後,
在 NAS 端我們定時將打包解壓縮,並透過 docker bash 互動指令部屬至 NAS 上的 docker 環境中,
如此一來就可以實現定期更新的分站環境了
並且當你原始主機被攻擊打掉或者出現錯誤時,只要透過 Cloudflare 即時切換網域的 A Record 至 NAS 的 docker,就可以實現幾乎無間斷的線上服務
那以下教學我們就以常見的 wordpress 為例,當然其他服務也可以以此類推
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-1e93bd3e5cfe0f053ec45832f9437d09.jpg)
GoBackup 備份 Linux 工具
GoBackup 是一個類似 backup/backup 的一站式備份工具,透過一個 yml 捨定檔可以每次按照設定將 Server 上的資料庫,文件等打包壓縮並備份至指定的地點(如 Local,SCP,S3 等),更可以搭配 Crontab 實現定時備份的目的。
特色
- 自動化排程備份,透過設定檔簡化工作
- 簡單無依賴安裝,相比 backup/backup 無需安裝 Ruby 運行環境
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-3538b04a8f0dc8e7d73fa4c1de3cd8d5.png)
1. 安裝 GoBackup for Linux
▼ 選擇 GoBackup 的原因就是他真的很輕量,透過一行指令下載 script 就幫你安裝好了,本質上就是個適用於 Darwin or Linux x64 的可執行檔
curl -sSL https://git.io/gobackup | bash
等上面執行成功以後,
gobackup
會安裝在 /usr/local/bin/gobackup 路徑,然後你可以確認版本,截制目前為止我使用的是 0.8.2 版:gobackup -v
# gobackup 0.8.2
測試完成後,GoBackup 會自動在下面這些位置尋找設定檔 yml 文件,我們使用的是使用者資料夾 ~ 下的 .gobackup 內的檔案:
- ~/.gobackup/gobackup.yml
- /etc/gobackup/gobackup.yml
▼ Wordpress 備份的設定檔
https://gist.github.com/GaryniL/de0dd23988d83b52530f7cb755431e11
你可以參考一下下面的設定,簡單來說我是備份 Wordpress(以下簡稱WP)的資料庫與整個 WP 檔案資料夾結構(於 Linux 中位於 /var/www/wordpress )
一些註解部分改成你的設定,並將檔案放置欲備份主機的 ~/.gobackup/gobackup.yml 即可:
設定檔語法教學可參考:https://gobackup.github.io/configuration/
PS. 注意,這邊要先於 Linux 主機中設定好 public key 可 SSH 免密碼登入 NAS,才可以透過 scp 複製檔案過去
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-4fc67813574ab5e7375e245b0f707928.png)
▼ 設定完成之後,你只要在 Linux 主機上輸入指令
gobackup perform
,就會自動套用你的設定檔並開始備份,於 Log 可以看到時間與執行的任務區塊成功與否,流程大致是 打包資料庫 -> 打包檔案 -> 壓縮封存 -> 透過 SCP 傳輸至 NAS
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-5b1d5beee8fe2b2828142eac1e2cc470.png)
▼ 完成之後備份檔就會出現在你的 NAS 中,就這麼簡單
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-8fdf84f97b596ddacb2668a11ddd19aa.png)
▼ 可以透過 DSM 中右鍵解壓縮來解壓,亦或者
tar zxvf 打包檔案名稱.tar.gz
指令![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-bfc4232e56451db107255f8fe97466ce.png)
▼ 解壓縮完後的主要路徑有幾個,等等教學會用到,就依照你自己的狀況做置換
- GoBackup 備份至 NAS 路徑:~/backup
- 解壓縮檔案後的根目錄(依照你 GoBackup 任務名稱命名):~/backup/wordpress
- mySQL 備份檔路徑:~/backup/wordpress/mysql/wordpress/database.sql
- Wordpress 備份檔目錄:~/backup/wordpress/var/www/wordpress
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-fb6fca4e178df144a6bcc2f4ec91ffe7.png)
▼ 並且我在 home 底下開了個 docker 專用的目錄避免混在一起,你可以選擇你喜歡的地方
- docker 資料根目錄(home 底下):~/docker
- 因此類推 mySQL docker 綁定目錄為:~/docker/mysql
- 直接換成絕對路徑大概是(可能依據儲存區不同會改變):
/volume1/homes/Gary/docker/mysql
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-9b2d380619477fc818fb125b0bd3731f.png)
1.2 Go 備份排程
排程很簡單,搭配 Linux 環境中 crontab 就可以簡單實現了,指令範例為每天 00:00 備份:
$ crontab -l
0 0 * * * /usr/local/bin/gobackup perform >> ~/.gobackup/gobackup.log
Linux 主機端的設定至此就好了,如果你只是需要定期備份檔案至 NAS 你可以做到這邊就好。
當然以此類推你也可以透過這套機制當作 Time Machine 定時備份你 Linux 環境中的各種服務,當然設定檔需要依照需求小改一下
2. 於 Synology NAS 上建立 Docker 備援站點
▼ Synology NAS 套件中心很多套件可以玩,選擇 Synology Intel x64 NAS 機種的一大原因就是有彈性超大的 Docker,透過 Docker 可以佈屬各種你需要的服務,有如 PHP,Apahce,nodeJS,mySQL 等常見的 Linux 服務都是小 case,甚至可以將各個 container 容器連結在一起,組合出你符合你自訂需求的服務。當然 Synology 套件中心中也有獨立的 Wordpress 套件 ,但為了還原及指令操作的方便,相對來講使用 Docker 會更簡單,更新及維護上也更好操作,首先我們先至套件中心下載 docker 並設定好
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-a2d0de7bfd7ef8cf1d16d8b3e1a472e9.png)
這次 Wordpress 範例我們需要的東西為 LAMP 環境:1.mySQL (可依照你自己偏好使用的資料庫去更改),2.Apache / PHP 7 環境,這部分我們可以簡化成直接使用一個 Wordpress 的映像檔(多懶人啊!)
▼ 首先於倉庫伺服器下載 mySQL 映像檔,我選擇的版本是 v5 的最新版 5.7.9(與我 Linux 環境相同)
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-bd6cd255fb2ae41c7ea8ffc773eaf14e.png)
▼ 再來也在倉庫伺服器下載 Wordpress 映像檔,這裡面就包含 PHP 7.3,Apache 2 大全套了,用 nginx 的人可能要查一下有沒有其他映像檔是這樣佈屬的(我看下圖 trafex/wordpress 應該是)
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-e8f34c028363e9d6110b2e1c0dcf458d.png)
2.2 佈屬 mySQL Docker Container 容器
這個段落的教學有個很簡單的懶人包,你可以 ssh 進入 NAS 輸入以下指令(中文註解一樣改成你需要的,另外 SSH 帳號需有 Docker 權限)
docker 路徑範例:/volume1/homes/Gary/docker/mysql
docker run --restart=always --name mysql-wordpress \
-d -v 你NAS中要放置Docker資料之路徑:/var/lib/mysql \
-e 'MYSQL_ROOT_PASSWORD=MYSQL_ROOT_密碼' \
-e 'MYSQL_DATABASE=WP_資料庫名稱' \
-e 'MYSQL_USER=WP_資料庫使用者名稱' \
-e 'MYSQL_PASSWORD=WP_資料庫使用者密碼' \
mysql:5.7.9
Docker GUI 設置教學
▼ 當然你也可以透過簡單的 GUI 來操作,先下載映像檔後佈屬成容器
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-6b6a5440820a3dca6a810d4fe8229eb3.png)
▼ 如果你需要不中斷常駐服務,就將自動重啟勾起來
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-32dd81d80c5c6034febb6df977040d64.png)
▼ 主要需要設定的有兩個地方,一個是掛載路徑 var/lib/mysql 要指向 NAS 資料夾 ~/docker/mysql
另外, Docker 綁定的 NAS 資料夾不能先放東西
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-a3acedda6b70d3c629cd45b54a9306fd.png)
▼ 在環境設定部分要設定這幾項資料,在初始化後才會成功設置好對應的資料表與帳密,WP mySQL 使用者帳密可以參考你 Wordpress 資料夾底下的 wp-config.php 設定
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-89eb8df8b7818d43990536f389c840f9.png)
▼ 如果 Docker 設定時環境參數沒有成功,導致沒有出現對應的資料庫,也可以透過手動操作來增加
## 進入 mysql 後指令
mysql -u root -p
# 新增使用者,設定密碼
CREATE USER 'my_user'@'localhost' IDENTIFIED BY 'my_password';
# 設定使用者權限
GRANT ALL PRIVILEGES ON my_db.* TO 'my_user'@'localhost';
FLUSH PRIVILEGES;
▼ 成功之後,照理說你用 mysql -u 使用者名稱 -p 登入,輸入 show databases; 就會出現你指定的資料表名稱(此時是空的資料表)
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-47d672258a61f9fbe91e8e9a10db6e3d.png)
2.3 mySQL Docker Container 還原資料庫
準備項目
▼ 如果懶得輸入密碼,可以準備一個 my.cnf 內容格式如下,並複製至 ~/.my,cnf
[client]
user=USERNAME
password=THISISAPASSWORD
▼ 再將原本 database.sql 備份檔和 上面的 .cnf 檔案丟進
`~/docker/mysql
資料夾中,方便等等直接存取還原![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-3e4f3fa31189e84ea888057d799e831f.png)
▼ 還原資料庫部分必須進入 Docker Container 的環境中以 bash 操作,你可以透過 SSH 進入再 docker exec 切換到容器環境中操作,但這方法比較困難:
$ docker container ls #拿取 CONTAINERID
$ docker exec -it CONTAINERID bash
▼ 或者 Synology Docker 介面中也簡單整合好了這部分,讓一般人可以更簡單的去使用他,只需要切換到終端機 -> 新增按下後切換到 bash 的項目,就可以直接在 bash 環境中操作了
然後輸入以下指令還原資料庫備份檔 .sql(也就是我們剛剛看到的檔案名稱)
mysql -u root -p 資料庫名稱 < /var/lib/mysql/資料庫備份檔.sql
例如:mysql wordpress_2019 < /var/lib/mysql/wordpress_2019.sql
如果沒出現什麼錯誤就是成功匯入了
2.4 Wordpress Docker Container 設定並還原
相對 mySQL 而言,Wordpress 部分設定簡單很多,只要檔案路徑正確綁定進入就可
Wordpress 備份檔根目錄我放在:
~/backup/wordpress/var/www/wordpress
▼ 一樣先從映像檔選擇 Wordpress 佈屬
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-f19ef643d3a2af2ac443e993787b9c57.png)
▼ 在儲存空間中綁定 WP 備份資料夾路徑(
~/backup/wordpress/var/www/wordpress
)與 apache 預設路徑 /var/www/html
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-3ab69ec58721c950174350eb5f7c8c21.png)
▼ 網路部分則是使用 bridge 模式將容器的 port 80 (http) 綁到 NAS 的 port 80,NAS 防火牆和家用 Router 記得開,如果需要 https 則是多開 443
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-d19f5dbd7bcde593ec043fd712111c13.png)
這樣就完成了
▼ 整個完成後 docker 會有這兩個容器的服務,需要的 RAM 和 CPU 耗量可以參考(不過我轉移的資料庫有 600M 還蠻大的...),Wordpress 本身則是吃不多記憶體,還是建議記憶體 8G 機種再來嘗試會比較妥
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-854ecd44a4ab6afe9dc4a6847b9ad4a9.png)
▼ 如此一來,訪問 NAS domain的相對應 port(例如我自己是用 8001)就可以直接看到整個網站了!雖然 NAS 使用低功耗 CPU,但訪問起來的速度也不慢呢
當主站 xxx.com 掛掉之後,這時我只要將 Cloudfalre DNS 代管中 xxx.com 的 A Record 切成 NAS 就可以直接訪問了
亦或者我也可以用 sub domain 次級域名將這個網站常時透過 Docker 掛著,甚至透過 Docker 和 GoBackup 套件的特性,我可以在 NAS Docker 上開發或者編輯我的 Wordpress,設定反向備份,當我覺得我編輯的工作狀態可以發佈時,再逕行發佈內容至 Linux 主站上,如此一來也可以稍微做到版本控管與開發機和展示機分離的兩個工作區
![點我看大圖 [教學] Wordpress / Linux 網站服務不中斷! Synology NAS Docker + GoBackup 備份術搭建備援站點](https://attach.mobile01.com/attach/202006/mobile01-f9bcf8b92762c595e42780f7d1b0867b.png)
Nice to have?
當然除了以上這些還想了一些可以改善更好的地方,礙於時間還來不及測完,會整理後發佈在自己的網站上,也歡迎大家分享一些可以改善的技術細節!- HTTPS 憑證相容這個教學剛剛為止預設都是使用 http port 80,如果需要匯入 https 憑證,需要額外拿一些 Letsencrypt 憑證與設定檔,並修改 Wordpress Container 內的 Apache 設定步驟略顯複雜,整理教學會放在個人網站:https://garynil.tw
- 自動偵測 domain 網域服務下線切換網域 A record 指向
- 每日排程更新 Docker 內容要搭配 crontab 來達成,教學也是整理號後放在個人網站:https://garynil.tw
- 備份通知:Backup GEM 有這部分的設定,但 GoBackup 缺少這些略顯可惜