[2026-09-14] eagle: family/how-to/truenas-infrastructure.md family/how-to/truenas-rclone-backup.md family/plans/t610-backup-to-truenas.md family/plans/t610-home-automation.md

This commit is contained in:
Alexey Martemyanov
2026-09-14 20:44:26 +06:00
parent 902e037bc8
commit edbe9ef76a
4 changed files with 146 additions and 64 deletions
+80 -9
View File
@@ -138,10 +138,10 @@ TrueNAS использует **NFSv4 ACL**, а не стандартный POSIX
| watchtower | containrrr/watchtower:latest | — | авто-обновление образов |
| inpxer | ghcr.io/hedger/inpxer:latest | 18080 | books.mallexxx.duckdns.org |
| nodered | node-red:latest | 1880 | nodered.mallexxx.duckdns.org |
| zigbee2mqtt | koenkk/zigbee2mqtt:latest | — | — |
| mbusd | 3cky/mbusd:latest | | Modbus |
| modbus-bridge | modbus-bridge | — | — |
| cups-splix | cups-splix | | принтер |
| zigbee2mqtt | koenkk/zigbee2mqtt:latest | — | — (переехал на t610) |
| mbusd | 3cky/mbusd:latest | 502 | Modbus (переехал на t610) |
| modbus-bridge | modbus-bridge | — | — (переехал на t610) |
| cups-splix | cups-splix | 631 | принтер |
| xray-admin | ghcr.io/mhsanaei/3x-ui:latest | 2053 (панель), 10095 (vless-ws), 443 (sub) | vpn-panel.mallexxx.duckdns.org, vpn.mallexxx.duckdns.org |
| xray-reverse-portal | teddysun/xray:latest | 12345 (SOCKS), 12346 (VLESS-TCP REALITY interconn) | — (см. `personal/tech/xray-reverse-tunnel-kraken-truenas.md`) |
@@ -184,8 +184,8 @@ arr, caddy, cups, filebrowser, gitea, hermes, immich, inpx-web, inpxer, library,
1. **docker engine:** `systemctl enable --now docker` (после создания data-root, см. шапку). Проверка: `docker info | grep -iE "Server Version|Docker Root Dir"`.
2. **Инфраструктура/сеть:** mosquitto (MQTT) → zigbee2mqtt (нужен mosquitto) → nodered (MQTT) → caddy (прокси, тянет все домены) → vless-proxy (SOCKS5 для hermes).
3. **Умный дом:** mbusd (Modbus TCP:502) → modbus-bridge (через mbusd) → ha (homeassistant, нужен caddy для домена).
4. **Медиа/хранилище:** transmission (нужен caddy) → arr (radarr/sonarr/prowlarr) → inpxer (books), inpx-web, library → rclone, syncthing, filebrowser, webdav, gitea.
3. **Умный дом:****на TrueNAS БОЛЬШЕ НЕ ВОССТАНАВЛИВАТЬ** — переехало на t610 (см. «Декомиссия стека автоматизации»). mbusd (Modbus TCP:502) → modbus-bridge (через mbusd) → ha (homeassistant, нужен caddy для домена)**всё это теперь аддоны на `192.168.2.176`**.
4. **Медиа/хранилище:** transmission (нужен caddy) → arr (radarr/sonarr/prowlarr) → inpxer (books), inpx-web, library → rclone, syncthing, filebrowser, webdav, gitea. ⚠️ `inpxer`/`inpx-web`/`library` — на 2026-09-14 в циклическом краше (см. декомиссию).
5. **Сервисы/свои:** hermes-taiga (нужен vless-proxy), portainer, portainer-mcp, watchtower, cups, ser2net.
6. **Проверка:** `docker ps`. HA: `docker exec homeassistant python -m homeassistant --script check_config --config /config`.
@@ -279,6 +279,14 @@ arr, caddy, cups, filebrowser, gitea, hermes, immich, inpx-web, inpxer, library,
- **Volume:** `/mnt/RED_2TB/docker/ha``/config`
- Конфиги редактируются **напрямую на NAS**`docker cp` не нужен, изменения применяются после reload/restart HA.
### Home Assistant на TrueNAS ⛔ **ХОЛОСТОЙ ЭКЗЕМПЛЯР (аудит 2026-09-14)**
> ⛔ **СТАТУС:** контейнер `homeassistant` `Up 5 дней`, но **рабочим не является** — `modbus.host` в `/mnt/RED_2TB/docker/ha/configuration.yaml` указывает на **`.197`** (сам TrueNAS), т.е. на шину, которой там больше нет (адаптеры на t610). Живая HA — **аддон на t610 `192.168.2.176`**, домен `mallexxx.duckdns.org` ведёт **туда** (Caddy → `192.168.2.176:80`). **Кандидат на снос (п.6 плана [[family/plans/t610-home-automation]]).**
> 📌 Эталон конфига старой HA сохранён: `/mnt/RED_2TB/docker/ha/configuration.yaml` — modbus-блок построчно идентичен тому, что уехал на t610 (32 заслонки). Использовался как эталон при сверке зон/устройств.
> ⚠️ Папки `docker/ha/` и `docker/homeassistant/` — **`homeassistant/` ПУСТАЯ**, рабочая — `ha/`.
Папка `/mnt/RED_2TB/docker/ha/``/config`. Образ `ghcr.io/home-assistant/home-assistant:stable`, порт `8123`.
**Ключевые файлы конфига:**
| Файл | Назначение |
@@ -300,9 +308,12 @@ ssh truenas_admin@mallexxx.duckdns.org "docker restart homeassistant"
ssh truenas_admin@mallexxx.duckdns.org "docker exec homeassistant python -m homeassistant --script check_config --config /config"
```
### mbusd — Modbus RTU → TCP gateway
### mbusd — Modbus RTU → TCP gateway ⛔ **ПЕРЕЕХАЛ НА t610 (2026-09-14)**
Мост Modbus RTU → TCP: пробрасывает серийный порт в TCP 502. Используется и для вентиляции (AT2), и для ZONT-шины.
> ⛔ **СТАТУС (аудит 2026-09-14): контейнер на TrueNAS БОЛЬШЕ НЕ РАБОЧИЙ.** USB-адаптеры (CH340 ZONT/вентиляция) физически переехали на t610 → в `/sys/bus/usb` на TrueNAS только принтер Samsung `04e8:3425`. `/dev/ttyVent` **не существует**. Контейнер формально `Up` с `2026-08-25` (RestartCount=0), но спамит `tty_reopen(): can't open tty device /dev/ttyUSB0 (No such device or address)`. Маппинг `/dev/ttyVent` докер толерирует, пока device не пересоздавали. **Кандидат на снос (п.6 плана [[family/plans/t610-home-automation]]).**
> 🔴 **Конфликт порта 502:** `mbusd` и `ser2net` **оба** публикуют `0.0.0.0:502` И оба просят `/dev/ttyVent`. `ser2net` в state `Created` (никогда не запущен). При попытке `start ser2net` будет конфликт портов. **Не поднимать оба одновременно.**
Мост Modbus RTU → TCP: пробрасывает серийный порт в TCP 502. ~~Используется и для вентиляции (AT2), и для ZONT-шины.~~**исторически**; на 2026-09-14 обе линии обслуживает mbusd **на t610**.
- **Image:** `3cky/mbusd`, compose в `/mnt/RED_2TB/docker/mbusd/`
- **Порт:** `502:502` (TCP)
@@ -311,10 +322,15 @@ ssh truenas_admin@mallexxx.duckdns.org "docker exec homeassistant python -m home
- **Entrypoint:** `["/usr/bin/mbusd","-d","-L","-","-c","/etc/mbusd.conf"]`
- **Pitfall udev-race:** см. ниже «Проблема modbus-bridge/mbusd после рестарта».
### modbus-bridge — 485-датчики + виртуальные slaves для ZONT
### modbus-bridge — 485-датчики + виртуальные slaves для ZONT ⛔ **ПЕРЕЕХАЛ НА t610 (2026-09-14)**
> ⛔ **СТАТУС (аудит 2026-09-14): ОСТАНОВЛЕН.** `Exited (0)` с **2026-09-14 01:59:34** (один рестарт, потом тишина) — `/dev/ttyZONT` перестал существовать в момент переезда USB на t610. `network_mode: host` + `ha.url: http://localhost:8123` → **на TrueNAS он теперь и не смог бы работать**: локальный HA смотрит на `.197`-шину, которой нет. Рабочая копия — аддон `modbus-bridge` на t610. **Кандидат на снос (п.6 плана [[family/plans/t610-home-automation]]).**
> 🔴 **Побочная находка:** `HA_TOKEN` лежит **открытым текстом** в `/mnt/RED_2TB/docker/modbus-bridge/docker-compose.yml` (env). Кандидат на ротацию вместе с токеном из remote `nolvu-landing`.
Кастомный Python-мост (`modbus_ha_bridge.py`, репо `HA-ZONT-Modbus`), контейнер `/mnt/RED_2TB/docker/modbus-bridge/`.
> ⚠️ **Уточнение (аудит 2026-09-14): `docker-compose.yml` ЗДЕСЬ ЕСТЬ** — пункт ниже («НЕ имеет compose-файла») устарел. Compose содержит `devices: /dev/ttyZONT:/dev/ttyUSB0`, env `HA_TOKEN`/`MQTT_USER=zont`/`MQTT_PASS`, `network_mode: host`, логирование `json-file` 10m×5.
- **Image:** `modbus-bridge` (локальная сборка, `--no-cache`). **НЕ имеет compose-файла** — создавался через `docker-compose`-подобный run; для восстановления использовать параметры ниже.
- **Device:** `devices: - /dev/ttyZONT:/dev/ttyUSB0` (внутри контейнера слушает `/dev/ttyUSB0`)
- **Volumes:** `config.yml``/app/config.yml` (ro), `modbus_ha_bridge.py``/app/modbus_ha_bridge.py` (ro)
@@ -491,6 +507,61 @@ git -C /mnt/RED_2TB/storage/git/obsidian-vault.git log --oneline -10
---
## 🔻 Декоммиссия стека автоматизации TrueNAS → t610 (аудит 2026-09-14)
**Контекст:** миграция умного дома TrueNAS → HP t610 (HA OS) завершена (п.5-мк плана [[family/plans/t610-home-automation]] закрыт). Остался **п.6** — погасить дублирующий стек на TrueNAS. Вместо слепого «гасим всё» проведён **аудит фактом** (что реально живо, что мёртво, что нельзя трогать).
### Что искали и как (методика аудита)
| Шаг | Команда | Зачем |
|---|---|---|
| Список контейнеров | `docker ps -a --format '{{.Names}}\t{{.Status}}\t{{.Image}}\t{{.Ports}}'` | кто жив/умер, какие порты торчат |
| Кто чем управляется | `for c in $(docker ps -a --format '{{.Names}}'); do docker inspect $c --format '{{index .Config.Labels "com.docker.compose.project.config_files"}}'; done` | 🔑 **все** оказались per-service compose из `/mnt/RED_2TB/docker/<app>/` (не Portainer-стек). В `portainer/data/compose/`**пусто**. |
| Почему умер | `docker inspect <c> --format '{{.State.Error}} {{.State.ExitCode}} {{.State.FinishedAt}}'` + `docker logs --tail 20 <c>` | точное время и причина |
| Есть ли железо | `ls /sys/bus/usb/devices/` + `cat .../product`,`idVendor:idProduct` | на TrueNAS только принтер Samsung `04e8:3425` (Intel `8087:0024` = USB-контроллеры). **CH340/координатора НЕТ.** |
| `lsusb`/`dmesg` | — | ❌ **недоступны** `truenas_admin` (`command not found`); `dmesg` пуст без root. Использовать `/sys/bus/usb`. |
| Кто ссылается | `grep -nE '...' /mnt/RED_2TB/docker/caddy/Caddyfile` | не сломать рабочие домены |
> 🔑 **Питфолл:** `docker inspect <c>` **работает** под `truenas_admin` без sudo, а `midclt call ...` и `dmesg` — **нет** (нужен root). Для аудита хватает `docker` + `/sys`.
### Вердикт по каждому контейнеру
| Контейнер | Состояние | Причина | Решение |
|---|---|---|---|
| `homeassistant` | Up 5 дн | холостой — `modbus.host=192.168.2.197`, шины там нет | ⛔ гасить |
| `mbusd` | Up (ложно), 14:42 `can't open /dev/ttyUSB0` | `/dev/ttyVent` не существует (USB уехал) | ⛔ гасить |
| `mosquitto` | Up 3 нед | ZONT переключён на `.176` (DNAT) | ⛔ гасить |
| `nodered` | Up (healthy) | flows перенесены на t610 (68 узлов) | ⛔ гасить *(решение Alex: сразу или страховка 2 дня — открыто)* |
| `zigbee2mqtt` | Exited (2) **14.09 01:59** | `Adapter disconnected` — координатор на t610 | ⛔ останавливать (уже мёртв) |
| `modbus-bridge` | Exited (0) **14.09 01:59** | `/dev/ttyZONT` исчез | ⛔ останавливать (уже мёртв) |
| **`caddy`** | Up | **17 доменов TrueNAS + `mallexxx.*` → t610** | 🔴 **НЕ ТРОГАТЬ** |
| `ser2net` | `Created` (никогда не стартовал) | конфликт 502 с mbusd | отдельное решение |
| `library` | **Restarting, restart=29745** | 🔴 циклический краш, при этом Caddy ссылается (`library:8080`) | 🔴 отдельная задача |
| `inpx-web`, `inpxer` | Exited (1), 13 рестартов, 3 нед | циклический краш | 🔴 отдельная задача |
**Ключевой факт-маркер переезда:** `zigbee2mqtt` и `modbus-bridge` **оба** легли в **2026-09-14T01:59** — синхронно, в момент физического переноса USB-адаптеров. Это доказательство, что дубль перестал работать сам, а не «сломался от чего-то».
### Порядок безопасного гашения (одобренный шаблон)
```bash
# 1) ГАСИМ, НЕ УДАЛЯЕМ (откат возможен)
docker stop homeassistant mbusd mosquitto nodered zigbee2mqtt modbus-bridge
# 2) Снять автозапуск, чтобы не поднялись после ребута
docker update --restart=no homeassistant mbusd mosquitto nodered zigbee2mqtt modbus-bridge
# 3) Проверки
curl -s -o /dev/null -w '%{http_code}\n' https://mallexxx.duckdns.org # ожидаем 200 (t610)
# ZONT MQTT: живой поток в mosquitto на .176, а НЕ на .197
# 4) Папки /mnt/RED_2TB/docker/* НЕ удалять — 2-3 дня, потом rm отдельным шагом
```
**Правила этого шага:**
-**НЕ** `docker rm`, ❌ не удалять `/mnt/RED_2TB/docker/<app>/` — сначала «погасить», откат = `docker start` + вернуть `restart: unless-stopped`.
-**Caddy не гасить и не переносить** — 17 из 20 доменов это сервисы TrueNAS.
-`library`/`inpx-*`**отдельным решением**, не в этом заходе (там своя авария, не связанная с миграцией).
- ⚠️ Порт 502: `mbusd` и `ser2net` **не поднимать одновременно**.
---
## Печать / cups-splix (2026-08-26, починено)
**Принтер Samsung CLX-216x подключён по USB к TrueNAS** (не в сети!). Единственный путь печати — контейнер `cups-splix`, который раздаёт CUPS на `192.168.2.197:631`.
+3 -2
View File
@@ -51,9 +51,10 @@
| Источник | Куда класть | Статус |
|---|---|---|
| Конфиги **t610** (HA OS): `/config/{configuration,automations,scripts,scenes,secrets}.yaml`, `/config/.storage/`, `/config/go2rtc.yaml`, `zigbee2mqtt`, `/addons/{mbusd,modbus-bridge,ustreamer}`, `/addon_configs/{zigbee2mqtt,nodered}` | `/mnt/RED_2TB/backup/t610/` | ✅ **РАБОТАЕТ (2026-09-14)** — крон TrueNAS id=3, юзер `nas`, 03:30 ежедневно, ротация 14 архивов. Детали, питфоллы, команды — `[[family/plans/t610-backup-to-truenas]]` |
| Конфиги **t610** (HA OS): `/config/{configuration,automations,scripts,scenes,secrets}.yaml`, `/config/.storage/`, `/config/go2rtc.yaml`, `zigbee2mqtt`, `blueprints`, HA БД (`home-assistant_v2.db`), **опции ВСЕХ аддонов** (Supervisor API), `/data/options.json`, `/data/.ssh/authorized_keys`, `/addons/{mbusd,modbus-bridge,ustreamer}`, `/addon_configs/{zigbee2mqtt,nodered}` | `/mnt/RED_2TB/backup/t610/` | ✅ **РАБОТАЕТ, v4 (2026-09-14)** — крон TrueNAS id=3, юзер `nas`, 03:30 ежедневно, ротация 14 архивов. Детали, питфоллы, команды — `[[family/plans/t610-backup-to-truenas]]` |
**Как работает (проверено 2026-09-14):** крон на TrueNAS от юзера **`nas`** → `ssh` на t610 (ключ `/mnt/RED_2TB/backup/t610/.ssh/id_ed25519`, ограничен `from="192.168.2.197"`) → `tar czf -` собирается НА t610 → архив `t610-config-<ts>.tar.gz` (~605 КБ, 111 файлов) в `/mnt/RED_2TB/backup/t610/` → датасет `backup` целиком уходит в `mailru-crypt:` по воскресеньям. **Лог:** `backup.log` в той же папке.
**Как работает (проверено 2026-09-14, v4):** крон на TrueNAS от юзера **`nas`** → `ssh` на t610 (ключ `/mnt/RED_2TB/backup/t610/.ssh/id_ed25519`, ограничен `from="192.168.2.197"`) → на t610 выгружаются **опции всех аддонов** через Supervisor API (`/addons/<slug>/info``.data.options`) в `/tmp/habackup/`, затем `tar czf -` собирается НА t610 → архив `t610-full-<ts>.tar.gz` (**~6.0 МБ, 162 файла**) в `/mnt/RED_2TB/backup/t610/` → датасет `backup` целиком уходит в `mailru-crypt:` по воскресеньям. **Лог:** `backup.log` в той же папке.
> 📌 **Почему опции аддонов критичны:** там `ha_token` (JWT для modbus-bridge), `mqtt_password` `mqtt1z3$`, привязки USB `by-path` (`usb-0:3`/`usb-0:4`), Zigbee serial, крипто-секрет Node-RED. Без них восстановление = ручная пересборка всего.
⚠️ **Важно про права (обновлено 2026-09-14):** запись в `/mnt/RED_2TB/backup/` требует root (было `root:root 775`), **но** целевой датасет `backup/t610``nas:nas 770`, поэтому сам бэкап пишется **без root**. `truenas_admin` добавлен в группу `nas`. Root нужен был только для `chown nas:nas /mnt/RED_2TB/backup/t610` (один раз). ⚠️ **Пароль `1316261` — НЕ от TrueNAS** (он от OpenWrt-роутера), root-операции — через System → Shell.