
一份 Docker Compose 可唔可以重建成部 home server?單一指令仍然欠資料備份
Compose 管到容器架構,異機復原仲要補齊資料、密碼同還原測試
XDA 作者 Yash Patel 將 Home Assistant、Immich 同 Nextcloud,連同 PostgreSQL、MariaDB、Redis 等配套服務,集中放入一份 Docker Compose 設定。佢測試拉取新映像再強制重建容器,原有設定同資料仍然保留,日常維護確係方便咗。不過呢次測試沿用同一部機上面嘅 volumes,所以佢證明到嘅範圍,其實係重建容器架構,未去到整部 home server 災難復原。
Services:份檔案其實係部機嘅裝配圖
services 會記低每個 app 用咩映像、開邊個 port、掛載咩路徑、點樣重啟,同邊啲資料庫有依賴。換句話講,只要新機已裝 Docker,相關映像仲拉得到,Compose 就可以按同一張裝配圖砌返批容器。呢個做法好過靠腦記低十幾條指令,亦方便將 YAML 放入版本管理。不過映像 tag 如果只寫 latest、release 或其他會郁嘅標籤,幾個月後再拉取,攞到嘅版本未必同今日一樣;想復原結果可預計,應該記錄清楚版本,升級前亦要先睇各服務嘅遷移要求。

圖片:Docker
Networks:全部服務放埋一齊,界線要自己畫
Compose 就算冇明寫 networks,都會建立預設網絡,入面嘅容器可以用 service 名互相搵到。細規模測試夠用,但相片、檔案、智能家居同幾個資料庫全放喺同一個網絡,任何一個容器出事,橫向接觸其他服務嘅範圍都會闊咗。較穩陣嘅寫法係拆開前端、資料庫同內部服務網絡,只畀真係要溝通嘅容器加入;對外 port 亦應該開得愈少愈好。服務多起上嚟,按功能拆成幾份 Compose 再用 include 或多檔合併,通常易睇過一份愈寫愈長嘅大檔。
Volumes:識得掛載,唔代表入面有舊資料
原文重建後資料仍然存在,關鍵係 named volumes 同 Home Assistant 嘅 bind mount 冇俾刪走。Compose 可以喺 volume 唔存在時建立一個新 volume,但嗰只係空殼;新硬碟上面執行同一指令,Immich 相片、Nextcloud 檔案、資料庫內容同 Home Assistant 設定唔會自己返嚟。搬機前要逐項列出資料實際喺邊,包括 named volumes、host 路徑、外置儲存同資料庫。備份亦要離開原本嗰隻碟,否則硬碟一死,容器同所謂持久資料會一齊消失。
環境變數同 secrets:用 .env 係方便,不過唔好連密碼一齊提交
作者用 .env 放資料庫同管理員密碼,Compose 亦會代入相關變數,做法簡單直接。不過 .env 仍然係普通文字檔,誤傳去 Git、同步空間或者除錯紀錄,就有機會洩漏憑證。Docker 官方建議敏感資料用 secrets,按服務授權,再以檔案形式掛入容器;當然,原始 secret 檔本身仍要安全保存。異機復原時,Compose、非敏感設定、secrets 同檔案權限要一套過準備,亦要確認新機嘅 UID、GID 同掛載路徑一致,否則容器起到都可能讀唔到資料。
Healthcheck:容器顯示 running,個 app 未必準備好
原文主要靠 depends_on 排先後,但短寫法只保證依賴容器先啟動,唔保證資料庫已經可以接收連線。Docker 官方文件講得好清楚:要配合 healthcheck 同 condition: service_healthy,Compose 先會等資料庫健康再開上層 app。對 Immich、Nextcloud 呢類一開機就要連資料庫嘅服務,呢步可以減少重建後反覆 crash 或連線失敗。健康檢查亦要揀真正反映服務狀態嘅指令,淨係睇 process 仲喺度,實際幫助有限。
單一 command 可以做幾多,個分界要講清楚
作者用嘅指令會先拉取映像,再強制重建整個 stack,同時清走已經唔喺設定內嘅孤兒容器。日常更新幾爽快,不過原文兩段命令以分號相連,前面拉取失敗,後面仍可繼續執行;正式維護最好先檢查設定、備份同映像版本,確認冇問題先重建。更重要係,Compose 檔、環境設定同資料備份要分開看待:前兩者重現服務結構,備份先帶得返相片、檔案、資料庫同自動化設定。
真正可搬機,要做一次空機還原
一套實用方案至少要備份 Compose、相關設定目錄、secrets、每個 persistent volume,資料庫亦要有狀態一致嘅 dump 或快照;備份完成後仲要有另一份離機副本。最有效嘅驗證方法係搵部空機或臨時 VM,按文件由零開始,先還原資料,再啟動 stack,逐個 app 登入檢查相片、檔案同設定。原文個做法適合整理 home server,亦值得跟,但未做過異機還原之前,「一條指令重建成部機」仍然只涵蓋容器嗰半邊。
參考來源
- XDA Developers — I run my entire home server in one Docker Compose file, and rebuilding it takes a single command — original report
- Docker Compose application model — 核對 services、networks、volumes、configs 同 secrets 點樣組成 Compose 應用
- Define and manage volumes in Docker Compose — 核對 Compose 建立同重用 named volumes 嘅行為
- Volumes:Back up, restore, or migrate data volumes — Docker 官方備份、還原同搬移 volume 資料方法
- Manage secrets securely in Docker Compose — 核對環境變數洩漏風險、secrets 授權同掛載方式
- Control startup and shutdown order in Compose — 核對 depends_on、healthcheck 同 service_healthy 嘅分別
- Use multiple Compose files — 補充大型 stack 拆檔、合併、extend 同 include 嘅取捨
本文根據原文及公開資料整理;資料有出入時,以原文及官方資料為準。







