|
|
用介面一個一個開容器,改設定要翻好幾層,換機器要全部重來。這一篇給一份可以直接用的完整 compose 環境:目錄怎麼排、密碼放哪裡、每一個服務怎麼驗證它真的起來了,以及更新與回滾的流程。

這一篇做完你會有什麼
- 一個資料夾,裡面是整套智能家居後端的完整定義
- 複製那個資料夾到新機器,一行指令就重建整套環境
- 一套更新與回滾的流程,改壞了回得去
先講兩個會讓舊教學出錯的變化
變化一:`version:` 這個鍵已經廢除了。
以前的 compose 檔第一行都是 `version: '3.8'`。Compose v2 從一開始就忽略它,2.25.0 版起還會印出警告:
- WARN[0000] compose.yaml: the attribute `version` is obsolete,
- it will be ignored, please remove it to avoid potential confusion
複製代碼
這個警告本身無害,但它會在你每一次下指令時出現,久了就會開始忽略所有警告 —— 那才是真正的成本。直接把那一行刪掉。
變化二:`docker-compose`(有連字號)和 `docker compose`(空白)是兩個東西。
有連字號的是 V1,安全更新已於 2021 年 7 月結束。現在一律用空白版的 `docker compose`。
怎麼確認你用的是哪個:
你會看到:Docker Compose version v2.40.0 之類的字樣。
說 command not found → 你的 Docker 太舊,或是只裝了 V1。更新 Docker,或裝 compose 外掛。
步驟 1:先決定目錄結構
這一步決定之後三年的維護體驗,而且很難改。 用這個結構:
- /volume1/docker/smarthome/ ← 整套的根目錄
- ├── compose.yaml ← 所有服務的定義
- ├── .env ← 密碼與會變的值(不要進版控)
- ├── .gitignore
- ├── mosquitto/
- │ ├── config/
- │ │ ├── mosquitto.conf
- │ │ └── passwd
- │ ├── data/ ← 容器產生的,不要手動改
- │ └── log/
- ├── zigbee2mqtt/
- │ └── data/
- │ └── configuration.yaml
- ├── influxdb/
- │ ├── data/
- │ └── config/
- └── grafana/
複製代碼
三個原則:
- 每個服務一個資料夾,跟服務名稱一樣。要看某個服務的資料時不用猜
- 設定檔跟資料分開(`config/` 與 `data/`)。備份時可以只備設定
- compose.yaml 和 .env 放在最上層。所有指令都在這個目錄下跑
建立:
- cd /volume1/docker # Synology 的 docker 共用資料夾
- mkdir -p smarthome/{mosquitto/{config,data,log},zigbee2mqtt/data,influxdb/{data,config},grafana}
- cd smarthome
複製代碼
你會看到:`ls -R` 會印出上面那棵樹(現在還沒有檔案)。
步驟 2:把密碼抽到 .env
不要把密碼寫在 compose.yaml 裡。 那個檔案你會想放進版控、會想貼到論壇問問題、會想複製給別人參考。
建立 .env:
- # .env —— 這個檔案不要進版控
- TZ=Asia/Taipei
- PUID=1000
- PGID=1000
- MQTT_USER=ha
- MQTT_PASS=換成一組很長的隨機密碼
- INFLUX_USER=admin
- INFLUX_PASS=換成另一組很長的隨機密碼
- INFLUX_ORG=home
- INFLUX_BUCKET=homeassistant
- GRAFANA_PASS=再換一組
複製代碼
建立 .gitignore:
- .env
- */data/
- */log/
- mosquitto/config/passwd
- grafana/
複製代碼
PUID / PGID 怎麼查:
你會看到:uid=1000(charles) gid=1000(users) ...。把那兩個數字填進 .env。
設錯的症狀:容器起得來但寫不了檔,日誌裡是 Permission denied。
|
|