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

8.2 KiB
Executable File
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-29 tech family
arr
kraken
radarr
sonarr
prowlarr
transmission
jellyfin
family/how-to/arr-stack-taiga
family/how-to/kraken-access
family/how-to/kraken-watchtower
personal/tech/kraken-docker-startup-order

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 настройки сюда вслепую.

Приёмка индексаторов:

  1. Prowlarr видит flaresolverr:8191.
  2. Индексер имеет нужные tags.
  3. Реальный search возвращает результаты.
  4. IndexerStatus не содержит старый quarantine.
  5. 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 и список конкретных файлов.

Связанные документы