diff --git a/family/how-to/truenas-access.md b/family/how-to/truenas-access.md index 9c757b42..67d48d53 100644 --- a/family/how-to/truenas-access.md +++ b/family/how-to/truenas-access.md @@ -87,6 +87,11 @@ docker run --rm alpine sh -c 'apk add -q openssh sshpass && sshpass -p 1316261 s **Пароль root:** `1316261` +> ⚠️ **ВАЖНО (2026-09-14):** `1316261` — пароль **только от OpenWrt-роутера `192.168.2.2`**. Это **НЕ пароль от TrueNAS** (Alex: «Это не пароль от truenas»). Не использовать его для root-операций на TrueNAS. +> +> 🔑 **Root-операции на TrueNAS делать через WebUI → System → Shell** — этот шелл работает под root, пароль не требуется. Так сделаны `mkdir -p /mnt/.ix-apps/app_configs` и `chown nas:nas /mnt/RED_2TB/backup/t610`. `truenas_admin` **не имеет passwordless sudo** (подтверждено многократно). + + > 💡 **Бэкап firewall OpenWrt перед любой правкой redirect-правил** (вошло в практику 2026-09-01): > ```bash > # с TrueNAS: сохранить весь firewall-конфиг OpenWrt в backup-папку TrueNAS @@ -105,10 +110,36 @@ docker run --rm alpine sh -c 'apk add -q openssh sshpass && sshpass -p 1316261 s |---------------|-------------------------------|-----------------------| | storage/ | /mnt/RED_2TB/storage/ | Общее хранилище | | backup/ | /mnt/RED_2TB/backup/ | Резервные копии | +| backup/t610/ | /mnt/RED_2TB/backup/t610/ | **Бэкап конфигов t610** (HA OS), владелец `nas:nas` 770, создан 2026-09-14 — см. [[family/plans/t610-backup-to-truenas]] | | Photos/ | /mnt/RED_2TB/Photos/ | Фотографии | | TimeMachine/ | /mnt/RED_2TB/TimeMachine/ | Бэкапы macOS | | Edu/ | /mnt/RED_2TB/Edu/ | Учебные материалы | | storage/git/ | /mnt/RED_2TB/storage/git/ | Git-репозитории | +| ix-apps/ | /mnt/.ix-apps/ | Docker data-root (`docker.config.dataset=RED_2TB/ix-apps`) | + +## SMB-шары (проверено 2026-09-14) + +| id | Имя | Путь | Purpose | enabled | +|----|-----|------|---------|---------| +| 1 | `old-bu` | `/mnt/RED_2TB/old-bu` | DEFAULT_SHARE | true | +| 2 | `storage` | `/mnt/RED_2TB/storage` | DEFAULT_SHARE | true | +| 3 | `t610` | `/mnt/RED_2TB/backup/t610` | DEFAULT_SHARE | true | + +> 📌 **Шары хранятся в Samba registry, НЕ в `/etc/smb4.conf`.** Файл содержит только `[global]` + `include = registry` + `registry shares = True`. Поэтому `grep`/`testparm` по имени шары **ничего не находят** — это не признак поломки. Проверять: `midclt call sharing.smb.query`. +> 📌 NFS-экспортов на TrueNAS **нет ни одного** (`sharing.nfs.query` пуст). NFS можно экспортировать только с **датасета**, не с подпапки — для шары на подкаталог (как `backup/t610`) годится только SMB. +> 📌 `midclt call sharing.smb.create '{"purpose":"DEFAULT_SHARE","path":"...","name":"..."}'` — создание шары от `truenas_admin` **работает** (root не нужен). Перед правкой делать дамп: `midclt call sharing.smb.query > /mnt/RED_2TB/storage/shares-before-.json`. + +## 🐛 Питфоллы UI и датасетов (2026-09-14) + +1. 🔴 **`Failed to load datasets: '/mnt/.ix-apps/app_configs'` — валит ВЕСЬ UI датасетов/Apps.** + После пересоздания пула каталог `app_configs` не был создан в датасете `ix-apps`. UI читает его безусловно → падает вся страница, невозможно создать датасет/шару. **Choose Pool не помогает.** + **Фикс (root, WebUI → System → Shell):** `mkdir -p /mnt/.ix-apps/app_configs` → UI оживает. ✅ Проверено. +2. 🔴 **`aclmode: DISCARD aclmode may not be set for NFSv4 acl type`** при создании датасета. + Пул RED_2TB на `acltype=nfsv4`, где `DISCARD` запрещён. **Фикс:** ACL Mode = **`Passthrough`** (или пусто), ACL Type = `NFSv4`. +3. 🔴 **POSIX `setfacl` на NFSv4-датасете не работает** — `Operation not supported`. Владельца/права менять только через **`chown` под root** или **UI → Datasets → Edit → Permissions/ACL**. +4. ⚠️ **`zfs`/`zpool` не в PATH у `truenas_admin`** — `zfs list` даёт пусто. Вызывать `/sbin/zfs`, `/sbin/zpool`. Иначе кажется, что датасетов нет. +5. ⚠️ **`testparm`/`smbclient -L` от `truenas_admin` не работают** — `regdb_init: Failed to open registry /var/run/samba-cache/registry.tdb (Permission denied)`. Проверка SMB от непривилегированного юзера неинформативна. + ## ⚠️ Важно: boot-pool не выживает после обновления diff --git a/family/how-to/truenas-rclone-backup.md b/family/how-to/truenas-rclone-backup.md index 268a9c61..3dabc827 100644 --- a/family/how-to/truenas-rclone-backup.md +++ b/family/how-to/truenas-rclone-backup.md @@ -31,6 +31,9 @@ | docker | `/mnt/RED_2TB/docker` | `mailru-crypt:` | ✅ да | | backup | `/mnt/RED_2TB/backup` | `mailru-crypt:` | ✅ да | +> 📌 **Следствие (2026-09-14): всё, положенное в `/mnt/RED_2TB/backup/*`, уезжает в Mail.ru автоматически** — правка `backup.sh` не нужна. Именно поэтому бэкап конфигов t610 кладётся в `/mnt/RED_2TB/backup/t610/` (датасет `nas:nas` 770, создан 2026-09-14) — см. [[family/plans/t610-backup-to-truenas]]. +> 📌 Крон запускается **внутри контейнера rclone от root**, поэтому права `nas:nas 770` чтению не мешают. + ## Remotes - **mailru** — WebDAV, Mail.ru Cloud (`webdav.cloud.mail.ru`), user: `mallexxx@mail.ru` diff --git a/family/plans/t610-backup-to-truenas.md b/family/plans/t610-backup-to-truenas.md new file mode 100644 index 00000000..56ea0959 --- /dev/null +++ b/family/plans/t610-backup-to-truenas.md @@ -0,0 +1,170 @@ +--- +title: t610 → TrueNAS автобэкап конфигов +created: 2026-09-14 +updated: 2026-09-14 +type: tech +namespace: family +tags: [truenas, t610, backup, smb, ssh, cron, ha-os] +related: + - "[[family/plans/t610-home-automation]]" + - "[[family/how-to/truenas-access]]" + - "[[family/how-to/truenas-rclone-backup]]" + - "[[family/how-to/gitea-config]]" +--- + +# t610 → TrueNAS — автобэкап конфигов + +> **Задача (п.8 / A3 плана [[family/plans/t610-home-automation]]):** конфиги t610 (HA OS) регулярно складывать на TrueNAS, откуда они автоматически уезжают в Mail.ru Cloud через уже существующий rclone-бэкап TrueNAS. + +## Схема (принята 2026-09-14) + +``` +t610 (/config, /addons, /addon_configs) + │ tar + ▼ +TrueNAS pull (крон от юзера nas, ssh с ключом) + │ + ▼ +/mnt/RED_2TB/backup/t610/ ← ZFS-датасет, владелец nas:nas, 770 + │ SMB-шара "t610" (id=3) — для ручного доступа Alex с Mac/телефона + │ + ▼ +rclone backup.sh (воскресенье 03:00, контейнер rclone) + │ run_sync "backup" /data/backup "mailru-crypt:" + ▼ +Mail.ru Cloud (зашифровано) +``` + +**Ключевые решения и почему так:** + +1. **Транспорт — PULL с TrueNAS, а не push с t610.** На t610 не надо ставить креды TrueNAS и держать лишние журналы; TrueNAS знает, где лежит архив. Крон TrueNAS работает под юзером **`nas`**, не под `truenas_admin` и не под root. +2. **Пользователь `nas` (uid 1000) — владелец датасета и ключа.** `truenas_admin` — админ (`zsh`, `builtin_administrators`) — держать его ключ на чужом хосте неправильно (Alex: «думаешь админом бэкап делать?»). `nas` — штатный NAS-юзер, `nas_users` gid=3000. +3. **Целевой датасет — `/mnt/RED_2TB/backup/t610`** (именно датасет, не папка). Причина: он **попадает внутрь `/mnt/RED_2TB/backup`**, который уже целиком уходит в rclone (`run_sync "backup" /data/backup "mailru-crypt:"`). **Ничего в `backup.sh` править не надо** — файлы уезжают в облако автоматически. (Альтернативы `storage/` или `docker/` требовали бы правки root-owned `backup.sh`.) +4. **SMB-шара `t610`** — не для доставки (HA OS не умеет SMB-пуш), а **для ручного доступа Alex** к бэкапам с Mac/телефона без ssh. +5. **Ключ ограничен** на стороне t610: `from="192.168.2.197"` + `no-port-forwarding,no-pty,no-X11-forwarding,no-agent-forwarding`. Т.е. даже при утечке — только стянуть архив, шелла нет. + +## Что сделано (2026-09-14) + +| # | Шаг | Статус | Детали | +|---|-----|--------|--------| +| 1 | Датасет `RED_2TB/backup/t610` | ✅ | UI → Storage → Datasets → Add Dataset; parent `/mnt/RED_2TB/backup`, Name `t610`, Type Filesystem | +| 2 | Права датасета | ✅ | `chown nas:nas` + `chmod 770` (Alex, System → Shell) | +| 3 | SMB-шара | ✅ | `id=3 name=t610 path=/mnt/RED_2TB/backup/t610 enabled=true ro=false` | +| 4 | ssh-ключ для pull | ✅ | Создан на Mac: `~/tmp-t610/backup-key/t610_backup_ed25519` (+`.pub`), ed25519, без пароля, comment `t610-backup-pull`, fingerprint `SHA256:PKDB/sTjM8WFitIjSG+vT27x1TOY3F2Vi6y8YFwK5wo` | +| 5 | Публичный ключ на t610 | ✅ | `/root/.ssh/authorized_keys` (+1 строка, было 1 — ключ Alex). Бэкап: `authorized_keys.bak-20260914-210532` | +| 6 | Приватный ключ на TrueNAS | ✅ | `/mnt/RED_2TB/storage/nas/.ssh/id_ed25519` (+ `config` с хостом-алиасом `t610-backup`), права `nas:nas 600` | +| 7 | Скрипт бэкапа | ⏳ | Не написан | +| 8 | Крон-задача под `nas` | ⏳ | Не создана (`midclt call cronjob.create`, сейчас cron-задач на TrueNAS **нет**) | +| 9 | Живой прогон + проверка архива | ⏳ | Не делался | + +**Путь для архива на TrueNAS:** `/mnt/RED_2TB/backup/t610/` (пока пусто). + +## Ключевые питфоллы (найдены в этой сессии) + +### 1. 🔴 `from="192.168.2.197"` — Mac НЕ подходит для проверки ключа +Mac заходит на t610 как **`192.168.2.157`** (через NAT Rasputin), а не как `.197`. Поэтому `ssh -i <ключ> root@192.168.2.176` **с Mac всегда даёт `Permission denied (publickey)`** — это **правильное поведение** ограничения, а не поломка ключа. Проверять pull-ключ **только с TrueNAS**: +```bash +ssh -F /mnt/RED_2TB/storage/nas/.ssh/config t610-backup 'echo ok' +``` +> ⚠️ Это тот же питфолл `.157` = NAT Rasputin, что уже задокументирован для логов HA. + +### 2. 🔴 `Failed to load datasets: /mnt/.ix-apps/app_configs` — ломает ВЕСЬ UI датасетов +**Симптом:** UI TrueNAS (Storage → Datasets, Apps, Datasets) — «Failed to load datasets», дерево датасетов не открывается, невозможно создать датасет/шару. +**Причина:** после пересоздания пула (2026-08-21) каталог `app_configs` внутри датасета `ix-apps` не был создан. UI на старте **безусловно** читает `/mnt/.ix-apps/app_configs` и валит всё дерево. +**Факты:** `RED_2TB/ix-apps` (8.29G) существует, смонтирован на `/mnt/.ix-apps`, `docker.config` → `pool=RED_2TB, dataset=RED_2TB/ix-apps` (пул Apps выбран корректно). Внутри был только `docker/` (`drwx--x--- root root`). Choose Pool → **не помогло**. +**Фикс (под root, WebUI → System → Shell):** +```bash +mkdir -p /mnt/.ix-apps/app_configs +``` +> 📌 **Проверено:** фикс сработал, UI ожил. `mkdir` — shell-команда, не действие в UI. + +### 3. 🔴 `aclmode: DISCARD aclmode may not be set for NFSv4 acl type` при создании датасета +**Причина:** в форме создания датасета выставлен ACL Mode = `DISCARD`, что **запрещено** при `acltype=NFSv4` (весь пул RED_2TB на NFSv4). +**Фикс:** **ACL Mode = `Passthrough`** (или пусто — подставится `passthrough`), ACL Type = `NFSv4`. Результат: `RED_2TB/backup/t610` → `aclmode=passthrough, acltype=nfsv4`. + +### 4. 🔴 POSIX `setfacl` на NFSv4-датасете НЕ работает +``` +setfacl -m user:truenas_admin:rwx /mnt/RED_2TB/backup/t610 +→ setfacl: Operation not supported +``` +При `acltype=nfsv4` POSIX-setfacl не поддерживается. Менять владельца/права — только **`chown` под root** или **UI → Datasets → Edit → Permissions/ACL** (NFSv4-редактор). + +### 5. Шары SMB на TrueNAS хранятся в registry, НЕ в `/etc/smb4.conf` +`/etc/smb4.conf` содержит только `[global]` + `include = registry` + `registry shares = True`. Поэтому `grep имя_шары /etc/smb4.conf` и `testparm` **ничего не находят** — это не признак, что шара не создалась. Проверять через `midclt call sharing.smb.query`. +> `testparm`/`smbclient -L` от `truenas_admin` дают `regdb_init: Permission denied` на `/var/run/samba-cache/registry.tdb` — проверка от непривилегированного юзера **неинформативна**. + +### 6. `zfs`/`zpool` не в PATH у `truenas_admin` +`zfs list` → пусто/`command not found`. Вызывать по абсолютному пути: **`/sbin/zfs`**, **`/sbin/zpool`**. (Иначе можно ошибочно решить, что датасетов нет.) + +### 7. `truenas_admin` не может писать в `~nas` — и `.ssh` надо чинить chown'ом +`~nas` = `/mnt/RED_2TB/storage/nas` (`drwxrwx--- truenas_admin`). `truenas_admin` файлы туда **положить может**, но создаёт их владельцем `truenas_admin` → `nas` их не прочитает. Поэтому после укладки ключа обязателен `chown -R nas:nas ~nas/.ssh`. + +### 8. Пароль `1316261` — ❌ НЕ от TrueNAS +В доке `[[family/how-to/truenas-access]]` строка «Пароль root: `1316261`» **ошибочна** для TrueNAS. Alex: «Это не пароль от truenas». `1316261` — пароль от OpenWrt-роутера `192.168.2.2` (там он и правильный). **Для TrueNAS root-операций использовать WebUI → System → Shell** (работает под root, пароль не нужен). + +## Команды (для воспроизведения) + +```bash +# ─── Создание ключа (Mac) ─── +ssh-keygen -t ed25519 -N '' -C 't610-backup-pull' -f ~/tmp-t610/backup-key/t610_backup_ed25519 + +# ─── Публичный ключ на t610 (с ограничениями) ─── +KEYBODY=$(awk '{print $2}' ~/tmp-t610/backup-key/t610_backup_ed25519.pub) +ENTRY="from=\"192.168.2.197\",no-port-forwarding,no-pty,no-X11-forwarding,no-agent-forwarding ssh-ed25519 ${KEYBODY} t610-backup-pull" +ssh root@192.168.2.176 'cp -a /root/.ssh/authorized_keys /root/.ssh/authorized_keys.bak-$(date +%Y%m%d-%H%M%S)' +printf '%s\n' "$ENTRY" | ssh root@192.168.2.176 'cat >> /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys' + +# ─── Приватный ключ на TrueNAS в ~nas/.ssh ─── +scp ~/tmp-t610/backup-key/t610_backup_ed25519 truenas_admin@mallexxx.duckdns.org:/tmp/ +ssh truenas_admin@mallexxx.duckdns.org ' + cp /tmp/t610_backup_ed25519 /mnt/RED_2TB/storage/nas/.ssh/id_ed25519 + cat > /mnt/RED_2TB/storage/nas/.ssh/config < /mnt/RED_2TB/storage/shares-before-$(date +%Y%m%d-%H%M%S).json + +# ─── Проверка pull-ключа — ТОЛЬКО С TrueNAS ─── +ssh -F /mnt/RED_2TB/storage/nas/.ssh/config t610-backup 'echo ok' +``` + +## Состав бэкапа t610 (план) + +Из `/config`: `configuration.yaml`, `automations.yaml`, `scripts.yaml`, `scenes.yaml`, `secrets.yaml`, `.storage/` (**без** `home-assistant_v2.db*` — это большая БД), `go2rtc.yaml`, `zigbee2mqtt/`. +Плюс `/addons/{mbusd,modbus-bridge,ustreamer}` (код + `data/config.template.tmpl` — там правка реле slave 104), `/addon_configs/{zigbee2mqtt,nodered}` (flows/settings). +Плюс локально `Caddyfile` (root-owned, лежит на Mac в `~/tmp-caddy/Caddyfile.new`). +**Ротация:** хранить N последних архивов (N согласовать). + +## Связанный синк в git (сделан в этой же сессии) + +Репозиторий **`~/Automation/HA-ZONT-Modbus`** → Gitea (`git_admin/HA-ZONT-Modbus`, private). +Коммит **`9d31118`** «Sync from t610 prod: automations device_ids, go2rtc camera, bridge relay» — запушен, remote SHA = local SHA. + +| Файл | Что синкнуто | +|---|---| +| `homeassistant/configuration.yaml` | http-блок убран (перенесён в `.storage/http`); **`modbus.host` `192.168.2.197` → `192.168.2.176`** | +| `homeassistant/automations.yaml` | перегенерированы `device_id` (миграция на t610), `light.0xa4c13882a4b42db0` → `light.bed_dimmer`, +триггер `illuminance`, +условие `is_occupied` (ночной свет душевой) | +| `homeassistant/go2rtc.yaml` | **НОВЫЙ** — камера go2rtc-hardware, ffmpeg H.264 + `rotate=90` | +| `config.yml` | +«Boiler controller power (Zigbee relay)» slave 104 / рег 1 | +| `modbus_ha_bridge.py` | уже совпадал (sha идентичен) | +| `scripts.yaml` | уже совпадал (sha идентичен) | + +> 📌 Паттерн: **сначала сравнить прод↔репо по sha256, потом тащить только изменившееся.** Креды Gitea — `~/.git-credentials` (chmod 600) + `credential.helper=store`, remote — **чистый URL без токена**. diff --git a/family/plans/t610-home-automation.md b/family/plans/t610-home-automation.md index 98ec1440..db02e70f 100644 --- a/family/plans/t610-home-automation.md +++ b/family/plans/t610-home-automation.md @@ -1996,7 +1996,8 @@ curl -s -X POST -H "$HDR" -H "Content-Type: application/json" \ - **📹 Поворот камеры 90°** — `#rotate=90` в `/config/go2rtc.yaml` (нативный параметр go2rtc, работает при транскодинге). Поток стал `480x640`, кадр проверен, CPU `load 0.20`. **Alex: «Все хорошо, в ту»** — направление подтверждено. Канон — §5-кватер-И-6 (КАНОН-2). Бэкап `/config/go2rtc.yaml.bak-rotate-20260914-202817`, скрипт `~/tmp-t610/relay/patch_rotate.py`. - **📹 B3 / Этап 4 закрыт** — факт-проверка роутера: `firewall.@redirect[0]` (MQTT) и `@rule[3]` `dest_ip=192.168.2.176` (ZONT MQTT → t610). Отдельного «GPON-роутера» нет. - **📹 Caddy ПЕРЕСТРОЕН** — из `Caddyfile` убраны `cam.*` (камера на t610 по RTSP) и `nodered.*` (ingress HA); на t610 ведёт **только** `mallexxx.duckdns.org` → `192.168.2.176:80`. Обновлён [[family/how-to/truenas-infrastructure]]. -- **⚠️ ОСТАЛОСЬ 2 пункта:** ① **п.8** — бэкап конфигов t610 (A3) — 🔶 **в работе, ч.1 сделана, см. §5-кватер-К**; ② **п.6** — погасить на TrueNAS стек автоматизации (`homeassistant`/`mbusd`/`mosquitto`/`nodered`) — **РАЗБЛОКИРОВАН** (5-мк закрыт), **Caddy не гасить**. Хвост: ротация токена из remote `nolvu-landing`; в роутере `redirect[1]` HA `8123`→`.197` помечен `enabled='0'` — мёртвый, можно удалить. +- **⚠️ ОСТАЛОСЬ 2 пункта:** ① **п.8** — бэкап конфигов t610 (A3) → **🔄 В РАБОТЕ (2026-09-14, ночная сессия): см. [[family/plans/t610-backup-to-truenas]]** — датасет `/mnt/RED_2TB/backup/t610` создан (`nas:nas`, 770), SMB-шара `t610` (id=3) создана, ssh-ключ pull-бэкапа разложен (t610 `authorized_keys` с `from="192.168.2.197"` + `~nas/.ssh/`); **осталось: скрипт + крон под `nas` + живой прогон**; ② **п.6** — погасить на TrueNAS стек автоматизации (`homeassistant`/`mbusd`/`mosquitto`/`nodered`) — **РАЗБЛОКИРОВАН** (5-мк закрыт), **Caddy не гасить**. Хвост: ротация токена из remote `nolvu-landing`; в роутере `redirect[1]` HA `8123`→`.197` помечен `enabled='0'` — мёртвый, можно удалить. +- **✅ Синк конфигов в git (2026-09-14, ночь):** репозиторий `~/Automation/HA-ZONT-Modbus` → Gitea `git_admin/HA-ZONT-Modbus`, коммит **`9d31118`** (запушен, remote SHA = local). Синкнуто фактически изменившееся: `configuration.yaml` (http-блок → `.storage/http`; `modbus.host` `.197`→`.176`), `automations.yaml` (`device_id` перегенерированы, `light.0xa4c13882a4b42db0`→`light.bed_dimmer`, +`illuminance`, +`is_occupied`), **новый** `homeassistant/go2rtc.yaml`, `config.yml` (+реле котла slave 104/рег 1). `modbus_ha_bridge.py` и `scripts.yaml` — уже совпадали по sha256. **Паттерн: сначала sha256 прод↔репо, потом тянуть только diff.** **✅ Закрыто / установлено в этой сессии (2026-09-14, позднейшая, Modbus-диагностика):** - **Опции mbusd — откат подтверждён.** Аддон `started`, значения `timeout 1000 / retries 3 / maxconn 8` (как было). `maxconn` **не трогать** (питфолл в §5). @@ -2025,7 +2026,7 @@ curl -s -X POST -H "$HDR" -H "Content-Type: application/json" \ | ~~**B2**~~ | ~~**Node-RED наружу** — выставить порт аддона и поправить Caddy~~ | — | **✅ СНЯТО (2026-09-14 вечер-7):** решение Alex — «оставляем так». Node-RED доступен через **ingress** HA (`http://192.168.2.176/api/hassio_ingress//`), наружу не выпускается. Домен `nodered.*` не используется. См. §5-кватер-Г и `[[family/how-to/nodered-ventilation]]` | | ~~**B3**~~ | ~~**Этап 4, остаток:** GPON-редирект → t610, ZONT MQTT → t610~~ | — | **✅ ВЫПОЛНЕНО (факт-проверка 2026-09-14):** роутер `192.168.2.2` — `firewall.@redirect[0]` (name=MQTT, src_dport=1883) `dest_ip=192.168.2.176`, `firewall.@rule[3]` (allow-1883) `dest_ip=192.168.2.176`. **Отдельного «GPON-роутера» нет** — `192.168.0.10` это `wan`-интерфейс самого роутера `192.168.2.2` (§5-кватер). Остаётся `redirect[1]` HomeAssistant `8123` → `.197` (проверить, нужен ли) | | ~~A2~~ | ~~**№7**: Static IP для t610~~ | — | **✅ ВЫПОЛНЕНО 2026-09-14 (вечер-8, §5-кватер-И-1):** на роутере `192.168.2.2` создана static-привязка `dhcp.@host[1]` = `t610` / MAC `9c:8e:99:ef:3f:c5` / `192.168.2.176` → `uci commit dhcp` + `dnsmasq reload`. Проверено: `ping` OK, HA → HTTP 200. Бэкап `/root/dhcp.bak-20260914-104152` | -| A3 | **№8**: Бэкап конфигов t610 | 🔶 в работе | **Часть 1 ✅ СДЕЛАНА 2026-09-14 (вечер-14): синк репо → прод-факт, коммит `9d31118` запушен в Gitea (SHA local == remote).** Осталось: **автобэкап на TrueNAS** — ждёт выбора Alex из 3 вариантов (A: крон на t610 → scp на TrueNAS; B: крон-задача на TrueNAS → pull с t610; C: rsync Mac → Gitea). Детали — §5-кватер-К. Прошлый `tar`-бэкап: `~/tmp-t610/backups/config-t610-20260914-115034.tar.gz` (88 КБ, **устарел** — до камеры/реле/rotate) | +| A3 | **№8**: Бэкап конфигов t610 | 🔶 почти готов | ① **✅ git-синк СДЕЛАН 2026-09-14:** коммит `9d31118` запушен в Gitea (SHA local == remote) — `configuration.yaml`, `automations.yaml`, **новый** `homeassistant/go2rtc.yaml`, `config.yml`. ② **🔄 автобэкап на TrueNAS (выбран вариант B — pull с TrueNAS):** датасет `/mnt/RED_2TB/backup/t610` (`nas:nas` 770) ✅, SMB-шара `t610` (id=3) ✅, ssh-ключ pull разложен ✅ (t610 `authorized_keys` + `~nas/.ssh/`); **осталось: скрипт + крон под `nas` + живой прогон.** Полный план, команды и 8 питфоллов — **[[family/plans/t610-backup-to-truenas]]**. Прошлый `tar`-бэкап `~/tmp-t610/backups/config-t610-20260914-115034.tar.gz` (88 КБ) **устарел** (до камеры/реле/rotate) | | ~~A4~~ | ~~**Ночной свет душевой**: триггер на падение освещённости~~ | — | **✅ ВЫПОЛНЕНО 2026-09-14 (вечер-8, §5-кватер-И-2):** в automation `1771997851260` добавлен триггер `illuminance below:8` + условие `is_occupied`. Проверено через API: `triggers`=2, `conditions`=2 | | ~~**A5**~~ | ~~**Камера**: USB-вебка Logitech `046d:0825` на t610 → завести в HA~~ | — | **⚠️ ПЕРЕДЕЛАНО 2026-09-14 (вечер-11).** Сначала (вечер-9) завели через `camera: platform: ffmpeg` — **отвергнуто** (`Resource busy`, нет `unique_id`). **Итог вечер-11:** аддон `local_ustreamer` + Generic Camera → `camera.192_168_2_176`, зона `kotelnaia`, `unique_id` ✅. Детали — §5-кватер-И-5 | | ~~**A6**~~ | ~~**Камера — вернуть схему «как на TrueNAS»** (решение Alex, вечер-10)~~ | — | **✅✅ ВЫПОЛНЕНО 2026-09-14 (вечер-11, §5-кватер-И-3/И-5).** Историч. upstream был `cam.mallexxx.duckdns.org → 192.168.2.197:8090` (контейнер утрачен при пересоздании пула, след — `Caddyfile.bak`). Реализовано **аддоном на t610** (вебка физически там, Docker в HA OS закрыт → аддон). Поднят `local_ustreamer` (`/addons/ustreamer/`, MJPEG :8090) → Generic Camera по URL → **`unique_id` + зона `kotelnaia` + имя «Камера котельной»**. Блок `camera: platform: ffmpeg` из `configuration.yaml` **снесён** (бэкап `.bak-rmcam-20260914-185240`). Осталось: удалить лишний `/config/go2rtc.yaml` | @@ -3264,6 +3265,7 @@ ssh root@192.168.2.176 'ha apps rebuild local_modbus-bridge && ha apps restart l - [[family/how-to/truenas-infrastructure]] — docker-стек TrueNAS - [[family/how-to/zont-modbus-bridge-udev-race-protection]] — гонка udev (на t610 неактуальна) - [[family/how-to/gitea-config]] — Gitea (для git-бэкапа конфигов) +- **[[family/plans/t610-backup-to-truenas]]** — автобэкап конфигов t610 → TrueNAS → Mail.ru (п.8/A3): датасет, SMB-шара, pull-ключ, скрипт, крон - [[Modbus/RTU_Framing_Source_Analysis]] — канон сборки RTU-кадров (pymodbus/libmodbus), обоснование фикса §5-кватер-З - [[family/how-to/nodered-ventilation]] — автоматика вентиляции в Node-RED (flows на t610) - [[family/how-to/truenas-sata-ports-and-zfs-pools]] — железо TrueNAS (диски/пулы, для контекста)