Files
obsidian-vault/family/how-to/arr-stack-kraken.md
T

23 KiB
Raw Blame History

title, created, updated, type, namespace, tags, related
title created updated type namespace tags related
Arr Stack — Kraken 2026-05-23 2026-09-20 tech family
arr
radarr
sonarr
prowlarr
transmission
jellyfin
infra
kraken
tech/jellyfin-config
tech/arr-stack-taiga
concepts/kraken-media-stack

Arr Stack — Kraken

Pipeline

Prowlarr → Radarr + Sonarr → Transmission → Jellyfin
                                   ↓
                            router.py (cron 10min)
                                   ↓
                      symlinks → /media/{movies,cartoons,series,documentaries,...}/

Два параллельных пути поступления контента:

  1. Radarr/Sonarr → качают в /media/movies-radarr/ и /media/series-sonarr/
  2. Transmission (ручные торренты) → on-download-complete.sh → sync.py → /media/{movies,cartoons,...}/

router.py — жанровая маршрутизация

router.py читает NFO-файлы (которые Radarr/Sonarr создают при загрузке), определяет жанр и возрастной рейтинг, и создаёт symlink в нужную Jellyfin-библиотеку:

Источник Условие Цель
movies-radarr/ Documentary /media/documentaries/
movies-radarr/ Animation + !R/18+ /media/cartoons/
movies-radarr/ всё остальное /media/movies/
series-sonarr/ Documentary /media/documentaries-series/
series-sonarr/ Animation + !TV-MA /media/cartoons-series/
series-sonarr/ всё остальное /media/series/

Расположение: /srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/docker/media-pipeline/router.py Запуск: python3 router.py --dry-run (проверка) / python3 router.py --apply (исполнение)

media-router.sh — cron-скрипт для Telegram-уведомлений

Обёртка над router.py, которая:

  • запускает router.py --apply
  • если Nothing to do — SILENT, ничего не шлёт
  • если созданы symlink'и или ошибка — отправляет отчёт в Telegram Kraken

Расположение: рядом с router.py — media-router.sh Cron (Kraken crontab): каждые 10 минут Telegram: kraken_htpc_bot → чат @mallex87

sync.py — обработка ручных торрентов (Transmission)

sync.py работает внутри Transmission-контейнера. При завершении загрузки:

  1. Определяет название через TMDB API
  2. Определяет жанр
  3. Перемещает файл в /media/{movies,cartoons,series,documentaries}/
  4. Обновляет downloadDir в Transmission через RPC

Расположение: /srv/.../docker/media-pipeline/sync.py Триггер: on-download-complete.sh (смонтирован в Transmission как /config/on-download-complete.sh:ro)

Transmission

  • download-dir: /downloads (без complete)
  • incomplete-dir: /downloads/incomplete
  • Язык: отключён auth для локальных
  • RPC: localhost:9091

При перемещении файлов для уже завершённых торрентов:

  1. Переименовать файл/папку под кейс торрента (Linux ext4 case-sensitive)
  2. Вызвать torrent-set-location с move=false
  3. Запустить торрент на сидирование

Cron'ы на Kraken (crontab)

0  *  * * *  bash ~/scripts/sync-vault.sh                     # Obsidian sync
0  *  * * *  pgs-to-srt.sh /media/downloads                   # PGS→SRT новые
0  3  * * *  pgs-to-srt.sh /media                              # PGS→SRT вся библиотека
0  1  * * *  bash ~/scripts/watchlist-nightly.sh               # watchlist nightly
0  9  * * 0  bash ~/scripts/watchlist-discover.sh              # watchlist discover
*/10 * * * * bash .../media-pipeline/media-router.sh           # media router (Telegram)

API Keys

Service API Key
Radarr cbcb8ec3...
Sonarr 15fbec32...
Prowlarr 134ac38a...

