自架服務要跑得久,靠的不是安裝成功,而是日後好維護。

在 Synology NAS 上自架 Docker 服務,真正重要的不只是把容器跑起來,而是資料夾怎麼規劃、docker-compose.yml 怎麼寫、更新和備份怎麼維護。這篇整理一套可長期使用的 Compose 工作流。

Synology Docker Compose 完整教學:資料夾結構、更新與維護

在 Synology NAS 上跑 Docker,第一次最有成就感的時刻通常是容器成功啟動:網頁打開、服務能登入、資料看起來也正常。

但真正的考驗不是第一天,而是三個月後。

你會開始遇到這些問題:資料到底存在哪?容器更新會不會把設定洗掉?好幾個服務的 docker-compose.yml 放哪裡才不亂?要備份的是整個 container,還是只備份資料夾?服務壞了要怎麼重建?

這篇不是再教你安裝某一個服務,而是整理一套 Synology NAS 上可長期使用的 Docker Compose 工作流。之後不管你要架 Gitea、Vaultwarden、n8n、Jellyfin、Immich、Uptime Kuma,都可以用同一套邏輯管理。

Synology Docker Compose 工作流


🎯 這篇適合誰

你的情況 建議先看哪段
剛開始在 NAS 上玩 Docker 先搞懂 Compose 在管理什麼
已經裝了好幾個服務,資料夾開始亂 資料夾結構建議
想知道 compose 檔該怎麼寫 一份可重複使用的 compose 範本
害怕更新容器出事 更新與回復流程
想知道該備份哪些東西 備份重點

🧠 先搞懂 Compose 在管理什麼

Docker 本身可以用單一容器執行服務,但自架久了你會發現,只靠圖形介面點選設定很難長期維護。

Compose 的價值是把一個服務需要的設定寫成文字檔:

  • 使用哪個 image
  • container 名稱
  • 對外 port
  • volume 對應
  • 環境變數
  • restart policy
  • network

也就是說,docker-compose.yml 是你的服務說明書。

服務壞了、NAS 重裝了、容器刪掉了,只要資料夾還在,compose 檔還在,就能把服務重新建立起來。

這也是我建議所有 Synology Docker 服務都盡量用 Compose 管理的原因。

如果你還不熟 Docker 基本概念,可以先看 Docker 是什麼?NAS 新手入門完整解說

🗂️ 資料夾結構建議

我會建議把所有 Docker 服務集中放在一個共享資料夾,例如:

/volume1/docker/

每個服務一個獨立子資料夾:

/volume1/docker/
  gitea/
    docker-compose.yml
    data/
  vaultwarden/
    docker-compose.yml
    data/
  n8n/
    docker-compose.yml
    data/
  uptime-kuma/
    docker-compose.yml
    data/

這樣做有幾個好處:

  • 找服務很直覺
  • 備份範圍清楚
  • 搬家容易
  • 排錯時不用到處翻
  • 每個服務的資料互不干擾

不要把資料只留在 container 裡。

Container 可以刪、可以重建、可以更新。真正要保護的是 volume 對應出來的 data/config/db/ 這些資料夾。

🧾 一份可重複使用的 Compose 範本

以下是一個通用範本:

services:
  app:
    image: example/example:latest
    container_name: example
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - /volume1/docker/example/data:/data
    environment:
      - TZ=Asia/Taipei

幾個欄位可以固定理解:

欄位 用途
image 服務使用的映像檔
container_name 容器名稱,方便辨識
restart NAS 重開機後是否自動啟動
ports NAS port 對應到容器內部 port
volumes 把資料存到 NAS 實體資料夾
environment 時區、帳號、資料庫等設定

我通常會保留 restart: unless-stopped

意思是除非你手動停掉,否則 NAS 重開後會自動啟動服務。這對 Uptime Kuma、Vaultwarden、Gitea 這類常駐服務很合理。

🔌 Port 規劃

同一台 NAS 上,多個容器不能使用同一個外部 port。

例如:

