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

451 lines
30 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
- flaresolverr
- cloudflare
created: '2026-05-20'
updated: '2026-09-28'
status: deployed
---
# *arr Stack на Тайге — Setup & Config
> ✅ **STATE 2026-09-28: LIDARR РАЗВЁРНУТ — 7-й сервис стека, music-менеджер.**
> Live: **`https://lidarr.mallexxx.duckdns.org`** → HTTP 200, TLS Let's Encrypt, **health ЧИСТЫЙ**.
> Контейнер `lidarr` **v3.1.0.4875-ls42**, порт 8686, uid 950, `media_net` + `caddy_default`.
> API-ключ `166654ac3f054096ae0e8393fb1bf940`. Compose — в общем `/mnt/RED_2TB/docker/arr/docker-compose.yml`.
> Root folder `/storage/Music` (accessible) — **та же папка, что читает Navidrome**.
> Download client Transmission (тест связи 200), naming: `{Artist Name}/{Album Title}/{track:00} - {Track Title}`.
> Prowlarr: Application `Lidarr` id=3 `fullSync`, `syncCategories=[3000…3060]`.
> ⏳ **Приёмка НЕ закрыта:** `api.lidarr.audio` (метаданные SkyHook) → **403 Cloudflare**
> прямым запросом, через `vless-proxy` → **200**. Заготовка `/tmp/add_proxy_env.py` (HTTP_PROXY/
> HTTPS_PROXY + NO_PROXY) — НЕ применена. ⚠️ FlareSolverr тут НЕ помогает: Lidarr ходит
> в SkyHook сам, не через FS → нужен именно `HTTP(S)_PROXY`-подход.
> 🔴 **Индексеры для музыки (проверено 2026-09-28):** аудио отдают только **RuTracker(1)**,
> **NoNaMe(4)**, **Kinozal(5,6)**. **RuTor и Byrutor — `music-search available="no"`, музыки НЕТ.**
> ✅ Все 4 аудио-индексера разблокированы 2026-09-28 (FlareSolverr) — [[personal/tech/flaresolverr-taiga]].
> В Lidarr проброшен `NoNaMe Club (Prowlarr)`. Полный разбор, 7 питфоллов и креды Transmission —
> [[family/plans/lidarr-taiga-deploy]] §ФАКТИЧЕСКОЕ СОСТОЯНИЕ.
> ✅ **STATE 2026-09-28 (вечер): ИНДЕКСЕРЫ 6/6 РАБОЧИЕ — FlareSolverr развёрнут.**
> Все блокеры сняты. Было 3/6, стало 6/6, `health` и `indexerstatus` → `[]` (пусто).
> Поиск «matrix» → **256 результатов** (RuTor 100, RuTracker 50, NoNaMe 50, Kinozal 50, Byrutor 6).
> **RuTracker впервые `valid` за всё время стека (с 2026-05-20).** Карантины id 1/5/6 сняты.
> Схема: два прокси-элемента в Prowlarr — `vless-socks5` (DNS-блок) + `flaresolverr` (Cloudflare),
> теги `[1,2]` на CF-индексеры. FlareSolverr сам ходит через `vless-proxy` (`PROXY_URL`).
> Контейнер `flaresolverr` в `arr/docker-compose.yml`, `8191`, `shm_size: 1gb`, `LOG_LEVEL=warning`.
> 🔴 Главный питфолл: FS-сессия `prowlarr`, созданная ДО появления `PROXY_URL`, навсегда
> остаётся без прокси → `ERR_NAME_NOT_RESOLVED` → ложное «blocked by CloudFlare».
> Лечится `sessions.destroy`. Swap НЕ нужен (RAM 21 GB) — Alex отклонил.
> Полный разбор, все питфоллы и команды — [[personal/tech/flaresolverr-taiga]].
> 🔴 **ПИТФОЛЛ 2026-09-28: `429 TooManyRequests` от Prowlarr ≠ rate limit.** Это **карантин**
> (`disabledTill`) — Prowlarr отдаёт 429 на ЛЮБОЙ запрос к индексеру, пока тот в карантине.
> Лечится `POST /api/v1/indexer/testall` (сбрасывает `disabledTill`), **не ожиданием**.
> Проверять `GET /api/v1/indexerstatus`. Тот же симптом сбил диагностику синка Prowlarr→Lidarr.
>
> 🔴 **ПИТФОЛЛ 2026-09-28: Transmission требует логин/пароль.** `rpc-authentication-required: true`,
> юзер `transmission_admin`. Креды — в env `/mnt/RED_2TB/docker/transmission/docker-compose.yml`
> (`USER`/`PASS`). Без них любой новый download client даёт `400 Authentication failure`.
>
> 🔴 **ПИТФОЛЛ 2026-09-28: запись в root-owned Caddyfile.** `docker cp` на bind-mounted файле
> падает `device or resource busy`; `docker run alpine -v /:/host:rw` блокируется апрувом.
> РАБОЧИЙ путь: `docker exec -i caddy sh -c 'cat > /etc/caddy/Caddyfile' < /tmp/new.txt`.
> ✅ **STATE 2026-09-27 (v6, ночь): NAVIDROME РАЗВЁРНУТ — музыкальный сервер для `Music/`.**
> Контейнер **`navidrome`** (v0.64.2) на порту **4533**, домен **`https://music.mallexxx.duckdns.org`**
> (Caddy, Let's Encrypt). Compose — `/mnt/RED_2TB/docker/navidrome/docker-compose.yml`.
> Музыка смонтирована **`rw`** (`/mnt/RED_2TB/storage/Music` → `/music`) по явному решению Alex.
> **Скан завершён: 8043 трека.** Бэкап-папки исключены через `/storage/Music/.ndignore`.
> ✅ **Главное: Navidrome читает ТЕГИ, папки игнорирует** — артисты `ДДТ`, `Красная Плесень`
> из тегов, а не `!Rock&Folk` / `z Другое`. Баг Jellyfin #18162 здесь отсутствует.
> План и все питфоллы деплоя — [[family/how-to/navidrome-truenas-android]] §v4.
> **Jellyfin остаётся для ВИДЕО** (6 библиотек, музыка там не создаётся).
> ⚠️ **Jellyfin-библиотека музыки НЕ создаётся:** попытка 2026-09-27 провалена (баг #18162,
> навигация по папкам) → полный откат, БД восстановлена. Музыка → только Navidrome.
> ✅ **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)
Navidrome (4533) ← `/storage/Music` — ✅ развёрнут 2026-09-27, читает ТЕГИ (не папки)
⏳ Lidarr (8686) — план составлен 2026-09-28, ждёт «go». Связка с NAVIDROME.
→ [[family/plans/lidarr-taiga-deploy]] §2026-09-28
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 |
| **Navidrome** | **https://music.mallexxx.duckdns.org** — ✅ **развёрнут 2026-09-27** (музыка) |
| Transmission | https://transmission.mallexxx.duckdns.org (уже был) |
| Lidarr | https://lidarr.mallexxx.duckdns.org — ⏳ **НЕ установлен**; план составлен 2026-09-28, ждёт «go» ([[family/plans/lidarr-taiga-deploy]] §2026-09-28) |
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/` | Музыка (8043 трека в Navidrome, 9 категорий) | ✅ **Navidrome** (не Jellyfin!) |
| `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.
### ✅ Перепроверено 2026-09-28 (важно: часть «блокеров» закрыта)
| Проверка | Результат |
|---|---|
| `vless-proxy` в `media_net` | ✅ `172.16.17.6`, `getent hosts vless-proxy` из prowlarr OK |
| `curl -x socks5h://vless-proxy:1080 https://rutracker.org/` | ✅ **301** |
| `… https://nnmclub.to/` | ✅ **200** |
| `… https://kinozal.me/` | ✅ **200** |
| `… https://kinozal.tv/` | ❌ **000** (домен мёртв — подтверждено) |
| `GET /api/v1/indexerproxy` | `vless-socks5` id=1, Socks5, host `vless-proxy`, port 1080, tags=[1] |
| `GET /api/v1/tag` | `proxy` id=1 (таблица Tags **не пуста** — поправка к записи 2026-09-26) |
| `GET /api/v1/indexer` | все 6 `enable=true`, **tags=[1]** (до правки 2026-09-28) |
| `GET /api/v1/search?query=matrix` | RuTor **100**, Byrutor **6** (до FS) |
| `GET /api/v1/indexerstatus` | карантин: id **1, 5, 6** (`disabledTill` +24 ч); 2/3/4 чисты |
| `docker ps -a` grep flare | **NONE** — FlareSolverr отсутствовал до 2026-09-28 |
**Итог на тот момент: остаточная проблема — ТОЛЬКО Cloudflare**, DNS-блок снят прокси-маршрутом.
`GET rutracker.org/forum/login.php` через прокси → `<title>Just a moment...</title>`
(+`challenges.cloudflare.com`) = JS-челлендж, который Prowlarr сам не проходит.
✅ **ЗАКРЫТО 2026-09-28:** FlareSolverr развёрнут → **6/6 индексеров valid**, карантины сняты,
поиск 256. Полный разбор — [[personal/tech/flaresolverr-taiga]].
🔴 **`429 TooManyRequests` от Prowlarr = карантин, не rate-limit.** Снимается
`POST /api/v1/indexer/testall` (или одиночными тестами), НЕ ожиданием.
Проверять `GET /api/v1/indexerstatus`.
⚠️ **Питфолл API на Тайге (проверено 2026-09-28):** передача `X-Api-Key` через вложенный
`docker exec … sh -c 'curl -H "X-Api-Key: …"'` съедает кавычки → **401 Unauthorized**,
хотя ключ верный. 🔴 **Рабочий приём — файл-заголовок:**
```bash
docker exec prowlarr sh -c 'printf "X-Api-Key: 35c8b3f497114076a6150ea0d9504845" > /tmp/h.txt; \
curl -s -H @/tmp/h.txt http://localhost:9696/api/v1/indexer'
```
Внутри контейнера `python3` НЕТ (только `curl` есть в linuxserver-образах) — JSON разбирать
хостовым `python3` через файл: `docker exec … > /tmp/ix.json` → `python3 -c "…"`.
Также `wget` из busybox не умеет `-H` с кавычками — предпочитать `curl -H @file`.
## Prowlarr — прокси для заблокированных индексеров
`vless-proxy` доступен в `media_net` как `vless-proxy` (SOCKS5 **1080**, HTTP **1081**).
Настройка (финал 2026-09-28):
- Прокси `vless-socks5` (id=1), Type `Socks5`, Host `vless-proxy`, Port `1080` — тег `proxy` (id=1)
- Прокси `flaresolverr` (id=2), Type `FlareSolverr`, Host `http://flaresolverr:8191/`,
**`requestTimeout=180`** — тег `flaresolverr` (id=2)
- **Индексерам за CF нужны ОБА тега `[1,2]`**: id 1, 4, 5, 6. id 2, 3 → `[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.
>
> ✅ **РЕШЕНО 2026-09-28: FlareSolverr развёрнут, все 6 индексеров valid.**
> Прокси-элемент `flaresolverr` (id=2, host `http://flaresolverr:8191/`, `requestTimeout=180`),
> теги `[1,2]` на RuTracker/NoNaMe/Kinozal/Kinozal(M).
> FS ходит через `vless-proxy` через env **`PROXY_URL=socks5://vless-proxy:1080`**.
> Пруф: `rutracker.org/forum/login.php` → `Challenge solved!` 200.
> `health` → `[]`, `indexerstatus` → `[]`, поиск «matrix» → **256 результатов**.
> Полный разбор, 5 питфоллов и команды — [[personal/tech/flaresolverr-taiga]].
>
> 🔴 **Важно для RuTracker/Kinozal: `kinozal.tv` МЁРТВ** (NXDOMAIN даже на выходной стороне прокси) —
> использовать `kinozal.me` (через прокси → 200).
## Индексеры (те же что на Кракене)
| id | Имя | Примечание |
|-----|-----|-----------|
| 1 | RuTracker | через прокси **+ FlareSolverr**; ✅ работает (2026-09-28) |
| 2 | RuTor | через прокси; ✅ работает |
| 3 | Byrutor | через прокси; ✅ работает; `enableRss: false` |
| 4 | NoNaMe Club | через прокси; ✅ работает (FS-тег не навешен — не требуется) |
| 5 | Kinozal | через прокси **+ FlareSolverr**; ✅ `Challenge solved!` на `kinozal.me/browse.php` |
| 6 | Kinozal (M) | через прокси **+ FlareSolverr**; ✅ из 6/6 ключевое — `isValid=true` |
`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-09-28 (вечер)** — ✅ **ВЫПОЛНЕНО: FlareSolverr развёрнут → индексеры 6/6.**
Контейнер `flaresolverr` добавлен в `arr/docker-compose.yml` (`8191`, `media_net`,
`shm_size: 1gb`, `LOG_LEVEL=warning`, `PROXY_URL=socks5://vless-proxy:1080`).
Прокси-элемент `flaresolverr` (id=2, `requestTimeout=180`) + теги `[1,2]` на CF-индексеры.
`health` → `[]`, `indexerstatus` → `[]`, поиск «matrix» → **256**.
Главный питфолл — FS-сессия `prowlarr` не наследует `PROXY_URL` (лечится `sessions.destroy`).
Swap не трогали (RAM хватает) — Alex отклонил идею.
Полный разбор — [[personal/tech/flaresolverr-taiga]].
- **2026-09-28 (утро)** — разведка под задачу «поставить FlareSolverr как на Кра́кене».
Подтверждено, что **DNS-блокер уже закрыт** (прокси-маршрут от 2026-09-26: rutracker 301 /
nnmclub 200 / kinozal.me 200; поиск RuTor 100 + Byrutor 6). Остаточная проблема —
**Cloudflare JS-челлендж** на RuTracker/Kinozal/Kinozal(M). План —
[[personal/plans/flaresolverr-taiga-deploy]].
- **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** — прокси-обход никогда не работал.
Исправлено в тот же день (3/6 индексеров).
- **2026-05-20** — первоначальный деплой
## Связанные заметки
- [[personal/tech/flaresolverr-taiga]] — ✅ **FlareSolverr на Тайге: 6/6 индексеров, все 5 питфоллов** (2026-09-28)
- [[personal/plans/flaresolverr-taiga-deploy]] — ✅ **выполненный план** FlareSolverr на Тайге + снятие карантина индексера
- [[personal/plans/lidarr-taiga-and-indexer-unblock]] — ⏳ **план 2026-09-26:** Lidarr на Тайге + разблокировка индексеров (DNS-фильтр ✅ закрыт 2026-09-28)
- [[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