--- title: '*arr Stack на Тайге — Setup & Config' namespace: family type: reference tags: - taiga - radarr - sonarr - prowlarr - jellyfin - arr - media created: '2026-05-20' updated: '2026-05-20' status: deployed --- # *arr Stack на Тайге — Setup & Config ## Архитектура 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 (уже был) | Caddy: subdomain-based роутинг, без URL Base. Let's Encrypt автоматически. ## 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** (подключён вручную) | | vless-proxy | hermes_taiga_net + **media_net** (подключён вручную) | `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 | | `Downloads/` | Торренты (Transmission) | ❌ | Все папки: uid=921, gid=921, NFSv4 ACL через midclt. ## 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) Transmission монтирует `/mnt/RED_2TB/storage/` → `/mnt/storage/` Radarr/Sonarr монтируют `/mnt/RED_2TB/storage/` → `/storage/` Маппинг в каждом: - host: `transmission` - remotePath: `/mnt/storage/Downloads/` - localPath: `/storage/Downloads/` ## Prowlarr — прокси для заблокированных индексеров vless-proxy доступен в `media_net` как `vless-proxy:1080` (SOCKS5). Настройка в Prowlarr: Settings → Indexers → Add Proxy: - Type: SOCKS5 - Host: `vless-proxy`, Port: `1080` - Tags: `[proxy]` Индексеры с тегом `proxy`: RuTracker (заблокирован в РФ), остальные — по усмотрению. ## Индексеры (те же что на Кракене) | Имя | Примечание | |-----|-----------| | RuTracker | через прокси | | RuTor | | | Byrutor | enableRss: false | | NoNaMe Club | | | Kinozal | | | Kinozal (M) | магнет, без 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` - На Тайге нет `curl` и `python3` в PATH хоста (zsh) — только внутри контейнеров. Скрипты запускать через `docker exec` или python3-файлами через scp ## История - **2026-05-20** — первоначальный деплой