192 lines
8.2 KiB
Markdown
Executable File
192 lines
8.2 KiB
Markdown
Executable File
---
|
||
title: Arr stack — Kraken
|
||
created: '2026-05-23'
|
||
updated: '2026-09-29'
|
||
type: tech
|
||
namespace: family
|
||
tags: [arr, kraken, radarr, sonarr, prowlarr, transmission, jellyfin]
|
||
related:
|
||
- "[[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 и список конкретных файлов.
|
||
|
||
## Связанные документы
|
||
|
||
- [[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]] — доступ.
|
||
|