(Full keys truncated — retrieve from each service's settings page.)

Качество загрузки для НОВЫХ фильмов/сериалов (2026-09-04)

watchlist-sync (автодобавление из watchlist) использует профиль WEB-4K (no remux) (Radarr id 7, Sonarr id 7) вместо бывшего Any/id=1.

Что разрешает профиль (в порядке предпочтения, кодированные, БЕЗ remux/BR-DISK):

  • 2160p: HDTV / WEBDL / WEBRip / BluRay-2160p (кодир.)
  • fallback 1080p: HDTV / WEBDL / WEBRip / BluRay-1080p (кодир.)
  • fallback 720p: HDTV / WEBDL / WEBRip / BluRay-720p (кодир.)
  • Запрещены: Remux-1080p, Remux-2160p, BR-DISK, Raw-HD, SDTV/DVD/480/576.
  • cutoff = Bluray-2160p (кодир.); upgrade выключен после скачивания.

Где менять: watchlist-sync/watchlist_sync/arr.py строки qualityProfileId: 7 (radarr_add ~L77, sonarr_add ~L112). НЕ редактировать профили вручную иначе watchlist-sync надо обновить на новый id. Создать/править профиль «WEB-4K (no remux)» — Radarr/Sonarr → Settings → Quality Profiles.

Ports (default Docker network)

All services accessible at kraken:<port>:

Service Port
Radarr 7878
Sonarr 8989
Prowlarr 9696
Transmission 9091
Jellyfin 8096

Jellyfin библиотеки

Библиотека Тип Путь
Movies movies /media/movies
Series tvshows /media/series
Cartoons movies /media/cartoons
Cartoon Series tvshows /media/cartoons-series
Documentaries movies /media/documentaries
Documentary Series tvshows /media/documentaries-series

movies-radarr и series-sonarr НЕ добавлены в Jellyfin — router.py создаёт symlink'и из них в перечисленные пути.

🔴 Диагностика индексеров — «красные трекеры» (2026-09-20)

Полная диагностика запрошена Alex: «что с torrent трекерами в arr, красные». Диагноз снят по логам Prowlarr, не по теории.

Фактическое состояние индексеров Prowlarr (id / name / enable / privacy)

id Индексер enable privacy Реально работает?
1 RuTracker true semiPrivate ❌ красный — Cloudflare
5 Kinozal true semiPrivate ❌ красный — Cloudflare
6 Kinozal (M) true semiPrivate ❌ красный — Cloudflare
2 RuTor true public ✅ 100 результатов на «matrix»
4 NoNaMe Club true public ✅ 50 результатов
3 Byrutor true public ✅ 6 результатов

indexerstatus пуст, и health показывает только warning про апдейт — то есть Prowlarr сам себя маскирует: он не пишет в health, а вместо этого помечает индексер «temporarily ignoring till <+24h>». Диагноз надо снимать из debug-лога, не из health API.

Root cause #1 — Cloudflare (RuTracker + Kinozal + Kinozal (M))

Из /srv/.../docker/prowlarr/config/logs/prowlarr.debug.txt:

Warn|IndexerHttpClient|HTTP Error - Res: HTTP/2.0 [POST] https://rutracker.org/forum/login.php: 403.Forbidden (5620 bytes)
<title>Just a moment...</title>  ... challenges.cloudflare.com ... cType: 'managed'
Warn|RuTracker|RuTracker HTTP request failed: [403:Forbidden] [POST] at [https://rutracker.org/forum/login.php]
   at NzbDrone.Core.Indexers.Definitions.RuTracker.DoLogin() in ./NzbDrone.Core/Indexers/Definitions/RuTracker.cs:line 103
Error|Cardigann|Cloudflare protection detected for [Kinozal], Flaresolverr may be required.
Error|Cardigann|Cloudflare protection detected for [Kinozal (M)], Flaresolverr may be required.
Debug|IndexerFactory|Temporarily ignoring indexer RuTracker till 09/21/2026 17:30:42 due to recent failures.
  • RuTracker: CF managed Turnstile на /forum/login.php → Prowlarr не может залогиниться (нужен JS-челлендж). Аккаунт при этом может быть жив — падает именно логин.
  • Kinozal / Kinozal (M): kinozal.me тоже за Cloudflare, Prowlarr сам пишет «Flaresolverr may be required».
  • Версия Prowlarr на момент диагностики: v2.5.2.5491, доступен апдейт v2.6.5.5623.

Root cause #2 — Docker network split (Radarr полностью без индексеров)

radarr:       docker_default  172.22.0.3     ← НЕ видит prowlarr
sonarr:       media_net       172.23.0.2
prowlarr:     media_net       172.23.0.3
transmission: docker_default  172.22.0.2     ← НЕ виден сонаром

Radarr POST /api/v3/indexer/testall → все 4 индексера false: Unable to connect to indexer... Name does not resolve (prowlarr:9696)

Sonarr testall (он в media_net, DNS резолвится) → доходит до Prowlarr и получает осмысленные ошибки:

Sonarr indexer id Имя Результат testall
1 RuTracker ❌ [429:TooManyRequests] через Prowlarr (это самоисключение Prowlarr отдаёт как 429)
2 NoNaMe Club ✅ true
6 Kinozal (M) ❌ 429 (тот же эффект)
8 RuTor ⚠️ Query successful, but no results in the configured categories — не баг коннекта: у Sonarr id=8 категории [5000], а caps RuTor отдаёт 2000 5000 8000 100001 100002 100003. tvsearch в Prowlarr живой: t=tvsearch&q=lost на /prowlarr/2/api → 100 <item>. Лечится расширением категорий на стороне Sonarr.
9 Kinozal ❌ 429 (тот же эффект)

Analog: Sonarr health → error DownloadClientCheck: Unable to communicate with Transmission. Name does not resolve (transmission:9091). Тот же network-split, отдельный симптом.

Вывод: Radarr красный не из-за трекеров, а из-за сети. У Sonarr красные = реальные трекеры (CF).

⚠️ Питфолл: POST /api/v3/indexer/test по одному id НЕ работает

{"indexerId": N} на Radarr/Sonarr/Prowlarr возвращает HTTP 400 со списком validationFailures: 'Name' must not be empty, 'Implementation' must not be empty, 'ConfigContract' must not be empty, 'App Profile Id' must be greater than '0', 'Priority' must be between 1 and 50. То есть эндпоинт валидирует тело как новый индексер, а не берёт существующий по id.

Рабочий способ тестирования — testall:

# Radarr
curl -s -X POST -H "X-Api-Key: $RKEY" \
  "http://localhost:7878/radarr/api/v3/indexer/testall" \
  | jq -r '.[] | "\(.id)\t\(.isValid)\t\(.validationFailures[0].errorMessage // "")"'

# Sonarr (UrlBase /sonarr)
curl -s -X POST -H "X-Api-Key: $SKEY" \
  "http://localhost:8989/sonarr/api/v3/indexer/testall" \
  | jq -r '.[] | "\(.id)\t\(.isValid)\t\(.validationFailures[0].errorMessage // "")"'

# Prowlarr: тест одного индексера требует полного объекта из GET, не {indexerId}
# Быстрая проверка «кто живой» — сразу поиском:
curl -s -H "X-Api-Key: $PKEY" "http://localhost:9696/prowlarr/api/v1/search?query=matrix&type=search" \
  | jq -r 'group_by(.indexer)[] | "\(.[0].indexer): \(length)"'

(Prowlarr /api/v1/indexer/test тоже возвращает 400 на {indexerId} — см. § Питфоллы скилла torrent-agent-pipeline.)

Поиск через Prowlarr полезнее теста индексеров: ?query=X&type=search по умолчанию возвращает до 100 результатов на индексер (был соблазн прочитать «156 всего» как «по 26 на каждый» — неверно; смотреть group_by(.indexer)).

План лечения (составлен 2026-09-20, ждёт подтверждения Alex)

  1. FlareSolverr — развернуть контейнер на Kraken (порт 8191), прописать его как прокси в Prowlarr Settings → Indexers. Без FlareSolverr CF-челлендж RuTracker/Kinozal не проходится.
  2. Обновить Prowlarr v2.5.2.5491 → v2.6.5.5623 (свежая интеграция FlareSolverr).
  3. Починить сеть — подключить Radarr и Transmission в media_net (обратимо, без пересоздания контейнеров): sudo docker network connect media_net radarr / sudo docker network connect media_net transmission
  4. Раскрыть категории Sonarr indexer id=8 (RuTor) — сейчас [5000], добавить 2000/8000.
  5. Проверка приёмки: testall в Radarr и Sonarr → все isValid=true; поиск RuTracker с ненулевым результатом.

Честные границы: FlareSolverr против CF Turnstile даёт ~70-80% на RuTracker (при жёстком managed-challenge может понадобиться cookie из браузера, вручную). Пароли трекеров у агента отсутствуют — если сессия RuTracker инвалидировалась, логин/пароль вводит Alex в UI Prowlarr. Гарантий на CF нет ни у кого: трекеры обновляют защиту.

Статус: диагностика завершена, план не начат (ждёт апрува). Безопасный первый шаг — п.3 (сети), не требует паролей и полностью обратим.

Известные проблемы

  • ⚠️ 2026-09-20: jellyfin_default в compose Radarr — реально Radarr живёт в docker_default; при разборе сетей проверять фактическое docker inspect, а не docker-compose.yml.
  • 17 фильмов в Radarr hasFile=False — ждут подходящего релиза в Prowlarr. Scream (1996) в процессе загрузки.
  • Prowlarr — если долго не находит релизы, проверить статус индексеров (/api/v1/health).
  • 🔴 2026-09-04: 4K UHD Remux при Direct Play подтормаживает на ТВ (webOS). Симптом у Неистовый (Unhinged 2020) — 60.9GB ...Remux.2160p.mkv avg ~99 Мбит/с. После фикса eth0 Kraken → 1G (был 100M, см. kraken-network) торможение сохранилось. Подтверждено по логу Jellyfin log_20260904.log: сессия 10:18→10:28 «Jellyfin for WebOS 1.2.2», Stop at 400916ms (~6:40), ни одной строки transcode → это Direct Play, не CPU-рендер субтитров.
  • 🔴🔴 2026-09-04 (вживую): тормозит Direct Play даже лёгкого 4K → пока шло по Wi-Fi, причина не сервер/диск. В живом воспроизведении по Wi-Fi Project Hail Mary (2026) (...2160p.iT.WEB-DL...mkv, HEVC Main10 4K HDR10+, avg ~24.5-25.7 Мбит/с, 30.2GB, Direct Play) подёргивание было, при этом: транскода нет (0 ffmpeg, CPU Kraken load 0.1), сервер отдаёт всего ~21 Мбит/с, Wi-Fi ТВ «чист» по MAC-счётчикам (0 CRC/0 retries, -53 dBm), линки с запасом ×10+.
  • ✅ 2026-09-04 РАЗРЕШЕНИЕ (проверено пользователем вживую): после двух правок — (1) eth0 Kraken возвращён на 1G (замена патч-корда) и (2) ТВ переведён на проводной Ethernet (100M downshift-линк) — и Unhinged (remux, ~89 Мбит/с), и Project Hail Mary (лёгкий 4K) идут без тормозов. Вывод: причиной были НЕ пропускная способность и НЕ декодер-клиента, а нестабильный Wi-Fi-линк последней мили ТВ (даже при чистых MAC-счётчиках — джиттер/переупорядочивание в зашумлённом эфире). Провод (даже 100M) стабильно отдаёт. Профиль WEB-4K (no remux) остаётся разумной страховкой, но не был обязательной причиной тормозов.

Radarr Quality Profiles на Kraken (проверено 2026-09-04)

Via http://kraken:7878/radarr/api/v3/qualityprofile (X-Api-Key из config.xml; UrlBase=/radarr). Radarr v6.1.1.10360, Linuxserver image, net docker_default.

id Профиль Разрешённые качества Cutoff
1 Any весь диапазон CAM..BR-DISK, вкл. все 2160p Remux-1080p
2 SD до Bluray-576p —
3 HD-720p до Bluray-720p —
4 HD-1080p HDTV/Bluray/Remux-1080p Bluray-1080p
5 Ultra-HD HDTV/Bluray/Remux-2160p (BR-DISK не allowed) Remux-2160p
6 HD-720p/1080p 1080p и ниже —
7 WEB-4K (no remux) ✅ создан кодир. HDTV/WEB/BluRay 2160p+1080p+720p Bluray-2160p (кодир.)
8 (если появится из id авто-инкремента — перепроверить) — —

Профиль id=7 разрешает код HDTV/WEBDL/WEBRip/BluRay в 2160/1080/720; запрещает Remux-1080p, Remux-2160p, BR-DISK, Raw-HD, SDTV/DVD/480/576. upgrade выключен. Sonarr: аналогичный профиль тоже id=7.

  • Корень «почему новые качаются в любой жир»: watchlist-sync (который добавляет фильмы/сериалы из watchlist в Radarr/Sonarr) жёстко прописывает "qualityProfileId": 1 (= профиль Any) в arr.py:
    • Реальный путь репо: /srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/watchlist-sync (НЕ ~/Developer/watchlist-sync, хотя симлинк ~/Developer/watchlist-sync → .../49e8.../watchlist-sync есть; 49e8 — симлинк на 6194).
    • watchlist_sync/arr.py → radarr_add() (~стр 77) и sonarr_add() (~стр 112), обе "qualityProfileId": 1. Radarr POST /api/v3/movie c addOptions.searchForMovie:true; Sonarr POST /api/v3/series.
  • ✅ Решение принято и применено (см. выше): профиль WEB-4K (no remux) (Radarr/Sonarr id 7), fallback 1080→720, remux запрещён. Применено 2026-09-04.
  • ✅ 2026-09-04: стратегия качества РЕШЕНА И ПРИМЕНЕНА. Новые фильмы/сериалы (через watchlist-sync) добавляются с профилем WEB-4K (no remux) (Radarr id 7, Sonarr id 7) — см. секцию «Качество загрузки для НОВЫХ». Fallback: если нет 2160p-кодированного — 1080p → 720p; remux не берётся никогда. Было принято так (fallback=1080, если нет — 720). Существующие файлы НЕ трогаются.

Реальный состав жирного remux (пример Unhinged, ffprobe 2026-09-04)

Важно для понимания «что даёт remux» перед выбором профиля. Файл Неистовый.2020.UHD.Blu-Ray.Remux.2160p.mkv = 60.9GB, 1:31:05, контейнер 89.17 Мбит/с средний.

FFprobe потоки:

idx тип кодек каналы язык / роль
0 video HEVC Main10, 3840×2160, 24fps — HDR10 (BT.2020, PQ smpte2084)
1 audio AC3 5.1(side) 384k rus «Dub, iTunes»
2 audio DTS-HD MA 7.1 rus «Д. Есарев»
3 audio TrueHD 7.1 eng
4 audio AC3 5.1 640k eng
5 audio DTS stereo 320k eng Commentary (реж. Деррик Борте)
6-8 sub SRT/SPU — rus / eng full / eng SDH

Вывод: размер 60GB раздувает НЕ видео (HDR10 HEVC-часть типичная), а множество звуковых дорожек (lossless DTS-HD MA + TrueHD) + аудиокомментарий. «Что даёт remux» на бытовом ТВ: видео-выигрыш против аккуратного 4K-рипа почти незаметен с дивана; бонус реализуется только при lossless-прокачке звука (AVR/eARC). Если ТВ играет через собственные динамики/стерео или делает audio-transcode — плюс remux теряется, а вес/сеть/лаг остаются. Это аргумент за профиль «2160p без Remux» для бытового просмотра на webOS-TB.

Бенчмарк WEB-4K (замерено по библиотеке Kraken, 2026-09-04)

«Поддерживаемое качество» для сравнения с жирным remux — это кодированные 2160p. Замер файлов с WEB+2160 в имени в /media:

  • Полнометражки (2ч): Project Hail Mary 28.1GB, The Drama 19.2GB, The Crow 17.4GB, They Will Kill You 17.2GB, Кот в сапогах 19.9GB → range 17–28GB, медиана ~19GB.
  • 45-50 мин эпизоды док-сериалов (prehistoric.planet s01): ~7.2–7.7GB каждый.
  • Статсводка по всем 10 файлам: min 7.2 / median 12.5 / mean 13.9 / max 28.1 GB. Средний битрейт ~20–40 Мбит/с.
  • Практичный floor benchmark: «нормальная» копия 4K для этого ТВ ≈ 17–28GB/фильм (в 2.5–3× меньше remux). ⚠️ ⚠️ Важно: подёргивание 4K Direct Play (и лёгкого, и remux) было вызвано Wi-Fi-линком последней мили ТВ — по проводу оба идут (см. «РАЗРЕШЕНИЕ» в «Известные проблемы»). Напротив клиента webOS не виноват.

Notes