316 lines
16 KiB
Markdown
316 lines
16 KiB
Markdown
# TrueNAS — инфраструктура
|
||
|
||
> Обновлено: 2026-07-06
|
||
|
||
## Доступ
|
||
|
||
- **Host (external):** `mallexxx.duckdns.org` (DuckDNS) — **единственный способ** SSH/API из 192.168.1.x
|
||
- **SSH:** `truenas_admin@mallexxx.duckdns.org -i ~/.ssh/id_rsa`
|
||
- **Web UI:** http://truenas.mallexxx.duckdns.org
|
||
- **Portainer:** https://portainer.mallexxx.duckdns.org
|
||
- **Host (local network):** `192.168.2.197` — ⚠️ ИСПОЛЬЗОВАТЬ `ssh truenas_admin@mallexxx.duckdns.org`. НЕ ИСПОЛЬЗОВАТЬ локальный IP для SSH доступа!
|
||
- ⚠️ Eagle (Mac, 192.168.1.x) и Kraken (192.168.1.15) находятся в **другой подсети**
|
||
- ⚠️ Кра́кен и TrueNAS — **разные сети** (192.168.1.x vs 192.168.2.x). Доступ с Кракена на TrueNAS по локальному IP **не работает**
|
||
|
||
## Пользователи и группы (ключевые)
|
||
|
||
| uid | Имя | gid | Назначение |
|
||
|-----|-----|-----|------------|
|
||
| 950 | truenas_admin | 950 | SSH-пользователь, управление docker |
|
||
| 911 | transdamon | 911 | Процесс Transmission внутри контейнера |
|
||
| 921 | transmission | 921 | Старый пользователь (не используется контейнером) |
|
||
| 3000 | nas_users | 3000 | Общая группа доступа к NAS |
|
||
|
||
## Структура папок
|
||
|
||
```
|
||
/mnt/RED_2TB/
|
||
├── docker/ ← конфиги docker-контейнеров (бэкапятся → mailru-crypt:)
|
||
│ ├── caddy/
|
||
│ ├── filebrowser/
|
||
│ ├── ha/ ← Home Assistant
|
||
│ ├── hermes/ ← Hermes-Taiga
|
||
│ ├── homeassistant/
|
||
│ ├── immich/
|
||
│ ├── inpx-web/
|
||
│ ├── inpxer/
|
||
│ ├── mbusd/
|
||
│ ├── modbus-bridge/
|
||
│ ├── mosquitto/
|
||
│ ├── nodered/
|
||
│ ├── portainer/
|
||
│ ├── python/
|
||
│ ├── rclone/
|
||
│ ├── ser2net/
|
||
│ ├── transmission/ ← конфиг Transmission (settings.json, torrents, resume...)
|
||
│ ├── vless-proxy/
|
||
│ ├── watchtower/
|
||
│ ├── webdav/
|
||
│ └── zigbee2mqtt/
|
||
├── storage/
|
||
│ ├── Downloads/ ← данные торрентов (монтируется в контейнер как /mnt/storage)
|
||
│ │ ├── transmission/ ← старый путь конфига (больше не используется)
|
||
│ │ └── [медиафайлы]
|
||
│ └── obsidian/ ← vault (read-only для hermes-taiga)
|
||
├── backup/ ← ручные бэкапы (бэкапятся → mailru-crypt:)
|
||
│ └── transmission-config/ ← снапшот конфига от 2026-04-30
|
||
├── Photos/ ← фото (бэкапятся → mailru:Photos/Photos)
|
||
├── old-bu/ ← старый архив (бэкапятся → mailru:Photos/old-bu)
|
||
└── immich-photos-upload/ ← библиотека Immich (бэкапятся → mailru:Photos/immich)
|
||
```
|
||
|
||
## NFSv4 ACL — важно
|
||
|
||
TrueNAS использует **NFSv4 ACL**, а не стандартный POSIX chmod/chown.
|
||
- `ls -la` показывает `----------` даже если ACL есть → всегда проверять через `midclt call filesystem.getacl <path>`
|
||
- Добавить запись: `midclt call filesystem.setacl '{...}'`
|
||
- `truenas_admin` не имеет passwordless sudo → root-операции только через midclt или TrueNAS UI
|
||
|
||
## Docker-контейнеры
|
||
|
||
| Контейнер | Image | Порт | Домен |
|
||
|-----------|-------|------|-------|
|
||
| transmission | linuxserver/transmission:latest | 9091, 51413 | transmission.mallexxx.duckdns.org |
|
||
| hermes-taiga | hermes-taiga:latest | — | — |
|
||
| vless-proxy | teddysun/xray:latest | — | — |
|
||
| filebrowser | filebrowser/filebrowser:latest | — | — |
|
||
| webdav | hacdias/webdav:latest | — | webdav.mallexxx.duckdns.org |
|
||
| homeassistant | home-assistant:stable | 8123 | mallexxx.duckdns.org |
|
||
| immich-server | immich-app/immich-server:release | 2283 | immich.mallexxx.duckdns.org |
|
||
| immich-postgres | tensorchord/pgvecto-rs:pg14-v0.2.0 | — | — |
|
||
| immich-redis | redis:7 | — | — |
|
||
| nodered | nodered/node-red:latest | 1880 | nodered.mallexxx.duckdns.org |
|
||
| mosquitto | eclipse-mosquitto:latest | — | — |
|
||
| caddy | caddy:latest | 80, 443 | reverse proxy для всего |
|
||
| rclone | rclone/rclone:latest | — | бэкап по cron |
|
||
| portainer | portainer/portainer-ce:latest | 9000 | portainer.mallexxx.duckdns.org |
|
||
| 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 | — | принтер |
|
||
|
||
### Transmission — детали
|
||
- **Config:** `/mnt/RED_2TB/docker/transmission/` (монтируется как `/config`)
|
||
- **Данные:** `/mnt/RED_2TB/storage` (монтируется как `/mnt/storage`)
|
||
- **Download dir:** `/mnt/storage/Downloads`
|
||
- **UID/GID:** 911/911 (пользователь `transdamon`)
|
||
- **RPC whitelist:** `172.16.6.*`
|
||
- **Web:** https://transmission.mallexxx.duckdns.org
|
||
- **Порты:** 9091 (RPC/web), 51413 (TCP/UDP peers)
|
||
|
||
### Caddy — домены
|
||
| Домен | → |
|
||
|-------|---|
|
||
| mallexxx.duckdns.org | Home Assistant :8123 |
|
||
| transmission.mallexxx.duckdns.org | Transmission :9091 |
|
||
| immich.mallexxx.duckdns.org | Immich :2283 |
|
||
| nodered.mallexxx.duckdns.org | Node-RED :1880 |
|
||
| webdav.mallexxx.duckdns.org | WebDAV |
|
||
| books.mallexxx.duckdns.org | Inpxer :18080 🔒 basicauth (user: books-admin) |
|
||
| library.mallexxx.duckdns.org | library-app :8080 🔒 basicauth (user: books-admin) |
|
||
| portainer.mallexxx.duckdns.org | Portainer :9000 |
|
||
| truenas.mallexxx.duckdns.org | TrueNAS UI :80 |
|
||
| cam.mallexxx.duckdns.org | Камера :8090 |
|
||
| docs.mallexxx.duckdns.org | Docs :8000 |
|
||
|
||
### Home Assistant — детали
|
||
|
||
- **Image:** `ghcr.io/home-assistant/home-assistant:stable`
|
||
- **Порт:** `8123:8123`
|
||
- **Volume:** `/mnt/RED_2TB/docker/ha` → `/config`
|
||
- Конфиги редактируются **напрямую на NAS** — `docker cp` не нужен, изменения применяются после reload/restart HA.
|
||
|
||
**Ключевые файлы конфига:**
|
||
|
||
| Файл | Назначение |
|
||
|------|------------|
|
||
| `configuration.yaml` | Главный конфиг: интеграции, template sensors, http trusted_proxies |
|
||
| `automations.yaml` | Все автоматизации (подключён через `!include`) |
|
||
| `scripts.yaml` | Скрипты |
|
||
| `.storage/lovelace.home_plan` | Dashboard с планом этажей (JSON, управляется HA UI) |
|
||
| `www/floorplan/floor1_ha.svg` | SVG фон первого этажа |
|
||
| `www/floorplan/floor2_ha.svg` | SVG фон второго этажа |
|
||
|
||
**Перезапуск после редактирования конфига:**
|
||
```bash
|
||
ssh truenas_admin@mallexxx.duckdns.org "docker restart homeassistant"
|
||
```
|
||
|
||
**Проверка конфига перед перезапуском:**
|
||
```bash
|
||
ssh truenas_admin@mallexxx.duckdns.org "docker exec homeassistant python -m homeassistant --script check_config --config /config"
|
||
```
|
||
|
||
### mbusd — Modbus TCP gateway
|
||
|
||
Мост Modbus RTU → TCP: пробрасывает серийный порт инвертора AT2 вентиляции в TCP 502.
|
||
|
||
- **Image:** `3cky/mbusd`
|
||
- **Порт:** `502:502`
|
||
- **Config:** `/mnt/RED_2TB/docker/mbusd/mbusd.conf` → `/etc/mbusd.conf`
|
||
- **Device:** `/dev/ttyVent` → `/dev/ttyUSB0` (внутри контейнера)
|
||
|
||
### modbus-bridge — AT2 Modbus → MQTT
|
||
|
||
Кастомный Python-мост: читает регистры инвертора AT2 через mbusd и публикует в MQTT → Home Assistant.
|
||
|
||
- **Image:** `modbus-bridge` (локальная сборка)
|
||
- **Volumes:**
|
||
- `/mnt/RED_2TB/docker/modbus-bridge/config.yml` → `/app/config.yml` (ro)
|
||
- `/mnt/RED_2TB/docker/modbus-bridge/modbus_ha_bridge.py` → `/app/modbus_ha_bridge.py` (ro)
|
||
- **Source:** `modbus_ha_bridge.py` в репозитории `HA-ZONT-Modbus`
|
||
|
||
### USB device aliases
|
||
|
||
Файл правил: `/mnt/RED_2TB/system/99-tty-alias.rules`
|
||
|
||
```
|
||
SUBSYSTEM=="tty", KERNEL=="ttyUSB*", KERNELS=="2-1.6:1.0", SYMLINK+="ttyZONT"
|
||
SUBSYSTEM=="tty", KERNEL=="ttyUSB*", KERNELS=="2-1.5:1.0", SYMLINK+="ttyVent"
|
||
```
|
||
|
||
Применить после изменений:
|
||
```bash
|
||
cp /mnt/RED_2TB/system/99-tty-alias.rules /etc/udev/rules.d/ && udevadm control --reload-rules && udevadm trigger
|
||
```
|
||
|
||
> `/etc/udev/rules.d/` на TrueNAS — tmpfs, не переживает перезагрузку. Правила применяются автоматически через **TrueNAS Init/Shutdown Scripts** (POSTINIT).
|
||
|
||
**Просмотреть/изменить:** TrueNAS UI → System → Advanced → Init/Shutdown Scripts, или:
|
||
```bash
|
||
midclt call initshutdownscript.query
|
||
```
|
||
|
||
Текущая запись (id 1, POSTINIT, comment: "Map ttyUSB"):
|
||
```bash
|
||
cp /mnt/RED_2TB/system/99-tty-alias.rules /etc/udev/rules.d/ && udevadm control --reload-rules && udevadm trigger
|
||
```
|
||
|
||
## Hermes-Taiga агент
|
||
|
||
| Параметр | Значение |
|
||
|----------|----------|
|
||
| Контейнер | `hermes-taiga` |
|
||
| Telegram | через общий токен, SOCKS5 прокси `vless-proxy:1080` |
|
||
| Модель | **DeepSeek Chat** (`deepseek/deepseek-chat`) |
|
||
| Auxiliary | OpenRouter (`openrouter/auto`) |
|
||
| Vault (хост) | `/mnt/RED_2TB/storage/obsidian` |
|
||
| Vault (контейнер) | `/vault:rw` |
|
||
| obsidian-mcp | `/opt/data/.local/bin/mcpvault /vault` |
|
||
| Scope | sparse: `personal/ + family/` |
|
||
| Toolsets | hermes-cli, file, web, browser |
|
||
| web_search | Tavily (`TAVILY_API_KEY` в .env) |
|
||
| web_extract | ✅ HTTP-парсинг |
|
||
| browser | ✅ Playwright/Chromium (headless, JS-heavy сайты) |
|
||
| Прокси | SOCKS5 `vless-proxy:1080` (HTTP/HTTPS/Telegram — все через прокси) |
|
||
|
||
### SOUL.md — identity & persona (обновлено 2026-05-13)
|
||
|
||
Файл: `/opt/data/SOUL.md` (монтируется в контейнер, читается Hermes на каждый тёрн).
|
||
|
||
**Ключевые изменения 2026-05-13:**
|
||
- Добавлен блок `## Identity` — Тайга не ассистент, а лес: не извиняется, не суетится, говорит прямо
|
||
- Добавлен uncertainty posture: при отсутствии данных говорит "не знаю" / "нет данных в vault", не строит истории
|
||
- Тон исправлен: убрано "тёплая" (активировало female-helper архетип), оставлено "спокойная, уверенная, немногословная"
|
||
- Добавлена обязанность читать и писать в Obsidian (RULE 2, Vault Access с правильными MCP-командами)
|
||
- `display.personality` в config.yaml изменён с `helpful` на `neutral` — убирает Hermes-level "helpful" прайминг поверх soul
|
||
|
||
**Почему важно:** `display: personality: helpful` в config.yaml инжектировался поверх soul.md и был основным источником извинений и гиперкомпенсации.
|
||
|
||
### Починка root-проблемы (2026-05-13)
|
||
Hermes обновился — появилась проверка на root. Контейнер падал с `Refusing to run as root`.
|
||
Фикс: `HERMES_ALLOW_ROOT_GATEWAY=1` + `UV_CACHE_DIR=/tmp/uv-cache` в docker-compose.yml + пересборка с `--no-cache`.
|
||
|
||
> ⚠️ При обновлении образа — всегда `docker build --no-cache`, иначе `.venv` остаётся от root-слоя и ломает permissions.
|
||
|
||
## Obsidian Sync (Taiga)
|
||
|
||
**Скрипт:** `~/sync-vault.sh` (запускается на **хосте**, не в контейнере)
|
||
**Крон:** Hermes cron job `0 * * * *`
|
||
**Bare repo:** `file:///mnt/RED_2TB/storage/git/obsidian-vault.git`
|
||
**Лог:** `/tmp/vault-sync.log`
|
||
|
||
```bash
|
||
# Запустить sync вручную:
|
||
bash ~/sync-vault.sh
|
||
|
||
# Посмотреть лог:
|
||
tail -20 /tmp/vault-sync.log
|
||
|
||
# История коммитов:
|
||
git -C /mnt/RED_2TB/storage/git/obsidian-vault.git log --oneline -10
|
||
```
|
||
|
||
> ⚠️ Скрипт запускается от `truenas_admin` — только этот пользователь имеет ZFS ACL доступ к bare repo и vault папке.
|
||
|
||
Подробности: [[obsidian-sync]]
|
||
|
||
## Home Assistant — что настроено
|
||
|
||
### `configuration.yaml`
|
||
|
||
- `http:` раздел: `use_x_forwarded_for: true`, `trusted_proxies: 172.16.0.0/12` — обязательно для работы через reverse proxy (Caddy)
|
||
- Modbus интеграция для вентиляторов AT2 и заслонок
|
||
- Template sensors (в блоке `template: - sensor:`):
|
||
|
||
| Сенсор | Пример | Описание |
|
||
|--------|--------|----------|
|
||
| `dining_summary` | "24° 450ppm" | Темп и CO₂ в столовой |
|
||
| `dining_air_summary` | "65tvoc 3pm" | TVOC и частицы в столовой |
|
||
| `kids_summary` | "22° 600ppm" | Темп и CO₂ в детской |
|
||
| `bedroom_summary` | "21° 500ppm" | Темп и CO₂ в спальне |
|
||
| `at2_1_summary` | "Off" / "45%" | AT2-1: объединённые on/off + скорость |
|
||
| `at2_2_summary` | "Off" / "45%" | AT2-2: объединённые on/off + скорость |
|
||
|
||
### `automations.yaml`
|
||
|
||
- ГВС циркуляция: вкл (09:30) / выкл (23:00)
|
||
- Вентиляционный вентилятор вкл в 05:00
|
||
- Проходной выключатель кабинета → toggle света в кабинете (`not_from: [unavailable, unknown]` — защита от ложных срабатываний при запуске HA)
|
||
- Подсветка лестницы: вкл/выкл по датчику освещённости
|
||
- Диммер спальни: toggle и цикл яркости
|
||
- Ночной свет в душе: присутствие + освещённость
|
||
- Уведомление: датчик протечки (котельная)
|
||
- Уведомления: низкий заряд батареи (несколько устройств)
|
||
|
||
### Floor Plan Dashboard (`lovelace.home_plan`)
|
||
|
||
Два вида — Ground Floor (`floor1`) и Second Floor (`floor2`) — `picture-elements` поверх SVG фона.
|
||
|
||
**Первый этаж (`floor1`):**
|
||
- Приточные заслонки: столовая (левая/правая), кабинет
|
||
- Вытяжные заслонки: кухня, туалет 1F
|
||
- Вентилятор 3 (кухонная вытяжка)
|
||
- Метки AT2-1 / AT2-2 (`sensor.at2_1_summary` / `sensor.at2_2_summary`)
|
||
- Сауна, обогревательный кабель
|
||
- Свет кабинет (левый/правый)
|
||
- Метка столовой (`sensor.dining_summary`) и качество воздуха (`sensor.dining_air_summary`)
|
||
|
||
**Второй этаж (`floor2`):**
|
||
- Приточные заслонки: детская, спальня, север
|
||
- Вытяжные заслонки: ванная, душ 2F
|
||
- Свет спальни (диммер)
|
||
- Метки: `sensor.kids_summary`, `sensor.bedroom_summary`
|
||
|
||
**SVG dark mode** — встроенный CSS в SVG-файлах:
|
||
```svg
|
||
<style>
|
||
@media (prefers-color-scheme: dark) {
|
||
path, line, polyline, polygon, rect, circle, ellipse { stroke: white; }
|
||
}
|
||
</style>
|
||
```
|
||
|
||
> ЖJSON Lovelace зафиксирован в git по пути `floorplan/lovelace.home_plan.json` (справочный снимок, HA **не** подгружает его автоматически).
|
||
|
||
---
|
||
|
||
## Связанные заметки
|
||
- [[truenas-access]] — SSH-доступ
|
||
- [[truenas-rclone-backup]] — система бэкапов
|
||
- [[obsidian-sync]] — Obsidian sync Eagle ↔ Taiga ↔ Kraken
|
||
- [[openmediavault-rpi5]] — Kraken NAS (Hermes агент, sync)
|