364 lines
29 KiB
Markdown
364 lines
29 KiB
Markdown
---
|
||
title: Arr Stack — Kraken
|
||
created: '2026-05-23'
|
||
updated: '2026-09-20'
|
||
type: tech
|
||
namespace: family
|
||
tags: [arr, radarr, sonarr, prowlarr, transmission, jellyfin, infra, kraken]
|
||
related:
|
||
- "[[tech/jellyfin-config]]"
|
||
- "[[tech/arr-stack-taiga]]"
|
||
- "[[tech/prowlarr-flaresolverr-cloudflare]]"
|
||
- "[[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 (Docker network `media_net`)
|
||
|
||
All services in the shared external network `media_net` — доступны друг другу по имени контейнера (`radarr:7878`, `prowlarr:9696`, `transmission:9091`, `flaresolverr:8191`) и с хоста по `kraken:<port>`:
|
||
|
||
| Service | Port |
|
||
|--------------|------|
|
||
| Radarr | 7878 |
|
||
| Sonarr | 8989 |
|
||
| Prowlarr | 9696 |
|
||
| Transmission | 9091 |
|
||
| Jellyfin | 8096 |
|
||
| FlareSolverr | 8191 |
|
||
|
||
**Сеть (проверено 2026-09-20):** radarr, sonarr, prowlarr, transmission, flaresolverr — все в `media_net`. Пересечение сетей (radarr и transmission дополнительно ещё в `docker_default`) — нормально, роутинг по `media_net`.
|
||
Порядок починки, если контейнер выпал из сети: `sudo docker network connect media_net <container>` (обратимо, без пересоздания) либо `docker compose up -d` из каталога сервиса.
|
||
|
||
## 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'и из них в перечисленные пути.
|
||
|
||
## Индексера Prowlarr — диагностика и починка (2026-09-20)
|
||
|
||
> ✅ **Задача закрыта в тот же день.** Ниже — история диагностики (полезна как метод), а актуальное решение с командами — в секции «🔴 Индексера Prowlarr — починка Cloudflare (2026-09-20)».
|
||
> **Итог: было 3 «красных» из 6, стало 6/6 рабочих. Radarr 4/4, Sonarr 5/5 зелёные.**
|
||
|
||
Запрос Alex: «что с torrent трекерами в arr, красные». Диагноз снят по логам Prowlarr, не по теории.
|
||
|
||
### Что показывал UI на момент диагностики
|
||
|
||
| id | Индексер | privacy | Было | Стало |
|
||
|----|----------|---------|------|-------|
|
||
| 1 | RuTracker | semiPrivate | ❌ красный (Cloudflare) | ✅ 48 результатов на «matrix» |
|
||
| 5 | Kinozal | semiPrivate | ❌ красный (Cloudflare) | ✅ 50 |
|
||
| 6 | Kinozal (M) | semiPrivate | ❌ красный (Cloudflare) | ✅ 50 |
|
||
| 2 | RuTor | public | ✅ 100 | ✅ 100 |
|
||
| 4 | NoNaMe Club | public | ✅ 50 | ✅ 50 |
|
||
| 3 | Byrutor | public | ✅ 6 | ✅ 6 |
|
||
|
||
### 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».
|
||
- Лечится FlareSolverr-прокси (см. решение). На момент диагностики версия была **v2.5.2.5491**.
|
||
|
||
### 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)`
|
||
|
||
Вывод: **Radarr был красный не из-за трекеров, а из-за сети.** У Sonarr красные = реальные трекеры (CF).
|
||
Ключевой урок: compose-файлы уже содержали `media_net`, но контейнеры остались в старой сети — **проверять фактическое `docker inspect`, а не compose-файл**.
|
||
|
||
### ⚠️ Питфолл: `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`:**
|
||
|
||
```bash
|
||
# 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 полезнее теста индексеров: `?query=X&type=search` по умолчанию возвращает **до 100 результатов на индексер** (был соблазн прочитать «156 всего» как «по 26 на каждый» — неверно; смотреть `group_by(.indexer)`).
|
||
|
||
### Итог и уроки
|
||
|
||
Все три причины были независимы и требовали независимых фиксов:
|
||
1. **Сеть** — `docker network connect media_net radarr|transmission` (обратимо, без пересоздания контейнеров).
|
||
2. **FlareSolverr не применялся** — нужен одинаковый tag на прокси И на индексере (главная засада: при `tags=[]` молча не работает).
|
||
3. **Блокировки в `IndexerStatus`** — рестарт контейнера их НЕ сбрасывает, чистить через `sqlite3` между stop/start.
|
||
|
||
Плюс побочно: RuTor не фильтрует по категориям → ему нужна категория `8000(Other)`, не `5000`.
|
||
|
||
**⚠️ Безопасность:** FlareSolverr на `LOG_LEVEL=info` пишет логин и пароль RuTracker в plaintext в свои логи. Обязательно `warning`.
|
||
|
||
## Известные проблемы
|
||
|
||
- **⚠️ 2026-09-20: compose-файл может ВРАТЬ про сеть.** Ранее в compose Radarr был указан `jellyfin_default`, а реально контейнер жил в `docker_default`; при починке выяснилось, что compose уже писал `media_net`, но контейнеры не были пересозданы. **Всегда проверять фактическое `docker inspect -f '{{range $k,$v := .NetworkSettings.Networks}}{{$k}} {{end}}' <container>`, а не docker-compose.yml.**
|
||
- **17 фильмов в Radarr `hasFile=False`** — ждут подходящего релиза в Prowlarr. Scream (1996) в процессе загрузки.
|
||
- **Prowlarr** — если долго не находит релизы, проверить статус индексеров (`/api/v1/health`). ⚠️ health врёт, реальную причину блокировки смотреть в `config/logs/prowlarr.debug.txt` — см. секцию «🔴 Индексера Prowlarr — починка Cloudflare (2026-09-20)» ниже.
|
||
- ✅ **2026-09-20: все индексера Prowlarr починены (6/6), Radarr 4/4 и Sonarr 5/5 зелёные.** Причины были: сеть (`docker_default` вместо `media_net`), непривязанный tag у FlareSolverr-прокси, и блокировки в `IndexerStatus`. Детали и команды — в секции ниже.
|
||
- **🔴 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 не виноват.
|
||
|
||
## 🔴 Индексера Prowlarr — починка Cloudflare (2026-09-20)
|
||
|
||
**Итог: было 3 «красных» из 6, стало 6/6 рабочих. Radarr 4/4, Sonarr 5/5 зелёные.**
|
||
|
||
### Симптом
|
||
Radarr: `error IndexerLongTermStatusCheck` — «All indexers are unavailable due to failures for more than 6 hours».
|
||
Sonarr: `error DownloadClientCheck` — «Unable to communicate with Transmission. Name does not resolve (transmission:9091)».
|
||
В UI Prowlarr индексера RuTracker / Kinozal / Kinozal (M) показывались красными.
|
||
|
||
### Три независимые причины (все три надо было починить)
|
||
|
||
**(1) Сеть — Radarr и Transmission в неправильной сети.**
|
||
Compose-файлы УЖЕ были прописаны на `media_net`, но живые контейнеры остались в `docker_default` (compose обновили, контейнеры не пересоздали). Итог: Radarr не резолвит `prowlarr:9696` → **все** индексеры false; Sonarr не резолвит `transmission:9091`.
|
||
```bash
|
||
sudo docker network connect media_net radarr
|
||
sudo docker network connect media_net transmission
|
||
# проверка: docker exec radarr getent hosts prowlarr
|
||
# docker exec sonarr curl -sw "%{http_code}" http://transmission:9091/transmission/rpc → 409 = связь есть (штатный CSRF-ответ)
|
||
```
|
||
|
||
**(2) FlareSolverr-прокси в Prowlarr не применялся (главный баг).**
|
||
Контейнер `flaresolverr` был жив, запись прокси создана (`id=1`), но в логе Prowlarr — прямой `403 login.php`, а FlareSolverr вообще не вызывался.
|
||
**Причина: в Prowlarr v2.x прокси применяется к индексерам ТОЛЬКО если у прокси И у индексера стоит одинаковый tag.** При `tags=[]` с обеих сторон прокси молча НЕ применяется, никакой ошибки в UI нет.
|
||
```bash
|
||
KEY=$(grep -oP "(?<=<ApiKey>)[^<]+" .../docker/prowlarr/config/config.xml)
|
||
# 1. создать тег
|
||
curl -X POST -H "X-Api-Key: $KEY" -H "Content-Type: application/json" \
|
||
-d '{"label":"flaresolverr"}' http://localhost:9696/prowlarr/api/v1/tag
|
||
# 2. повесить tag на ПРОКСИ
|
||
curl -s -H "X-Api-Key: $KEY" http://localhost:9696/prowlarr/api/v1/indexerproxy/1 | jq ".tags=[1]" > /tmp/p.json
|
||
curl -X PUT -H "X-Api-Key: $KEY" -H "Content-Type: application/json" -d @/tmp/p.json \
|
||
http://localhost:9696/prowlarr/api/v1/indexerproxy/1
|
||
# 3. повесить ТОТ ЖЕ tag на индексера (RuTracker=1, Kinozal=5, Kinozal M=6)
|
||
curl -s -H "X-Api-Key: $KEY" http://localhost:9696/prowlarr/api/v1/indexer/1 | jq ".tags=[1]" > /tmp/i.json
|
||
curl -X PUT -H "X-Api-Key: $KEY" -H "Content-Type: application/json" -d @/tmp/i.json \
|
||
http://localhost:9696/prowlarr/api/v1/indexer/1
|
||
```
|
||
**Пруф работы** — только лог FlareSolverr, не UI:
|
||
```bash
|
||
sudo docker logs --tail 30 flaresolverr
|
||
# → Challenge detected. Title found: Just a moment...
|
||
# → Challenge solved!
|
||
```
|
||
Проверка поиска: `curl "http://localhost:9696/prowlarr/1/api?t=search&q=matrix&apikey=$KEY"` → RuTracker 48 items, Kinozal 50, Kinozal M 50, RuTor 100, NoNaMe 50.
|
||
|
||
**(3) Блокировки индексера в БД — рестарт их НЕ сбрасывает.**
|
||
Prowlarr сам выключает упавший индексер на 24ч: `Temporarily ignoring indexer X till +24h`. В health API и `/api/v1/indexerstatus` это НЕ видно (оба возвращают пусто, врут) — только в debug-логе. Состояние лежит в таблице `IndexerStatus` в `prowlarr.db`.
|
||
```bash
|
||
sudo docker stop prowlarr
|
||
sqlite3 /srv/.../docker/prowlarr/config/prowlarr.db "DELETE FROM IndexerStatus WHERE ProviderId IN (1,5,6);"
|
||
sudo docker start prowlarr
|
||
```
|
||
⚠️ В контейнерах `sqlite3` НЕТ; на хосте Kraken `/usr/bin/sqlite3` ЕСТЬ.
|
||
|
||
**Побочно: RuTor не фильтрует по категориям.** У него в caps заявлены 2000(Movies)/5000(TV)/8000(Other), но при передаче `cat=5000` он возвращает 0 результатов, а без `cat` — 100. Prowlarr сам подсказывает в полях индексера: *«RuTor does not return categories in its search results. To sync to your apps, include 8000(Other)»*. Поэтому в Sonarr (indexer id=8) категория RuTor переставлена `5000` → `8000`.
|
||
|
||
### Версии и сервис
|
||
- Prowlarr обновлён **2.5.2.5491 → 2.6.5.5623** (в 2.5.2 прокси-модель ещё только вводилась).
|
||
- FlareSolverr `ghcr.io/flaresolverr/flaresolverr:latest` v3.5.2, порт 8191, сеть `media_net`, env `PROWLARR__FLARESOLVERR_URL=http://flaresolverr:8191`.
|
||
- ⚠️ **FlareSolverr `LOG_LEVEL` понижен `info` → `warning`**: на level `info` FlareSolverr пишет `postData` запросов в лог, т.е. **логин и пароль RuTracker в plaintext**. После понижения — лог пуст, пароль не пишется.
|
||
|
||
### Бэкапы (перед изменениями)
|
||
`/home/kraken/arr-fix-backup-20260920/` — networks.txt, 4× docker inspect, 3 compose-файла, `prowlarr.db.bak`, `prowlarr-config-preupgrade.tar.gz`.
|
||
|
||
### Диагностические грабли
|
||
- `POST /api/v3/indexer/test` с телом `{"indexerId":N}` → HTTP 400 (валидирует как НОВЫЙ индексер, требует Name/Implementation). Для теста всех сразу: `POST /api/v3/indexer/testall`.
|
||
- `GET /api/v1/health` в Prowlarr и `/api/v1/indexerstatus` НЕ показывают причины блокировки. Смотреть `.../docker/prowlarr/config/logs/prowlarr.debug.txt` (grep по имени индексера и `Cloudflare`/`403`).
|
||
|
||
## Notes
|
||
|
||
- See [[arr-stack-taiga]] for Taiga (secondary) arr stack
|
||
- Media pipeline pitfalls: [[media-pipeline-pitfalls]]
|
||
- FlareSolverr / Cloudflare / Prowlarr-питфоллы: [[prowlarr-flaresolverr-cloudflare]]
|
||
- Синтез: [[concepts/kraken-media-stack]]
|