圖樂資訊

網站更新前,我如何備份 Docker 程式與 MySQL 資料庫

發布時間:2026/7/16

作者:沈嘉怡

在替 Gotule 安裝普通文章模式前,我先分別備份 VPS 上的網站程式與 MySQL 資料庫。本文記錄建立獨立備份目錄、排除可重新產生的依賴檔案、匯出資料庫,以及確認兩份備份可以正常使用的完整過程。

網站更新前,我如何備份 Docker 程式與 MySQL 資料庫-圖片1
在 VPS 建立具有日期和時間的獨立網站備份目錄

為什麼網站更新前需要備份?

最近我替自己的 Gotule 網站增加普通文章模式。這次修改不只調整網頁畫面,還新增了資料庫欄位、固定文章網址和後臺內容型別選項。

只要更新同時涉及程式與資料庫,就不能只把更新檔案覆蓋上去。萬一新的程式無法建立、資料庫升級出錯,或者新舊欄位不相容,網站可能無法正常啟動。

所以我在安裝更新前,先做了兩份不同的備份:

  1. 網站程式備份。
  2. MySQL 資料庫備份。

這兩份備份不能互相取代。程式備份儲存網頁、伺服器和設定檔案;資料庫備份則儲存文章、分類、圖片資料、網址和發布狀態。

如果只有程式備份,即使網站可以重新啟動,也不一定能找回資料庫中的文章。如果只有資料庫備份,遇到程式更新失敗時,也無法快速恢復原本正常運作的版本。

先建立獨立備份目錄

我先登入 VPS,進入網站所在的目錄,再建立一個專門儲存這次更新備份的資料夾。

備份資料夾的名稱包含日期和時間,例如:

/root/gotule-backups/20260716-034559

使用日期和時間命名有幾個好處:

建立目錄後,我先讓終端顯示完整路徑,並把它記錄下來。之後產生的程式壓縮檔和資料庫匯出檔,都必須出現在這個目錄裡。

我沒有直接把備份放進網站目錄,因為網站重新建立或覆蓋時,目錄中的檔案可能一起被修改。把備份儲存在網站目錄以外,可以降低誤刪或被更新包覆蓋的風險。

完成網站程式備份後確認壓縮檔大小約為 312MB

備份網站程式,但排除可重新產生的檔案

建立備份目錄後,我把 VPS 上的網站程式壓縮成一個 tar.gz 檔案。

網站專案裡除了我真正需要儲存的程式碼,也有一些可以重新安裝或重新建立的內容,例如:

node_modules 包含大量程式依賴,檔案數量可能非常多。只要專案中的 package.json 和鎖定檔仍然存在,通常可以重新安裝這些依賴。

dist 則是網站建置後產生的結果。原始程式和依賴完整時,也可以重新建立。

因此,我在壓縮程式時排除這些可重新產生的目錄,避免備份變得過大,也縮短建立與還原備份所需的時間。

但我沒有排除網站真正需要的原始程式、設定結構、資料庫遷移檔案和 Docker Compose 設定。

備份完成後,我沒有隻看終端是否出現錯誤,而是再次檢查壓縮檔是否存在以及檔案大小。

最後產生的網站程式備份約為:

312MB

這個檔案儲存於:

/root/gotule-backups/20260716-034559/source-code.tar.gz

檔案存在而且大小不是零,代表壓縮程式確實產生了備份。不過,這只能證明檔案已經建立,不能完全保證裡面的內容一定能成功還原。

更穩妥的做法是定期檢視壓縮檔清單,或者在另一個測試目錄中嘗試解壓縮。這樣才能提前發現壓縮檔損壞或排除規則設定錯誤的問題。

從 Docker MySQL 容器匯出資料庫並確認備份大小約為 4.7MB

再備份 Docker 裡的 MySQL 資料庫

完成網站程式備份後,我接著處理 MySQL 資料庫。

我的網站使用 Docker Compose 執行應用程式和 MySQL。資料庫不是普通的程式檔案,不能只把網站目錄壓縮起來就算完成備份。

我使用 MySQL 的資料匯出工具,從正在運作的資料庫容器中匯出完整資料,並把結果寫入同一個備份目錄。

匯出內容不只包含文章資料,也包括資料表結構、索引,以及網站運作所需的其他資料庫內容。

為了避免在終端指令中直接寫出資料庫密碼,我使用容器裡原本設定的環境變數完成驗證。這樣不需要把密碼顯示在指令或截圖中。

資料庫匯出完成後,我再次檢查檔案是否存在和大小是否正常。

最後產生的資料庫備份約為:

4.7MB

檔案位置是:

/root/gotule-backups/20260716-034559/database.sql

網站程式備份約為312MB,而資料庫只有約4.7MB,兩者大小差很多是正常的。

程式備份包含網站原始碼和大量專案檔案;資料庫備份主要是文字資料、資料表結構和記錄。不能因為資料庫檔案比較小,就認為它不重要。

確認備份後才開始更新

確認兩個檔案都存在後,我才開始解壓縮更新包、執行資料庫升級和重新建立 Docker 容器。

這次更新後來真的遇到建置失敗,原因是專案缺少 opencc-js 依賴。幸好原本的網站容器仍然正常運作,而且更新前已經完成程式和資料庫備份,所以我可以慢慢檢查問題,不需要在沒有退路的情況下不斷嘗試。

修復依賴並重新建立容器後,我繼續檢查:

  1. 應用程式容器是否正常啟動。
  2. MySQL 容器是否保持健康。
  3. 網站首頁和文章頁能否開啟。
  4. 舊文章網址能否正確跳轉。
  5. 普通文章和舊圖集能否分別正常顯示。

只有這些專案都通過,我才把這次更新視為完成。

我從這次備份學到的事情

以前我可能會把網站目錄複製一份,就認為已經完成備份。這次實際操作後,我整理出幾個之後會繼續遵守的做法:

  1. 更新前同時備份程式和資料庫。
  2. 備份放在網站目錄以外。
  3. 每次使用日期和時間建立新目錄。
  4. 排除可以重新安裝或重新建置的依賴。
  5. 建立後檢查檔案是否存在以及大小是否正常。
  6. 不在公開截圖或指令中顯示資料庫密碼。
  7. 確認備份完成後,才執行資料庫遷移和容器重建。
  8. 更新成功後仍要測試首頁、新文章、舊網址和舊內容。

備份不能保證更新一定成功,但它能讓更新失敗時仍然有恢復原本網站的機會。

對我這種一邊學習、一邊維護自己網站的人來說,先保留可以回到原狀的版本,比急著完成部署更重要。