圖樂資訊
網站更新前,我如何備份 Docker 程式與 MySQL 資料庫
發布時間:2026/7/16
作者:沈嘉怡
在替 Gotule 安裝普通文章模式前,我先分別備份 VPS 上的網站程式與 MySQL 資料庫。本文記錄建立獨立備份目錄、排除可重新產生的依賴檔案、匯出資料庫,以及確認兩份備份可以正常使用的完整過程。
為什麼網站更新前需要備份?
最近我替自己的 Gotule 網站增加普通文章模式。這次修改不只調整網頁畫面,還新增了資料庫欄位、固定文章網址和後臺內容型別選項。
只要更新同時涉及程式與資料庫,就不能只把更新檔案覆蓋上去。萬一新的程式無法建立、資料庫升級出錯,或者新舊欄位不相容,網站可能無法正常啟動。
所以我在安裝更新前,先做了兩份不同的備份:
- 網站程式備份。
- MySQL 資料庫備份。
這兩份備份不能互相取代。程式備份儲存網頁、伺服器和設定檔案;資料庫備份則儲存文章、分類、圖片資料、網址和發布狀態。
如果只有程式備份,即使網站可以重新啟動,也不一定能找回資料庫中的文章。如果只有資料庫備份,遇到程式更新失敗時,也無法快速恢復原本正常運作的版本。
先建立獨立備份目錄
我先登入 VPS,進入網站所在的目錄,再建立一個專門儲存這次更新備份的資料夾。
備份資料夾的名稱包含日期和時間,例如:
/root/gotule-backups/20260716-034559
使用日期和時間命名有幾個好處:
- 可以知道備份是在什麼時候建立的。
- 多次更新時不會覆蓋舊備份。
- 發生問題時比較容易找到更新前的版本。
- 程式和資料庫可以儲存在同一批次目錄中。
建立目錄後,我先讓終端顯示完整路徑,並把它記錄下來。之後產生的程式壓縮檔和資料庫匯出檔,都必須出現在這個目錄裡。
我沒有直接把備份放進網站目錄,因為網站重新建立或覆蓋時,目錄中的檔案可能一起被修改。把備份儲存在網站目錄以外,可以降低誤刪或被更新包覆蓋的風險。
備份網站程式,但排除可重新產生的檔案
建立備份目錄後,我把 VPS 上的網站程式壓縮成一個 tar.gz 檔案。
網站專案裡除了我真正需要儲存的程式碼,也有一些可以重新安裝或重新建立的內容,例如:
node_modulesdist- 暫時產生的建置檔案
node_modules 包含大量程式依賴,檔案數量可能非常多。只要專案中的 package.json 和鎖定檔仍然存在,通常可以重新安裝這些依賴。
dist 則是網站建置後產生的結果。原始程式和依賴完整時,也可以重新建立。
因此,我在壓縮程式時排除這些可重新產生的目錄,避免備份變得過大,也縮短建立與還原備份所需的時間。
但我沒有排除網站真正需要的原始程式、設定結構、資料庫遷移檔案和 Docker Compose 設定。
備份完成後,我沒有隻看終端是否出現錯誤,而是再次檢查壓縮檔是否存在以及檔案大小。
最後產生的網站程式備份約為:
312MB
這個檔案儲存於:
/root/gotule-backups/20260716-034559/source-code.tar.gz
檔案存在而且大小不是零,代表壓縮程式確實產生了備份。不過,這只能證明檔案已經建立,不能完全保證裡面的內容一定能成功還原。
更穩妥的做法是定期檢視壓縮檔清單,或者在另一個測試目錄中嘗試解壓縮。這樣才能提前發現壓縮檔損壞或排除規則設定錯誤的問題。
再備份 Docker 裡的 MySQL 資料庫
完成網站程式備份後,我接著處理 MySQL 資料庫。
我的網站使用 Docker Compose 執行應用程式和 MySQL。資料庫不是普通的程式檔案,不能只把網站目錄壓縮起來就算完成備份。
我使用 MySQL 的資料匯出工具,從正在運作的資料庫容器中匯出完整資料,並把結果寫入同一個備份目錄。
匯出內容不只包含文章資料,也包括資料表結構、索引,以及網站運作所需的其他資料庫內容。
為了避免在終端指令中直接寫出資料庫密碼,我使用容器裡原本設定的環境變數完成驗證。這樣不需要把密碼顯示在指令或截圖中。
資料庫匯出完成後,我再次檢查檔案是否存在和大小是否正常。
最後產生的資料庫備份約為:
4.7MB
檔案位置是:
/root/gotule-backups/20260716-034559/database.sql
網站程式備份約為312MB,而資料庫只有約4.7MB,兩者大小差很多是正常的。
程式備份包含網站原始碼和大量專案檔案;資料庫備份主要是文字資料、資料表結構和記錄。不能因為資料庫檔案比較小,就認為它不重要。
確認備份後才開始更新
確認兩個檔案都存在後,我才開始解壓縮更新包、執行資料庫升級和重新建立 Docker 容器。
這次更新後來真的遇到建置失敗,原因是專案缺少 opencc-js 依賴。幸好原本的網站容器仍然正常運作,而且更新前已經完成程式和資料庫備份,所以我可以慢慢檢查問題,不需要在沒有退路的情況下不斷嘗試。
修復依賴並重新建立容器後,我繼續檢查:
- 應用程式容器是否正常啟動。
- MySQL 容器是否保持健康。
- 網站首頁和文章頁能否開啟。
- 舊文章網址能否正確跳轉。
- 普通文章和舊圖集能否分別正常顯示。
只有這些專案都通過,我才把這次更新視為完成。
我從這次備份學到的事情
以前我可能會把網站目錄複製一份,就認為已經完成備份。這次實際操作後,我整理出幾個之後會繼續遵守的做法:
- 更新前同時備份程式和資料庫。
- 備份放在網站目錄以外。
- 每次使用日期和時間建立新目錄。
- 排除可以重新安裝或重新建置的依賴。
- 建立後檢查檔案是否存在以及大小是否正常。
- 不在公開截圖或指令中顯示資料庫密碼。
- 確認備份完成後,才執行資料庫遷移和容器重建。
- 更新成功後仍要測試首頁、新文章、舊網址和舊內容。
備份不能保證更新一定成功,但它能讓更新失敗時仍然有恢復原本網站的機會。
對我這種一邊學習、一邊維護自己網站的人來說,先保留可以回到原狀的版本,比急著完成部署更重要。