找回密碼
 立即註冊
惟家LINE群QRCODE
    查看: 2|回覆: 0

    在群暉上用 Docker Compose 跑智能家居全家桶(完整設定檔)

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005752
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    NAS 開著也是開著,拿來跑智能家居服務很划算。

    這篇給一份完整的 compose 檔,以及每個服務的注意事項。



    先講架構決定

    HA 要不要跑在 NAS 上?

    我的建議是不要,理由:


    • Docker 版的 HA 不能用附加元件(Add-on)
    • NAS 更新或重開的時候,整個智能家居會停擺
    • USB 直通(Zigbee 棒)在群暉上比較麻煩


    比較好的分工


    • HA 跑在獨立的小主機(HAOS,完整功能)
    • NAS 跑「支援性服務」:MQTT、Frigate、InfluxDB、Grafana、備份


    但如果你就是想省一台機器,Docker 版的 HA 也能用,
    只是要接受上面那些限制。

    群暉的前置設定

    1. 安裝 Container Manager(舊版叫 Docker)

    套件中心 → 搜尋 Container Manager → 安裝

    2. 建立資料夾結構
    1. /volume1/docker/
    2. ├── homeassistant/
    3. │   └── config/
    4. ├── mosquitto/
    5. │   ├── config/
    6. │   ├── data/
    7. │   └── log/
    8. ├── zigbee2mqtt/
    9. │   └── data/
    10. ├── frigate/
    11. │   ├── config/
    12. │   └── media/
    13. ├── influxdb/
    14. │   ├── data/
    15. │   └── config/
    16. ├── grafana/
    17. │   └── data/
    18. └── docker-compose.yml
    複製代碼

    3. 開啟 SSH(控制台 → 終端機和 SNMP → 啟用 SSH)

    完整的 docker-compose.yml
    1. services:
    2.   # ---------------------------------------------- MQTT Broker
    3.   mosquitto:
    4.     image: eclipse-mosquitto:2
    5.     container_name: mosquitto
    6.     restart: unless-stopped
    7.     ports:
    8.       - "1883:1883"
    9.       - "9001:9001"
    10.     volumes:
    11.       - /volume1/docker/mosquitto/config:/mosquitto/config
    12.       - /volume1/docker/mosquitto/data:/mosquitto/data
    13.       - /volume1/docker/mosquitto/log:/mosquitto/log
    14.     environment:
    15.       - TZ=Asia/Taipei
    16.   # ---------------------------------------------- Zigbee2MQTT
    17.   zigbee2mqtt:
    18.     image: koenkk/zigbee2mqtt:latest
    19.     container_name: zigbee2mqtt
    20.     restart: unless-stopped
    21.     depends_on:
    22.       - mosquitto
    23.     ports:
    24.       - "8080:8080"
    25.     volumes:
    26.       - /volume1/docker/zigbee2mqtt/data:/app/data
    27.       - /run/udev:/run/udev:ro
    28.     devices:
    29.       # 用 by-id 而不是 /dev/ttyUSB0,拔插之後才不會跑掉
    30.       - /dev/serial/by-id/usb-XXXX:/dev/ttyACM0
    31.     environment:
    32.       - TZ=Asia/Taipei
    33.   # ---------------------------------------------- InfluxDB
    34.   influxdb:
    35.     image: influxdb:2
    36.     container_name: influxdb
    37.     restart: unless-stopped
    38.     ports:
    39.       - "8086:8086"
    40.     volumes:
    41.       - /volume1/docker/influxdb/data:/var/lib/influxdb2
    42.       - /volume1/docker/influxdb/config:/etc/influxdb2
    43.     environment:
    44.       - TZ=Asia/Taipei
    45.       - DOCKER_INFLUXDB_INIT_MODE=setup
    46.       - DOCKER_INFLUXDB_INIT_USERNAME=admin
    47.       - DOCKER_INFLUXDB_INIT_PASSWORD_FILE=/run/secrets/influx_pw
    48.       - DOCKER_INFLUXDB_INIT_ORG=home
    49.       - DOCKER_INFLUXDB_INIT_BUCKET=homeassistant
    50.       - DOCKER_INFLUXDB_INIT_RETENTION=520w
    51.     secrets:
    52.       - influx_pw
    53.   # ---------------------------------------------- Grafana
    54.   grafana:
    55.     image: grafana/grafana-oss:latest
    56.     container_name: grafana
    57.     restart: unless-stopped
    58.     depends_on:
    59.       - influxdb
    60.     ports:
    61.       - "3000:3000"
    62.     volumes:
    63.       - /volume1/docker/grafana/data:/var/lib/grafana
    64.     environment:
    65.       - TZ=Asia/Taipei
    66.       - GF_SECURITY_ADMIN_PASSWORD__FILE=/run/secrets/grafana_pw
    67.       - GF_USERS_ALLOW_SIGN_UP=false
    68.     secrets:
    69.       - grafana_pw
    70. secrets:
    71.   influx_pw:
    72.     file: ./secrets/influx_pw.txt
    73.   grafana_pw:
    74.     file: ./secrets/grafana_pw.txt
    複製代碼

    密碼用 secrets 而不是直接寫在環境變數裡 ——
    環境變數在 docker inspect 裡看得到,而且會進 compose 檔的版控。



    群暉特有的五個坑

    坑一:USB 裝置名稱會變

    /dev/ttyUSB0 的話,拔插或重開之後可能變成 ttyUSB1。

    正確做法
    1. ls -l /dev/serial/by-id/
    複製代碼

    會看到類似:
    1. usb-ITead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_xxxx-if00-port0
    複製代碼

    用這個完整路徑,它是綁在裝置本身的,不會變。

    坑二:群暉的 DSM 更新會重啟 Docker

    所有容器都會停一下。


    • 一定要設 restart: unless-stopped
    • 關鍵服務(MQTT)不要只放 NAS,不然 NAS 一重開,
        所有 Zigbee 裝置在 HA 裡都會變成不可用


    我自己就踩過這個:NAS 每週自動維護重開一次,
    那段時間家裡的自動化全部失效,查了好久才發現關聯。

    後來把 MQTT 搬到 HA 主機上就解決了。

    坑三:權限問題

    群暉的共用資料夾權限跟一般 Linux 不同。

    容器裡的使用者可能沒有寫入權限,症狀是容器一直重啟。

    解法
    1. # 在 compose 裡指定 UID/GID
    2.     user: "1026:100"       # 用你的群暉使用者 ID
    複製代碼

    查自己的 ID:
    1. id 你的帳號
    複製代碼

    坑四:Container Manager 的專案功能會改寫你的 compose

    用 DSM 介面的「專案」功能匯入 compose 檔時,
    它可能會自動加東西或改格式

    我的做法是用 SSH 直接跑
    1. cd /volume1/docker
    2. sudo docker compose up -d
    3. sudo docker compose logs -f
    複製代碼

    這樣 compose 檔完全由你控制。

    坑五:通訊埠衝突

    群暉本身佔用了不少埠:


    • 5000 / 5001 —— DSM
    • 80 / 443 —— Web Station
    • 8080 —— 有時候被其他套件佔用


    衝突的話容器會起不來,日誌會說 port is already allocated。
    1. # 看誰佔用了
    2. sudo netstat -tulpn | grep 8080
    複製代碼

    Mosquitto 的必要設定

    預設的 eclipse-mosquitto:2 不允許匿名連線
    沒有設定檔的話會直接拒絕所有連線。

    建立 /volume1/docker/mosquitto/config/mosquitto.conf
    1. listener 1883
    2. protocol mqtt
    3. listener 9001
    4. protocol websockets
    5. persistence true
    6. persistence_location /mosquitto/data/
    7. log_dest file /mosquitto/log/mosquitto.log
    8. allow_anonymous false
    9. password_file /mosquitto/config/passwd
    複製代碼

    建立密碼檔
    1. sudo docker exec -it mosquitto sh
    2. mosquitto_passwd -c /mosquitto/config/passwd hauser
    3. # 輸入密碼
    4. mosquitto_passwd -b /mosquitto/config/passwd z2m 另一組密碼
    5. exit
    6. sudo docker restart mosquitto
    複製代碼

    每個客戶端用不同帳號(HA 一個、Z2M 一個),
    這樣出問題可以單獨撤銷。

    備份

    compose 檔和設定檔一定要備份。
    1. #!/bin/bash
    2. # /volume1/docker/backup.sh
    3. DEST=/volume1/backup/docker-$(date +%F)
    4. mkdir -p "$DEST"
    5. # 只備份設定,不備份資料(資料太大而且可以重建)
    6. tar czf "$DEST/configs.tar.gz" \
    7.   -C /volume1/docker \
    8.   docker-compose.yml \
    9.   mosquitto/config \
    10.   zigbee2mqtt/data/configuration.yaml \
    11.   frigate/config
    12. # 保留最近 14 份
    13. ls -1dt /volume1/backup/docker-* | tail -n +15 | xargs rm -rf
    複製代碼

    zigbee2mqtt/data 裡的 coordinator_backup.json 和 database.db 特別重要 ——
    沒有它們的話,Zigbee 網路要全部重新配對。

    ---

    最後一個建議:一次只加一個服務。

    我第一次是把 compose 檔一口氣寫完然後 up -d,
    結果三個服務起不來,而且互相影響,debug 了一整晚。

    一個一個加,每個都確認能跑、能連、資料有存下來,再加下一個。
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

    Archiver|手機版|惟家的智能論壇

    GMT+8, 2026-9-24 11:29 , Processed in 0.084529 second(s), 24 queries .

    快速回覆 返回頂部 返回列表