--- title: '*arr Stack на Тайге — Setup & Config' namespace: family type: reference tags: - taiga - radarr - sonarr - prowlarr - jellyfin - arr - media - lidarr - dns created: '2026-05-20' updated: '2026-09-26' status: deployed --- # *arr Stack на Тайге — Setup & Config > 🔴 **STATE 2026-09-26 (разведка, изменений НЕ вносилось):** > Контейнеры **живы** (prowlarr/radarr/sonarr/jellyfin/transmission, uid 950, media_net на месте). > **Индексеры НЕ работают** — DNS-фильтр провайдера Тайги, `initialFailure = 2026-05-20` > (со дня деплоя). Прокси-обход (vless-proxy) **не подключён к media_net** → никогда не работал. > Плюс RemotePathMapping не выставлен → health-ошибка в Radarr/Sonarr. > **Lidarr НЕ установлен.** **Music-библиотеки в Jellyfin нет** (заблокирована ремонтом тегов). > План: [[personal/plans/lidarr-taiga-and-indexer-unblock]] — ждёт 2 ответов Alex. ## Архитектура Prowlarr (9696) → Radarr (7878) + Sonarr (8989) → Transmission (9091) → Jellyfin (8096) Staging папки (`radarr/`, `sonarr/`) невидимы в Jellyfin. Router скрипт создаёт симлинки из staging → категоризированные библиотеки по NFO (genre + mpaa). ``` Transmission → /mnt/storage/Downloads Radarr импортирует → /storage/radarr// Sonarr импортирует → /storage/sonarr/<Title>/ router.py (--apply) movies/ cartoons/ series/ cartoons-series/ documentaries/ documentaries-series/ ↓ Jellyfin ``` ## Web UI (HTTPS через Caddy) | Сервис | URL | |--------|-----| | Radarr | https://radarr.mallexxx.duckdns.org | | Sonarr | https://sonarr.mallexxx.duckdns.org | | Prowlarr | https://prowlarr.mallexxx.duckdns.org | | Jellyfin | https://jellyfin.mallexxx.duckdns.org | | Transmission | https://transmission.mallexxx.duckdns.org (уже был) | | Lidarr | https://lidarr.mallexxx.duckdns.org — ⏳ **НЕ установлен** (план, Фаза 1) | Caddy: subdomain-based роутинг, без URL Base. Let's Encrypt автоматически. > Правка Caddyfile — **только через alpine-контейнер** (Caddyfile root-owned, `truenas_admin` > писать не может). Отправлять **весь файл**, не патч. См. skill `truenas-caddy-service-deploy`. ## Docker **Compose:** `/mnt/RED_2TB/docker/arr/docker-compose.yml` **Config dirs:** `/mnt/RED_2TB/docker/arr/{prowlarr,radarr,sonarr,jellyfin}/` **PUID/PGID:** 921/921 (user `transmission`, тот же что владеет `/storage/`) ### Сети | Контейнер | Сети | |-----------|------| | prowlarr | media_net + caddy_default | | radarr | media_net + caddy_default | | sonarr | media_net + caddy_default | | jellyfin | caddy_default | | transmission | transmission_default + **media_net** (персистентно в compose) | | vless-proxy | hermes_taiga_net + **media_net** (персистентно в compose, добавлено 2026-09-26) | > ✅ **ПОПРАВКА 2026-09-26 (проверено на живой машине):** строка про `vless-proxy` в `media_net` была > **НЕВЕРНА.** Факт на момент начала сессии: `docker inspect vless-proxy` → только `hermes_taiga_net` > (172.16.15.2). `docker network inspect media_net` → участники `prowlarr radarr transmission sonarr`. > `docker exec prowlarr getent hosts vless-proxy` → NO DNS. > Следствие: прокси-маршрут для индексеров, описанный в §«Prowlarr — прокси», **никогда не работал**. > > ✅ **ИСПРАВЛЕНО 2026-09-26:** `media_net` добавлена в `/mnt/RED_2TB/docker/vless-proxy/docker-compose.yml` > (persistent) + контейнер пересоздан `--force-recreate`. Теперь `vless-proxy` = `172.16.17.6` в `media_net`, > `getent hosts vless-proxy` из prowlarr/radarr резолвится. Полный разбор — [[family/plans/lidarr-taiga-deploy]] Фаза 0. > > ⚠️ **ПОПРАВКА PUID/PGID:** `921/921` устарело (см. строку выше про PUID 921 — артефакт до > restore-инцидента). Факт 2026-09-26: **все сервисы стека под uid 950**, `PUID=950 PGID=950` > в compose. `921` — старый uid transmission, не используется. `media_net` — внешняя сеть, создана вручную: `docker network create media_net` ## Хранилище **Host:** `/mnt/RED_2TB/storage/` → внутри контейнеров: `/storage/` **Transmission mount:** `/mnt/RED_2TB/storage/` → `/mnt/storage/` ### Папки | Папка | Назначение | Jellyfin | |-------|-----------|----------| | `radarr/` | Radarr root (staging) | ❌ | | `sonarr/` | Sonarr root (staging) | ❌ | | `Movies/` | Фильмы (симлинки + старый контент) | ✅ Movies | | `Cartoons/` | Мультики (симлинки + старый контент) | ✅ Cartoons | | `series/` | Сериалы | ✅ Series | | `cartoons-series/` | Мультсериалы | ✅ Cartoon Series | | `documentaries/` | Документалки | ✅ Documentaries | | `documentaries-series/` | Документальные сериалы | ✅ Documentary Series | | `Music/` | Музыка (7890 аудиофайлов, 8 категорий) | ⏳ **библиотеки ещё нет** — план 2026-09-26 | | `Downloads/` | Торренты (Transmission) | ❌ | Все папки: uid=921, gid=921, NFSv4 ACL через midclt. > 📌 **`Music/` на 2026-09-26:** файлы лежат, `/storage` уже смонтирован в контейнер (ro), но виртуальной папки Music в Jellyfin **нет**. Разведка + 6-шаговый план (бэкап → `POST /Library/VirtualFolders` → скан → приёмка) — [[family/how-to/jellyfin-config]] §«Taiga (TrueNAS)». Доп. монтирование НЕ требуется. > ⚠️ Структура `Music/` — плоские категории (`!Rock&Folk`, `!Retro`, `!Классика`), НЕ `Artist/Album` → для `collectionType=music` Jellyfin раскладывает по тегам, риск «Unknown Artist». ## API ключи | Сервис | Prefix | |--------|--------| | Radarr | `51e201f2` | | Sonarr | `b1eb9cdd` | | Prowlarr | `35c8b3f4` | | Jellyfin | `eaglesetup2026taiga` | Получить полный ключ: `docker exec <svc> grep ApiKey /config/config.xml` Jellyfin token создан вручную через sqlite — хранится в `/mnt/RED_2TB/docker/arr/jellyfin/data/data/jellyfin.db`. ## Remote Path Mapping (Radarr + Sonarr) — ⚠️ НЕ ПРИМЕНЁН, health жалуется Transmission монтирует `/mnt/RED_2TB/storage/` → `/mnt/storage/` Radarr/Sonarr монтируют `/mnt/RED_2TB/storage/` → `/storage/` > 🔴 **ФАКТ 2026-09-26: этого маппинга в API Radarr/Sonarr НЕТ.** Health обоих даёт: > ``` > RemotePathMappingCheck error > "download client Transmission places downloads in /storage/Downloads/radarr > but this directory does not appear to exist inside the container" > ``` > > **Фактическая причина (опровергает предположение ниже):** Transmission **не раскладывает** по > `Downloads/radarr` — download-dir плоский: > ```json > {"download-dir": "/mnt/storage/Downloads", > "incomplete-dir": "/mnt/storage/Downloads/transmission/incomplete", > "script-torrent-done-enabled": false, "rpc-url": "/transmission/", > "rpc-whitelist": "172.16.*.*"} > ``` > Radarr ОЖИДАЕТ подкаталог категории (`/storage/Downloads/radarr`) — его нет. > Разбирать в Фазе 4 плана [[family/plans/lidarr-taiga-deploy]]. Предполагаемый маппинг в каждом (задумано, но не выставлено): - host: `transmission` - remotePath: `/mnt/storage/Downloads/` - localPath: `/storage/Downloads/` ## 🔴 Индексеры НЕ РАБОТАЮТ: DNS-фильтр провайдера (найдено 2026-09-26) **Все 6 индексеров в карантине (`disabledTill` = +24 ч), `initialFailure = 2026-05-20`** (дата первоначального деплоя) → **не работали ни одного дня.** ``` GET /api/v1/health (prowlarr) → "Indexers unavailable due to failures for more than 6 hours: RuTracker, RuTor, NoNaMe Club, Kinozal, Kinozal (M)" ``` **Корень — NXDOMAIN на трекеры, и с роутера, и с 8.8.8.8:** ```bash nslookup rutracker.org 192.168.2.2 # роутер → NXDOMAIN nslookup rutracker.org 8.8.8.8 # Google → NXDOMAIN nslookup google.com 192.168.2.2 # → OK ``` | Домен | DNS | |---|---| | `rutracker.org` | ❌ NXDOMAIN | | `rutor.info` | ❌ NXDOMAIN | | `kinozal.tv` | ❌ NXDOMAIN | | `nnmclub.to` | ❌ NXDOMAIN | | `byrutgame.org` | ✅ 185.200.198.230 | | `google.com` | ✅ | > Это **не Pi-hole и не роутер** (8.8.8.8 тоже NXDOMAIN) — блок на стороне аплинка Тайги. > Это **другой** класс, чем задокументированные «Cloudflare 403 на indexers.prowlarr.com» > и «RuTracker Turnstile»: здесь DNS не отдаёт IP вообще. Прокси для обхода описан в §«Prowlarr — прокси». **✅ 2026-09-26: прокси-маршрут починен** — 3 из 6 индексеров работают. Полный разбор — [[family/plans/lidarr-taiga-deploy]] Фаза 0. ## Prowlarr — прокси для заблокированных индексеров `vless-proxy` доступен в `media_net` как `vless-proxy` (SOCKS5 **1080**, HTTP **1081**). Настройка (фактическое состояние после 2026-09-26): - Прокси `vless-socks5` (id=1), Type `Socks5`, Host `vless-proxy`, Port `1080` - Тег `proxy` (id=1) — создан; **все 6 индексеров** имеют tags `[1]` > ✅ **ИСПРАВЛЕНО 2026-09-26.** До этого таблица `Tags` в `prowlarr.db` была **ПУСТА**, > а `Indexers.Tags` ссылался на висячий id `[1]`; `IndexerProxies.Tags` = `[]`. > Прокси физически не был привязан ни к чему → все индексеры падали в NXDOMAIN. > > **Результат `POST /api/v1/indexer/testall` (2026-09-26):** > > | id | Индексер | Статус | > |---|---|---| > | 1 | RuTracker | ❌ `403 Cloudflare "Just a moment..."` на `/forum/login.php` | > | 2 | RuTor | ✅ OK | > | 3 | Byrutor | ✅ OK | > | 4 | NoNaMe Club | ✅ OK | > | 5 | Kinozal | ❌ `blocked by CloudFlare Protection` | > | 6 | Kinozal (M) | ❌ `blocked by CloudFlare Protection` | > > RuTracker: `GET /forum/index.php` → **200**, `POST /forum/login.php` → **403 Cloudflare JS-challenge**. > Остаточная проблема — Cloudflare, НЕ DNS. Решение — FlareSolverr (не установлен, ждём решение Alex). > > 🔴 **Важно для RuTracker/Kinozal: `kinozal.tv` МЁРТВ** (NXDOMAIN даже на выходной стороне прокси) — > использовать `kinozal.me` (через прокси → 200). ## Индексеры (те же что на Кракене) | id | Имя | Примечание | |-----|-----|-----------| | 1 | RuTracker | через прокси; ⚠️ Cloudflare-челлендж на логине | | 2 | RuTor | через прокси; ✅ работает | | 3 | Byrutor | через прокси; ✅ работает; `enableRss: false` | | 4 | NoNaMe Club | через прокси; ✅ работает | | 5 | Kinozal | через прокси; ⚠️ Cloudflare Protection; URL должен быть `kinozal.me` | | 6 | Kinozal (M) | через прокси; ⚠️ Cloudflare Protection; магнет, без grab limit — предпочтительный | `preferMagnetUrl: true` для всех → нет дневного лимита на .torrent. ## router.py **Скрипт:** `/mnt/RED_2TB/docker/arr/media-pipeline/router.py` Адаптация kraken-версии с изменёнными путями: ```python MEDIA_BASE = Path("/mnt/RED_2TB/storage") SOURCES = [ ("movie", MEDIA_BASE / "radarr"), ("series", MEDIA_BASE / "sonarr"), ] TARGETS = { "movies": MEDIA_BASE / "Movies", "series": MEDIA_BASE / "series", "cartoons": MEDIA_BASE / "Cartoons", "cartoons-series": MEDIA_BASE / "cartoons-series", "documentaries": MEDIA_BASE / "documentaries", "documentaries-series": MEDIA_BASE / "documentaries-series", } JELLYFIN_URL = "http://jellyfin:8096" # или по IP ``` Запуск вручную (авто-хука нет): ```bash ssh truenas_admin@mallexxx.duckdns.org "python3 /mnt/RED_2TB/docker/arr/media-pipeline/router.py" # проверить, затем: ssh truenas_admin@mallexxx.duckdns.org "python3 /mnt/RED_2TB/docker/arr/media-pipeline/router.py --apply" ``` ## Отличия от Кракена | | Kraken | Taiga | |--|--------|-------| | Reverse proxy | nginx path-based (`/sonarr`) | Caddy subdomain-based | | HTTPS | нет | автоматически (Let's Encrypt) | | PUID/PGID | 1000/1000 | 921/921 (transmission) | | Staging папки | `movies-radarr/`, `series-sonarr/` | `radarr/`, `sonarr/` | | Прокси для индексеров | нет | vless-proxy SOCKS5 (hermes_taiga_net) | | Авто-синк (watchlist) | ❌ (был, убрали) | ❌ нет | | Jellyfin users | alex + lisa | только alex | | PGS→SRT | pgsrip + cron | TBD (при необходимости) | ## Pitfalls (задокументировано при деплое) - `d---------` на папках в ls — это норма для NFSv4 ACL на TrueNAS. Реальные права через `midclt call filesystem.getacl` - Не трогать ACL существующих папок (Movies, Cartoons, Downloads) — только новые - После alpine `chown` NFSv4 ACE слетают — нужно повторно применять через midclt `filesystem.setacl` - `indexers.prowlarr.com` отдаёт 403 Cloudflare с IP Тайги → Prowlarr не может скачать Cardigann definitions. Решение: скопировать `/config/Definitions/` с Кракена (549 yml-файлов) - После старта Prowlarr `/indexer/schema` недоступен ~2-3 мин (HTTP timeout к indexers.prowlarr.com). Ждать - POST /indexer зависает при добавлении Cardigann через API (capability check). Решение: import через SQLite напрямую с Кракена - Jellyfin 10.11: `name` в POST `/Library/VirtualFolders` должен быть в **query string** (`?name=Movies&collectionType=movies`), не в body - Transmission whitelist задаётся через env var `WHITELIST` в compose — settings.json перезаписывается при старте - Transmission compose location: `/mnt/RED_2TB/docker/transmission/docker-compose.yml` - ⚠️ **УТОЧНЕНО 2026-09-26: `python3` на хосте Тайги ЕСТЬ** (использовался для разбора JSON). Не хватает **`curl`** и **`sqlite3`**. Рабочий паттерн API-вызовов — **`wget` внутри контейнера + хостовый `python3` для разбора**: ```bash ssh truenas_admin@mallexxx.duckdns.org \ "docker exec prowlarr sh -c 'wget -qO- --header=\"X-Api-Key: <KEY>\" http://localhost:9696/api/v1/health'" ``` busybox-`wget` умеет только `-qO-` / `--header` / `--timeout`; **`-e use_proxy=yes` НЕ поддерживает (GNU-опция)** → прокси-тесты внутри контейнера этим способом невозможны. - ⚠️ **Shell-экранирование JSON через ssh** — кавычки в `--header` ломаются на нескольких уровнях. Рабочий приём: писать результат **в файл** внутри контейнера/на хосте, разбирать отдельно. - ⚠️ **`/etc/resolv.conf` контейнеров** = `nameserver 127.0.0.11` (Docker embedded DNS) → в контейнерах нет `getent`; для проверки DNS использовать `nslookup`/`wget`. ## История - **2026-05-20** — первоначальный деплой - **2026-09-26** — разведка под задачу «Lidarr + музыка + синк с Jellyfin». Стек жив, но **индексеры не работают с дня деплоя** (DNS-фильтр провайдера: NXDOMAIN на rutracker.org / rutor.info / kinozal.tv / nnmclub.to с 8.8.8.8 и роутера; `byrutgame.org` резолвится). Обнаружено, что **vless-proxy НЕ подключён к media_net** — прокси-обход никогда не работал. План и 2 открытых вопроса — [[personal/plans/lidarr-taiga-and-indexer-unblock]]. Изменений нет. ## Связанные заметки - [[personal/plans/lidarr-taiga-and-indexer-unblock]] — ⏳ **активный план 2026-09-26:** Lidarr на Тайге + разблокировка индексеров (DNS-фильтр провайдера) - [[personal/tech/music-tags-repair-truenas]] — ремонт 7906 битых тегов (блокирует Music-библиотеку) - [[family/how-to/jellyfin-config]] — живой инстанс Jellyfin на Тайге - [[personal/tech/truenas-nfs4-acl-and-arrmultiuser]] — NFSv4 ACL и uid 950