8.2 KiB
Executable File
title, created, updated, type, namespace, tags, related
| title | created | updated | type | namespace | tags | related | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Arr stack — Kraken | 2026-05-23 | 2026-09-29 | tech | family |
|
|
Arr stack — Kraken
Каноническая документация arr-стека на Kraken. Taiga описывается отдельно в family/how-to/arr-stack-taiga.
Архитектура
Prowlarr → Radarr / Sonarr → Transmission → /media
↓
media-pipeline / router.py
↓
Jellyfin через symlink
| Компонент | Порт | Назначение |
|---|---|---|
| Prowlarr | 9696 | индексаторы и sync |
| Radarr | 7878 | фильмы |
| Sonarr | 8989 | сериалы |
| Transmission | 9091 | torrent download client |
| FlareSolverr | 8191 | browser challenge, если включён |
| Jellyfin | 8096 | media server |
Все arr-сервисы и Transmission должны видеть общую Docker-сеть media_net. Проверять фактические сети через docker inspect, а не только compose.
Пути
Базовый диск:
/srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/
Проверка реального диска:
readlink -f /srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade
df -h /srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade
Внутри контейнеров media path — /media.
| Путь | Назначение |
|---|---|
| /media/movies-radarr | рабочая библиотека Radarr |
| /media/series-sonarr | рабочая библиотека Sonarr |
| /media/movies | Jellyfin movies |
| /media/series | Jellyfin series |
| /media/cartoons | Jellyfin cartoons |
| /media/documentaries | Jellyfin documentaries |
| /media/downloads/complete | завершённые ручные загрузки |
Не путать /media Kraken с /storage Taiga.
Compose и restart
Перед изменением:
docker compose config -q
docker compose ps
Определить владельца контейнера:
docker inspect <container> --format '{{index .Config.Labels "com.docker.compose.project"}} {{index .Config.Labels "com.docker.compose.project.config_files"}}'
Запускать compose из каталога, указанного в project.config_files. Не запускать второй compose с тем же container_name.
Проверка после reboot:
docker ps --format 'table {{.Names}} {{.Status}} {{.Networks}}'
docker network inspect media_net
docker compose ps
restart: unless-stopped не задаёт порядок между разными compose-проектами. Межпроектный порядок описан в personal/tech/kraken-docker-startup-order.
Media routing
Radarr/Sonarr используют рабочие каталоги, а router.py публикует их в Jellyfin через symlink:
| Источник | Условие | Цель |
|---|---|---|
| movies-radarr | documentary | documentaries |
| movies-radarr | animation без adult rating | cartoons |
| movies-radarr | остальное | movies |
| series-sonarr | documentary | documentaries-series |
| series-sonarr | animation без TV-MA | cartoons-series |
| series-sonarr | остальное | series |
Проверка без изменений:
cd /srv/.../docker/media-pipeline
python3 router.py --dry-run
Применение:
python3 router.py --apply
Ручные torrents обрабатываются sync.py и on-download-complete.sh. После перемещения обновлять location через Transmission RPC, а не вручную менять путь.
Transmission
Проверка RPC:
docker exec transmission transmission-remote --list
Проверка mount:
docker inspect transmission --format '{{range .Mounts}}{{.Source}} -> {{.Destination}}{{println}}'
Если Radarr/Sonarr получают Authentication failure, проверить штатный download-client test, текущие RPC credentials и host transmission:9091. Password в Obsidian не записывать.
Prowlarr и FlareSolverr
На Kraken proxy/DNS topology отличается от Taiga. Не переносить Taiga entrypoint и vless-proxy настройки сюда вслепую.
Приёмка индексаторов:
- Prowlarr видит flaresolverr:8191.
- Индексер имеет нужные tags.
- Реальный search возвращает результаты.
- IndexerStatus не содержит старый quarantine.
- LOG_LEVEL не пишет tracker credentials в logs.
Jellyfin
Jellyfin читает target libraries: movies, series, cartoons, documentaries и варианты. movies-radarr и series-sonarr не добавлять в Jellyfin, если router должен быть единственным слоем публикации.
Проверка:
docker inspect jellyfin --format '{{range .Mounts}}{{.Source}} -> {{.Destination}} ({{.Mode}}){{println}}'
namei -l /srv/.../media/movies
Проверять execute/traverse на каждом parent directory, uid/gid и read-only mount.
Watchlist и cron
Перед POST новой записи в Radarr/Sonarr делать pre-check существующей библиотеки. SeriesExistsValidator — duplicate, а не отказ индексатора.
Cron проверять фактически:
crontab -l
sudo crontab -l
systemctl is-active cron
Документация не доказывает, что job установлен. Перед изменением crontab делать backup и проверять новый crontab сразу после установки.
Watchtower и reboot pitfalls
- Watchtower может остановить контейнеры через SIGTERM/SIGKILL во время update.
- exit 137 не равен автоматически OOM; сверять kernel logs и Docker events.
- depends_on работает только внутри одного compose-проекта.
- Правка compose-файла не меняет уже созданный контейнер до up -d --force-recreate.
- Bind mount и docker inspect важнее того, что написано в заметке.
Troubleshooting
| Симптом | Проверка | Действие |
|---|---|---|
| Container conflict | compose labels | запускать из владельца проекта |
| Prowlarr 0 results | real search + IndexerStatus | сеть, tags, proxy, quarantine |
| Radarr/Sonarr 401 к Prowlarr | URL base и API path | сверить URL из API sync |
| Transmission auth | download-client test | credentials и RPC path |
| Jellyfin пустая библиотека | mount + namei -l | исправить parent traverse/read |
| Symlink не появился | router.py --dry-run | проверить NFO, source и cron |
| После reboot сервис не встал | проекты и restart policy | запускать каждый проект из его каталога |
| Диск заполнен | df -h и disk usage | остановить auto-download перед cleanup |
Безопасность
- API keys, passwords и tracker credentials не хранить в Obsidian.
- Перед SQLite cleanup делать backup.
- Не использовать rm -rf для media/config.
- Не удалять torrents с deleteFiles=true без проверки hardlinks/symlinks.
- Для cleanup сначала dry-run и список конкретных файлов.
Связанные документы
- family/how-to/arr-stack-taiga — отдельный TrueNAS Taiga stack.
- personal/tech/kraken-docker-startup-order — startup/reboot.
- family/how-to/kraken-watchtower — Watchtower.
- family/how-to/kraken-network — сеть.
- family/how-to/kraken-access — доступ.