137 lines
5.7 KiB
Markdown
137 lines
5.7 KiB
Markdown
---
|
||
title: Arr Stack — Kraken
|
||
created: '2026-05-23'
|
||
updated: '2026-05-27'
|
||
type: tech
|
||
namespace: family
|
||
tags: [arr, radarr, sonarr, prowlarr, transmission, jellyfin, infra, kraken]
|
||
related:
|
||
- "[[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.)
|
||
|
||
## 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'и из них в перечисленные пути.
|
||
|
||
## Известные проблемы
|
||
|
||
- **17 фильмов в Radarr `hasFile=False`** — ждут подходящего релиза в Prowlarr. Scream (1996) в процессе загрузки.
|
||
- **Prowlarr** — если долго не находит релизы, проверить статус индексеров (`/api/v1/health`).
|
||
|
||
## Notes
|
||
|
||
- See [[arr-stack-taiga]] for Taiga (secondary) arr stack
|
||
- Media pipeline pitfalls: [[media-pipeline-pitfalls]]
|
||
- Синтез: [[concepts/kraken-media-stack]]
|