ports:
  - "3000:3000"

左邊是 NAS 對外 port,右邊是容器內部 port。

如果兩個服務都想用 3000,就要改其中一個:

ports:
  - "3001:3000"

之後你可以用:

http://NAS-IP:3001

進入這個服務。

如果要掛網域和 HTTPS,可以再接 Nginx Proxy ManagerCloudflare Tunnel


🧱 Volume 是最重要的部分

自架服務最常見的災難,是更新或重建容器後資料不見。

通常原因不是 Docker 壞掉,而是 volume 沒有對應好。

正確做法:

volumes:
  - /volume1/docker/gitea/data:/data

這代表容器內的 /data 會存到 NAS 上的 /volume1/docker/gitea/data

只要這個資料夾還在,容器刪掉再重建,資料仍然會回來。

錯誤做法是完全不設定 volume,讓資料留在 container 內部。這種容器看起來能用,但一刪掉資料就跟著走。

🔐 權限與 UID/GID

有些 image 會要求設定使用者 ID,例如:

environment:
  - PUID=1026
  - PGID=100

或:

environment:
  - USER_UID=1026
  - USER_GID=100

這類設定是為了讓容器寫入 NAS 資料夾時,權限不會亂掉。

Synology 上常見的群組 ID 是 100,但不同帳號可能不同。你可以用 SSH 查詢:

id 使用者名稱

如果你不想碰 SSH,也可以先照該服務教學建議設定,之後遇到資料夾無法寫入,再回頭查權限。

🔁 更新與回復流程

更新容器前,不要直接按下去就算了。

比較穩的流程是:

  1. 先確認服務資料都存在 /volume1/docker/服務名稱/
  2. 備份該服務資料夾。
  3. 記下目前 image tag。
  4. 拉新版 image。
  5. 重新建立 container。
  6. 確認服務能登入、資料正常。

如果新版出問題,就把 image tag 改回舊版,再重建。

例如不要永遠只寫:

image: gitea/gitea:latest

重要服務可以改成固定版本:

image: gitea/gitea:1.22

latest 方便,但也比較不可控。密碼庫、Git、照片這種重要服務,我會偏向固定版本,等有空測試再升級。

🛡️ 備份重點

Docker 服務要備份的不是 container,而是三樣東西:

  • docker-compose.yml
  • volume 對應的資料夾
  • 服務內部匯出的設定或資料庫備份

例如 Gitea 至少要備:

/volume1/docker/gitea/docker-compose.yml
/volume1/docker/gitea/data/

Vaultwarden 至少要備:

/volume1/docker/vaultwarden/docker-compose.yml
/volume1/docker/vaultwarden/data/

可以用 Hyper Backup 完整教學 做版本備份,也可以用 RcloneCloudflare R2 做離站備份。


🧪 建議的服務維護節奏

如果你已經跑了很多 Docker 服務,可以用這個節奏維護:

每週:

  • 看 Uptime Kuma 有沒有異常
  • 確認重要服務能登入
  • 看 NAS 儲存空間是否快滿

每月:

  • 檢查服務是否有安全更新
  • 更新非核心服務
  • 確認備份任務有成功

每季:

  • 測試一次還原
  • 清理不用的 image
  • 檢查哪些服務其實沒在用

自架不是裝越多越好。

真正穩定的 NAS,是每個服務你都知道資料在哪、怎麼更新、怎麼還原。

📌 小結

Synology 上跑 Docker,最重要的不是學會某個服務的安裝按鈕,而是建立一套可重複的管理方式。

我的建議是:

  • 每個服務一個資料夾
  • 每個服務都保留 docker-compose.yml
  • 所有資料都用 volume 映射出來
  • 重要服務固定 image 版本
  • 更新前先備份
  • 定期測試還原

這樣之後你要架任何服務,都不是從零開始,而是在同一套工作流裡加一個新資料夾。


🔗 延伸閱讀

這篇有幫助嗎? 自架服務要跑得久,靠的不是安裝成功,而是日後好維護。