[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:
@@ -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`.
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user