16 KiB
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 фон второго этажа |
Перезапуск после редактирования конфига:
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 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"
Применить после изменений:
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, или:
midclt call initshutdownscript.query
Текущая запись (id 1, POSTINIT, comment: "Map ttyUSB"):
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
# Запустить 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-файлах:
<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)