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

This commit is contained in:
Alexey Martemyanov
2026-09-14 20:49:31 +06:00
parent edbe9ef76a
commit 2f88ba48b9
2 changed files with 153 additions and 11 deletions
+143 -1
View File
@@ -1975,7 +1975,7 @@ curl -s -X POST -H "$HDR" -H "Content-Type: application/json" \
| ~~5-нр~~ | ~~**Node-RED: flows перенесены с TrueNAS → t610**~~**✅ ЗАКРЫТО.** ~~Alex выбрал «выставить порт наружу»~~ → через API не удалось (`host_network` снимается только в UI, маппинг при нём игнорируется). **Alex: «ок. оставляем так»** — наружу НЕ выпущен, доступ через ingress. 68 узлов, `[server:Home Assistant] Connected to http://supervisor/core`, ошибок 0. Ключевая правка: узел `server` `addon: false``true`. Подробно — **§5-кватер-Г**. Остаётся на будущее (если понадобится домен): снять `host_network` в UI + Caddy → `:11880` | ✅ сделано |
| 5-мк | **ZONT MQTT → t610** (остаток Этапа 4). Переключить на роутере `192.168.2.2` (OpenWrt) DNAT: `firewall.@redirect[0]` (name `MQTT`) `dest_ip` `.197``.176` **и** `firewall.@rule[3]` (name `allow-1883`) `dest_ip` `.197``.176`. В ZONT ничего не менять. Схема, питфоллы, проверки — **§5-кватер-Д**. ⚠️ Перед правкой: `uci export firewall > backup`. ⚠️ Порт 1883 t610 OPEN, юзер `zont` есть, пароль `mqtt1z3$` проверен | **✅ сделано 2026-09-14** — оба правила → `.176`, `uci commit` + firewall reload, ZONT пошёл в mosquitto t610 (живой поток kids/bedroom). Бэкап `/root/firewall.bak-20260914-092555` |
| ~~5-арх~~ | ~~«Перенести Caddy на OpenWrt/t610»~~**❌ ОТВЕРГНУТО (§5-кватер-Б):** на OpenWrt 80/443 заняты `uhttpd`; у Caddy 17 доменов TrueNAS → при переносе падение t610 положит все медиасервисы. **Caddy остаётся на TrueNAS.** | — |
| 6 | Остановить + отключить автозапуск сервисов на TrueNAS (не удалять — откат). **✅ РАЗБЛОКИРОВАНО 2026-09-14:** условие снято — п. **5-мк СДЕЛАН** (ZONT MQTT → t610). **Гасим ТОЛЬКО стек автоматизации:** `homeassistant` (8123), `mbusd` (502), `mosquitto` (1883), `nodered` (1880), + `zigbee2mqtt`/`modbus-bridge` если есть. **🔴 Caddy НЕ ГАСИТЬ и не переносить** — он не в списке, он рабочий элемент (17 доменов TrueNAS + `mallexxx.*` → t610) | **🔄 АУДИТ ПРОВЕДЁН 2026-09-14 (см. §5-кватер-Л).** Факты: `zigbee2mqtt` (Exited 2) и `modbus-bridge` (Exited 0) легли **синхронно 14.09 01:59** — сами, при переносе USB на t610; `mbusd` формально `Up` но спамит `can't open /dev/ttyUSB0` (адаптеров на TrueNAS НЕТ — в `/sys/bus/usb` только принтер Samsung `04e8:3425`); `homeassistant` Up, но `modbus.host=.197` → холостой. **Гасить (stop + `--restart=no`, НЕ `rm`):** `homeassistant`, `mbusd`, `mosquitto`, `nodered`, `zigbee2mqtt`, `modbus-bridge`. **Caddy НЕ трогать.** Побочная находка: `HA_TOKEN` открытым текстом в compose `modbus-bridge`. **Ждёт решения Alex:** `nodered` сразу или страховка 2 дня |
| ~~6~~ | ~~Остановить + отключить автозапуск сервисов на TrueNAS (не удалять — откат). **✅ РАЗБЛОКИРОВАНО 2026-09-14:** условие снято — п. **5-мк СДЕЛАН** (ZONT MQTT → t610). **Гасим ТОЛЬКО стек автоматизации:** `homeassistant` (8123), `mbusd` (502), `mosquitto` (1883), `nodered` (1880), + `zigbee2mqtt`/`modbus-bridge` если есть. **🔴 Caddy НЕ ГАСИТЬ и не переносить** — он не в списке, он рабочий элемент (17 доменов TrueNAS + `mallexxx.*` → t610) | **🔄 АУДИТ ПРОВЕДЁН 2026-09-14 (см. §5-кватер-Л).** Факты: `zigbee2mqtt` (Exited 2) и `modbus-bridge` (Exited 0) легли **синхронно 14.09 01:59** — сами, при переносе USB на t610; `mbusd` формально `Up` но спамит `can't open /dev/ttyUSB0` (адаптеров на TrueNAS НЕТ — в `/sys/bus/usb` только принтер Samsung `04e8:3425`); `homeassistant` Up, но `modbus.host=.197` → холостой. **Гасить (stop + `--restart=no`, НЕ `rm`):** `homeassistant`, `mbusd`, `mosquitto`, `nodered`, `zigbee2mqtt`, `modbus-bridge`. **Caddy НЕ трогать.** Побочная находка: `HA_TOKEN` открытым текстом в compose `modbus-bridge`. **Ждёт решения Alex:** `nodered` сразу или страховка 2 дня | **✅✅ ВЫПОЛНЕНО 2026-09-14 (ночная сессия).** Alex: «Гасим nodered» + «ser2net тоже гасить» + «inpxer не трогай». **Погашено 7 контейнеров** (`docker stop` + `docker update --restart=no`, **НЕ `rm`**, папки `docker/*` целы): `homeassistant`, `mbusd`, `mosquitto`, `nodered`, `zigbee2mqtt`, `modbus-bridge`, **`ser2net`**. Все → `restart=no` / `exited`. **Проверено:** порты 502/1883/8123/1880 на TrueNAS **свободны**; `mallexxx.duckdns.org` **HTTP 200**; MQTT `modbus/#` на t610 живой (`23.11`/`25.04`); RTSP камеры `:8554` OPEN; `.197:502` CLOSED. **Caddy НЕ тронут.** `inpxer` / `inpx-web` / `library` по указанию Alex **НЕ трогались**. Полный разбор — **§5-кватер-Л** |
| ~~7~~ | ~~Static IP для t610 на роутере (сейчас DHCP)~~**✅ ВЫПОЛНЕНО 2026-09-14 (вечер-8, §5-кватер-И-1):** `dhcp.@host[1]` = `t610` / MAC `9c:8e:99:ef:3f:c5` / `192.168.2.176`, бэкап `/root/dhcp.bak-20260914-104152` | ✅ закрыто |
| 8 | Бэкап конфигов t610 → Mac + TrueNAS + git (Gitea `git.mallexxx.duckdns.org`). **📌 Добавить в бэкап:** `/config/.storage/http` (фикс `trusted_proxies`), сам `Caddyfile`, `/config/go2rtc.yaml` (камера + поворот `#rotate=90`), `/config/automations.yaml`, а также `data/config.template.tmpl` аддона `modbus-bridge` (там живёт маппинг реле котла) | **✅ СДЕЛАНА ЧАСТЬ 1/3 (2026-09-14):** git-синк в Gitea (`~/Automation/HA-ZONT-Modbus`, коммит `9d31118`, 4 файла: `configuration.yaml`, `automations.yaml`, `go2rtc.yaml`, `config.yml`). **✅ ЧАСТЬ 2/3 — АВТОБЭКАП НА TRUENAS РАБОТАЕТ** (см. §5-кватер-К). Осталась часть 3/3: копия на Mac. **⚠️ Caddyfile в автобэкап НЕ входит** — он на TrueNAS, не на t610 (учесть отдельно) |
| ~~9~~ | ~~**Zigbee-реле котла → modbus-bridge**~~**✅✅ ВЫПОЛНЕНО + ПОДТВЕРЖДЕНО ALEX 2026-09-14 (вечер-13, §5-кватер-И-7):** `switch.boiler_controller_power` = **`slave 104, рег. 1`** (bidirectional). Бэкап `.bak-relay-20260914-200827` | ✅ закрыто |
@@ -2041,6 +2041,85 @@ curl -s -X POST -H "$HDR" -H "Content-Type: application/json" \
3. ~~**«Замерзание» лога bridge**~~**✅ РЕШЕНО:** тот же баг сборки кадров (байты-сироты копились в буфере, `[BUF-LEFT 1] 00` ×20). Устранён фиксом `3748feb`.
4. **Этап 4 / погасить TrueNAS:** где живёт точка входа, если Caddy нельзя уносить с TrueNAS? (§5-кватер-Б) — **открыт**: Caddy оставлен на TrueNAS осознанно (17 из 20 доменов — сервисы TrueNAS).
### 5-кватер-Л. 🔻 Декомиссия дублирующего стека на TrueNAS (п.6) — АУДИТ (2026-09-14, поздняя)
**Триггер:** Alex — *«Переходим к сносу старых контейнеров на truenas?»*
**Подход:** не гасить «по списку из плана», а сначала **проверить фактом**, что реально живо, что мёртво само, и что нельзя трогать. Плановая формулировка п.6 («гасим `homeassistant`/`mbusd`/`mosquitto`/`nodered` + `zigbee2mqtt`/`modbus-bridge` если есть») оказалась верной по составу, но **не по причине** — половина уже мертва.
#### Л-1. 📋 Факты аудита (проверено, не гипотезы)
| Контейнер | Факт | Причина |
|---|---|---|
| `homeassistant` | `Up 5 дней` | **холостой**: `modbus.host` в `docker/ha/configuration.yaml` = `192.168.2.197` → шины на TrueNAS нет |
| `mbusd` | `Up` с 2026-08-25, `RestartCount=0`, но лог 14:42: `tty_reopen(): can't open tty device /dev/ttyUSB0 (No such device or address)` | `/dev/ttyVent` **не существует** — USB-адаптеры уехали на t610 |
| `mosquitto` | `Up 3 недели`, :1883 | ZONT переключён на `.176` (DNAT, п.5-мк) |
| `nodered` | `Up 5 дней (healthy)`, :1880 | flows уже перенесены на t610 (68 узлов, п.5-нр) |
| `zigbee2mqtt` | **`Exited (2)`, `FinishedAt=2026-09-14T01:59:03`** | `z2m: Adapter disconnected, stopping` — координатор на t610 |
| `modbus-bridge` | **`Exited (0)`, `FinishedAt=2026-09-14T01:59:34`** | `/dev/ttyZONT` исчез |
| `caddy` | `Up 4 часа` | **рабочий** — 17 доменов TrueNAS + `mallexxx.*``192.168.2.176:80` |
| `ser2net` | **`Created`** (никогда не стартовал) | 🔴 конфликт: и `mbusd`, и `ser2net` публикуют `0.0.0.0:502` И оба просят `/dev/ttyVent` |
| `library` | **`Restarting`, `RestartCount=29745`** | 🔴 циклический краш; Caddy на него ссылается → `library.mallexxx.duckdns.org` мёртв |
| `inpx-web`, `inpxer` | `Exited (1)`, `RestartCount=13`, 3 недели | 🔴 циклический краш, к переезду не относятся |
> 🔑 **Маркер переезда:** `zigbee2mqtt` и `modbus-bridge` легли **синхронно в 01:59** — в момент физического переноса USB. Это доказывает: дубль перестал работать **сам**, а не «сломался от наших действий».
#### Л-2. 🔬 Методика аудита (для повторения)
```bash
# кто жив + порты
ssh truenas_admin@mallexxx.duckdns.org "docker ps -a --format '{{.Names}}\t{{.Status}}\t{{.Image}}\t{{.Ports}}'"
# КТО ЧЕМ УПРАВЛЯЕТСЯ (ключевое — не Portainer-стек!)
for c in $(docker ps -a --format '{{.Names}}'); do
docker inspect $c --format '{{index .Config.Labels "com.docker.compose.project.config_files"}}'; done
# почему умер: точное время/код + логи
docker inspect zigbee2mqtt --format '{{.State.Status}} {{.State.ExitCode}} {{.State.FinishedAt}}'
docker logs --tail 15 zigbee2mqtt
# ЕСТЬ ЛИ ЖЕЛЕЗО (lsusb/dmesg недоступны truenas_admin!)
ls /sys/bus/usb/devices/; cat /sys/bus/usb/devices/2-1.7/product; cat .../idVendor .../idProduct
# кто ссылается — не сломать рабочие домены
grep -nE '18080|18081|1880|8123|library|webdav' /mnt/RED_2TB/docker/caddy/Caddyfile
```
**Установлено:**
- **Все 31 контейнер — per-service compose** из `/mnt/RED_2TB/docker/<app>/`, НЕ Portainer-стеки. `/mnt/RED_2TB/docker/portainer/data/compose/`**пусто**. Значит гасить надо `docker compose stop` из папки либо `docker stop` + `docker update --restart=no`.
- На TrueNAS в `/sys/bus/usb/devices/` — только **Samsung CLX-216x `04e8:3425`** (принтер) и контроллеры Intel `8087:0024`. **CH340/координатора Zigbee физически нет.**
- ❌ **ПИТФОЛЛ:** `lsusb``command not found`, `dmesg` — пусто без root. `midclt call app.query`**`sudo: a terminal is required`**. Под `truenas_admin` работают **только `docker`-команды** и чтение `/sys`. Планировать аудит от этого.
- ✅ Побочно: `/mnt/.ix-apps/app_configs` **пуста** → TRUE-Apps не установлены, всё ручной compose. Это норма для этого хоста.
#### Л-3. 🔴 Побочные находки (НЕ трогали, отдельные задачи)
1. **`library` — 29745 рестартов.** Caddy-блок `library.mallexxx.duckdns.org → library:8080` (basic_auth `books-admin`) ссылается на мертвяка → домен отдаёт 502. Нужно решать отдельно (чинить образ или убирать домен).
2. **Конфликт порта 502:** `mbusd` (Up) и `ser2net` (`Created`) оба на `0.0.0.0:502` с одним и тем же `/dev/ttyVent`. **Не поднимать `ser2net`, пока жив `mbusd`.**
3. **🔴 Секрет открытым текстом:** `HA_TOKEN` в `docker-compose.yml` контейнера `modbus-bridge` (env). Кандидат на ротацию — вместе с токеном в remote `nolvu-landing` (п. 3-гт).
4. `inpx-web`/`inpxer` циклически падают с 24.08 — своя авария.
#### Л-4. ✅ Предложенный и принятый порядок (гасим, не удаляем)
```bash
# 1) ОСТАНОВИТЬ (НЕ rm) — откат возможен
ssh truenas_admin@mallexxx.duckdns.org \
"docker stop homeassistant mbusd mosquitto nodered zigbee2mqtt modbus-bridge"
# 2) снять автозапуск, чтобы не поднялись после ребута
ssh truenas_admin@mallexxx.duckdns.org \
"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
```
**Правила (канон этого шага):**
- ❌ **НЕ `docker rm`**, ❌ не удалять папки `/mnt/RED_2TB/docker/<app>/` — сначала «погасить»; откат = `docker start` + вернуть `restart: unless-stopped`.
- ❌ **Caddy не гасить и не переносить** (17 из 20 доменов — сервисы TrueNAS).
- ❌ `library` / `inpx-*`**отдельным решением**, не в этом заходе.
- ⏳ Папки удалять через 2–3 дня наблюдения — **отдельным шагом с подтверждением Alex**.
**⏳ Открытый вопрос к Alex:** `nodered` гасить сразу или оставить как страховку на 2 дня (flows уже на t610)?
**Детали инфраструктуры** продублированы в [[family/how-to/truenas-infrastructure]] → раздел «🔻 Декоммиссия стека автоматизации TrueNAS → t610».
---
### 5-кватер-К. 🔶 Бэкап конфигов t610 (п.8 / A3) — синк репо ✅ + план автобэкапа (2026-09-14, вечер-14)
**Триггер:** Alex — *«Поехали бэкап»*, затем уточнение — *«Нужно синкнуть в папку Automations то что изменилось по факту. Настроить автобэкап на truenas»*.
@@ -3270,3 +3349,66 @@ ssh root@192.168.2.176 'ha apps rebuild local_modbus-bridge && ha apps restart l
- [[family/how-to/nodered-ventilation]] — автоматика вентиляции в Node-RED (flows на t610)
- [[family/how-to/truenas-sata-ports-and-zfs-pools]] — железо TrueNAS (диски/пулы, для контекста)
- [[family/how-to/truenas-rclone-backup]] — rclone-бэкап TrueNAS → Mail.ru (куда ложить бэкапы t610, §5-кватер-К)
---
## §5-кватер-Л. 🔴 Снос/гашение стека автоматизации на TrueNAS (2026-09-14, ночная сессия)
**Триггер:** Alex — *«Переходим к сносу старых контейнеров на truenas?»* → уточнения: *«Inpxer не трогай»*, *«ser2net тоже гасить»*, *«Гасим nodered»*.
### Л-1. Аудит: почему гасим (факты, не гипотезы)
Стек на TrueNAS **уже был мёртв** — легли сами при переносе USB-адаптеров на t610:
| Контейнер | Состояние до | Факт-доказательство |
|---|---|---|
| `zigbee2mqtt` | `Exited (2)` с **14.09 01:59** | лог: `Adapter disconnected, stopping``Stopped Zigbee2MQTT`. Координатор уехал на t610 |
| `modbus-bridge` | `Exited (0)` с **14.09 01:59** | `devices: /dev/ttyZONT:/dev/ttyUSB0` — узла `/dev/ttyZONT` на TrueNAS больше нет |
| `mbusd` | формально `Up`, **фактически мёртв** | спамит `tty_reopen(): can't open tty device /dev/ttyUSB0 (No such device or address)` каждые 3 с. **USB-адаптеров на TrueNAS нет**`ls /dev/ttyUSB*` пусто; в `/sys/bus/usb/devices` только Samsung-принтер `04e8:3425` (это `cups-splix`) |
| `homeassistant` | `Up 5 days`, но **холостой** | `modbus.host: 192.168.2.197` (сам себя) → шина недостижима, инстанс не используется |
| `mosquitto` | `Up 3 недели` | ZONT ушёл на `.176` (п.5-мк), :1883 TrueNAS больше никто не слушает |
| `nodered` | `Up (healthy)`, :1880 | flows перенесены на t610 (68 узлов, §5-кватер-Г) |
| `ser2net` | `Created` (никогда не стартовал) | **spare-master той же шины:** `connector: serialdev,/dev/ttyUSB0,9600n81` + `accepter: tcp,502` — при запуске подрался бы с `mbusd` за порт 502 |
**Момент истины — 14.09 01:59.** Всё синхронно: `homeassistant` `StartedAt=2026-09-09T03:06:19`, `nodered` `03:06:29`, `zigbee2mqtt` `03:06:40` — последняя волна рестарта 09.09, затем смерть 14.09 01:59.
### Л-2. Что сделано
```
docker stop nodered homeassistant mbusd mosquitto zigbee2mqtt modbus-bridge ser2net
docker update --restart=no <те же 7>
```
**Результат:** все 7 → `restart=no`, `exited` (кроме `ser2net``created`, он и не стартовал).
- 🔴 **`rm` НЕ делали.** Папки `/mnt/RED_2TB/docker/{ha,mbusd,mosquitto,nodered,zigbee2mqtt,modbus-bridge,ser2net}/` **целы** — откат = `docker start` + `docker update --restart=unless-stopped`.
- 🔴 **Caddy НЕ тронут** (17 доменов TrueNAS + `mallexxx.*` → t610).
- **`inpxer` / `inpx-web` / `library` — НЕ трогались** (Alex: «inpxer не трогай»).
### Л-3. Верификация (после гашения)
| Проверка | Результат |
|---|---|
| `netstat` LISTEN на 502/1883/8123/1880 | **ни одного слушателя** ✅ |
| `https://mallexxx.duckdns.org` (HA t610 через Caddy) | **HTTP 200** ✅ |
| MQTT `modbus/#` на `192.168.2.176:1883` (`zont`/`mqtt1z3$`) | **живой поток** (`23.11`, `25.04`) ✅ |
| RTSP камеры `192.168.2.176:8554` | **OPEN** ✅ |
| `.197:502` | **CLOSED** ✅ |
| Порт 80 на `192.168.2.176` | OPEN (Caddy ведёт сюда) |
> ⚠️ **Питфолл диагностики:** `curl http://192.168.2.176:8123`**`HTTP 000`** — и это **НОРМА**, а не поломка. HA на t610 доступен **через Caddy**: `:80` (прокси) и `https://mallexxx.duckdns.org`; сам `:8123` на `.176` **закрыт**. Не принимать за регресс.
### Л-4. ⚠️ Найденные минные поля (НЕ трогались — отдельное решение Alex)
1. 🔴 **`library` рестартует циклически — `RestartCount=29745`.** Caddy на него ссылается (`library.mallexxx.duckdns.org → library:8080`, basic_auth `books-admin`) → **домен сейчас мёртв**. Создан 24.08 09:11, падает непрерывно.
2. 🔴 **Конфликт порта 502 (устранён гашением).** До гашения: `mbusd` и `ser2net` **оба** мапили `0.0.0.0:502`, **оба** просили `/dev/ttyVent:/dev/ttyUSB0`. `ser2net` в `Created` → при старте **порт был бы занят**. Теперь оба `restart=no`, конфликт снят.
3. 🔴 **`inpx-web` (порт 18081) и `inpxer` (порт 18080) — оба `Exited (1)`, `RestartCount=13`.** Caddy: `books.mallexxx.duckdns.org → 192.168.2.197:18080`**ведёт в мёртвый `inpxer`**. По указанию Alex **не трогались**.
4. ⚠️ **Секрет открытым текстом:** `HA_TOKEN` (long-lived HA, `eyJhbG...wkME`) прямо в `/mnt/RED_2TB/docker/modbus-bridge/docker-compose.yml``environment`. Кандидат на вынос в `.env` + ротацию. Также `MQTT_PASS: mqtt1z3$` там же.
### Л-5. Хвосты
- [ ] Откат при необходимости: `docker start <name>` + `docker update --restart=unless-stopped <name>`
- [ ] **Удаление** — отдельным шагом, не раньше чем через 2–3 дня стабильной работы (Alex: сначала «остановить, не удалять»)
- [ ] Разобраться с `library` / `inpx-web` / `inpxer` (минные поля Л-4)
- [ ] Вынести `HA_TOKEN` из compose в `.env` + ротация
- [ ] Ротация токена из remote `nolvu-landing` (хвост п.3-гт)