328 lines
19 KiB
Markdown
Executable File
328 lines
19 KiB
Markdown
Executable File
---
|
||
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-27'
|
||
status: deployed
|
||
---
|
||
# *arr Stack на Тайге — Setup & Config
|
||
|
||
> ✅ **STATE 2026-09-27 (v5, вечер): Music-библиотека УДАЛЕНА, БД Jellyfin ВОССТАНОВЛЕНА.**
|
||
> Контейнеры **живы** (prowlarr/radarr/sonarr/jellyfin/transmission, uid 950, media_net на месте).
|
||
> **Индексеры: 3/6 рабочих** (RuTor/Byrutor/NoNaMe ✅; RuTracker/Kinozal — Cloudflare).
|
||
> Итог по Music: библиотека создавалась, скан прошёл (7826 треков, бэкап-папки исключены через
|
||
> `.ignore`), **приёмка Alex в UI провалена** (навигация по папкам) → **полный откат**:
|
||
> `DELETE /Library/VirtualFolders` + восстановление БД из
|
||
> `/home/truenas_admin/jellyfin-config-bak-20260926-203007.tar.gz` (MD5 `b71b5d659a1262fa98b85a6ab0003f24`).
|
||
> **Сейчас: 6 библиотек, Audio=0, MusicArtist=0.**
|
||
> 🔴 **ПРИЧИНА провала: в файлах ОТСУТСТВУЕТ фрейм `TPE2` (albumartist)** — Jellyfin в music-библиотеке
|
||
> строит иерархию по `TPE2`, при его отсутствии уходит в fallback на папки и не читает `TPE1`.
|
||
> Теги **уже в UTF-16 с BOM**, диагноз «CP1251» **опровергнут**. См. [[personal/tech/jellyfin-tags-cp1251-unreadable]].
|
||
> Ремонт (простановка `TPE2` = `TPE1` по 7826 файлам) НЕ начат.
|
||
> **Lidarr НЕ установлен.** План — [[family/plans/music-jellyfin-lidarr-taiga]] (v5).
|
||
|
||
## Архитектура
|
||
|
||
Prowlarr (9696) → Radarr (7878) + Sonarr (8989) → Transmission (9091) → Jellyfin (8096)
|
||
⏳ Lidarr (8686) — не установлен, план Фаза 2.
|
||
|
||
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
|