Files
obsidian-vault/family/projects/media-toolbox-taiga.md
T

321 lines
18 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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/<Title>/
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