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

192 lines
8.2 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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]] — доступ.