docs(arr-kraken): Radarr 34/monitored=0, sync-down removed, catalog cron, watchlist->Lampa pipeline

This commit is contained in:
Alexey Martemyanov committed 2026-09-22 19:39:31 +06:00
1 parent f092694858
commit 7df9dfca4a
2 files changed
+133 -38

No files matched your search

+130 -38
View File
@@ -1,15 +1,26 @@
---
title: Arr Stack — Kraken
created: '2026-05-23'
updated: '2026-09-20'
updated: '2026-09-22'
type: tech
namespace: family
tags: [arr, radarr, sonarr, prowlarr, transmission, jellyfin, infra, kraken]
tags:
- arr
- radarr
- sonarr
- prowlarr
- transmission
- jellyfin
- infra
- kraken
related:
- "[[tech/jellyfin-config]]"
- "[[tech/arr-stack-taiga]]"
- "[[tech/prowlarr-flaresolverr-cloudflare]]"
- "[[concepts/kraken-media-stack]]"
- '[[tech/jellyfin-config]]'
- '[[tech/arr-stack-taiga]]'
- '[[tech/prowlarr-flaresolverr-cloudflare]]'
- '[[concepts/kraken-media-stack]]'
- '[[personal/tech/lampac-deployment]]'
- '[[family/how-to/lampac-torrents]]'
- '[[family/projects/watchlist-automation]]'
---
# Arr Stack — Kraken
@@ -83,15 +94,22 @@ Prowlarr → Radarr + Sonarr → Transmission → Jellyfin
✅ **Watchlist-крон ВОССТАНОВЛЕН 2026-09-20 21:21** (был мёртв с 2026-06-20). Бэкап `~/crontab-backup-20260920-212155.txt`. Детали и разбор — в [[family/projects/watchlist-automation]].
Актуальное `crontab -l` юзера `kraken`:
Актуальное `crontab -l` юзера `kraken` (проверено 2026-09-22):
```
0 * * * * bash ~/scripts/sync-vault.sh # Obsidian sync
0 * * * * pgs-to-srt.sh /media/downloads/complete # PGS→SRT новые
0 * * * * pgs-to-srt.sh /media/downloads/complete # 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 ✅ восстановлен
0 2 * * * bash ~/scripts/watchlist-cleanup.sh --apply # cleanup просмотренного
0 1 * * * bash ~/scripts/watchlist-nightly.sh # watchlist nightly (БЕЗ sync-down)
0 9 * * 0 bash ~/scripts/watchlist-discover.sh # watchlist discover
30 2 * * * bash ~/scripts/watchlist-catalog.sh # JSON-каталог для Lampa ← НОВЫЙ 2026-09-22
```
🔴 **`watchlist-catalog.sh` (30 2 * * *)** — генерация `watchlist.json` для модуля Catalog
в Lampa + маркера `❓`. Порядок намеренный: nightly 01:00 → cleanup 02:00 → catalog 02:30.
Детали: [[personal/tech/lampac-deployment]], разбор генератора —
[[personal/plans/watchlist-tmdb-missing-marker]].
⚠️ **`media-router.sh` (роутер symlink'ов, каждые 10 мин) в crontab ОТСУТСТВУЕТ.** В таблице «Два параллельных пути» выше он описан как работающий по cron 10min — фактически его там нет. Проверить, нужен ли: без него symlink'и в `/media/{movies,cartoons,...}/` не создаются автоматически.
Точная проверка наличия любого крон-джоба (не верить доке, смотреть систему):
@@ -284,14 +302,25 @@ curl -s -H "X-Api-Key: $PKEY" "http://localhost:9696/prowlarr/api/v1/search?quer
## Известные проблемы
- **✅ 2026-09-21 — ДИСК ЗАПОЛНИЛСЯ НА 100%, ПРИЧИНА УСТРАНЕНА.** `sync-down` добавлял
**5 фильмов ежедневно без проверки свободного места** → диск 0 байт, Radarr отдавал
`disk I/O error` (SQLite не мог писать). Освобождено вручную: удалены **5 remux = 403 ГБ**
(Babylon 93 / Schindler's List 90 / Midsommar 86 / Triangle of Sadness 80 / Unhinged 57 ГБ),
`monitored=false` выставлен всем 5 → диск **100% → 77%** (404 ГБ свободно).
В код добавлен `MIN_FREE_GB = 100`. Полный разбор — [[family/plans/watchlist-disk-overflow-fix]].
⚠️ **Профиль `WEB-4K (no remux)` НЕ защищает от переполнения** — он фильтрует тип релиза,
но не размер файла и не проверяет свободное место.
### 🔴 2026-09-22: авто-закачка УБРАНА ПОЛНОСТЬЮ
Требование Alex: **закачек быть не должно**. Сделано:
1. **`sync-down` вырезан из крона.** `watchlist-nightly.sh` стр. 32-36 — вызов закомментирован,
вместо него `log "sync-down: ПРОПУЩЕН (автозакачка отключена 2026-09-22)"`.
Бэкап `watchlist-nightly.sh.bak-20260922-182655`. Код `sync_down.py` НЕ удалён — можно
запустить вручную.
2. **16 авто-закачек удалены из Radarr** (все с `added >= 2026-09-20`) через API с
`deleteFiles=true` — без этого параметра файл остаётся на диске сиротой.
50 → 34 фильма, 12 с файлами, ошибок 0.
Дамп для отката: `/tmp/radarr-sonarr-dump-20260922-184351/radarr-movies.json`.
3. **Sonarr не тронут** — 13 сериалов, авто-закачек там не было.
4. **Все 34 фильма `monitored=false`** — Radarr не будет ничего докачивать.
⚠️ **Порядок при удалении закачки критичен:** сначала `PUT monitored=false`, потом
`DELETE` с `deleteFiles=true`. Иначе Radarr скачает заново.
### Ранее: инцидент переполнения диска (2026-09-21, устранён)
### Три страховки `sync-down` (введены 2026-09-21, коммиты `2642882`, `a131208`)
@@ -647,36 +676,99 @@ GET /Users/{uid}/Items?IsPlayed=true&IncludeItemTypes=Movie&Fields=DatePlayed,Pa
⚠️ **Это не косметика, а причина, по которой авто-очистка диска не работает.** `sync-up` переносит watched-историю Jellyfin в `[x]`, а `cleanup` удаляет только то, что помечено `[x]`. Пока Jellyfin не видит Radarr-библиотеку, диск (94.7%) будет заполняться, а cleanup будет ежедневно писать «nothing to delete». Разбираться с этим, а не с cleanup. Детали — [[family/plans/watchlist-cleanup]].
### Radarr: состояние библиотеки (замер 2026-09-21)
### Radarr: состояние библиотеки (замер 2026-09-22)
- 46 фильмов в базе, **28 с файлами** (на 2026-09-20 было 18 — библиотека растёт, диск заполняется).
- Топ по размеру: Babylon 98.8 GB, Schindler's List 95.9, Midsommar 91.9, Triangle of Sadness 85.6, Chaos Walking 62.7, Unhinged 60.9.
- 🔴 **Диск `/dev/sda1` ЗАПОЛНЕН 100% (0 байт свободно), 2026-09-21.** Ранее (2026-09-21 утром) было 94.7%, `df` показывал 100%. **Radarr лежит с `disk I/O error`** — SQLite не может писать при нуле места:
```bash
curl -s "http://localhost:7878/radarr/api/v3/movie?apikey=$KEY"
# → {"message":"disk I/O error","description":"...SQLiteException (0x87AF045D): disk I/O error..."}
```
⚠️ **API Radarr не читается, пока диск не освобождён** — не искать причину в конфиге/сети, сначала проверить место.
**Причина заполнения:** `sync-down --batch 5` качал 5 фильмов ежедневно без проверки свободного места. `watchlist-nightly` и `watchlist-discover` **остановлены** 2026-09-21 (см. [[family/projects/watchlist-automation]]).
**Виновники по объёму — 5 remux-файлов = 403.4 ГБ:** Babylon 92.0, Schindler's List 89.4, Midsommar 85.6, Triangle of Sadness 79.7, Unhinged 56.7 ГБ. Остальные 22 файла (WEB-DL/BDRip, 4–29 ГБ) — не remux, не трогать.
- ✅ **РЕШЕНО 2026-09-21: диск освобождён 100% → 77% (свободно 404 ГБ).** Radarr API ожил (49 фильмов).
Как делалось:
1. Удалены 5 remux-файлов `rm` по точным путям (папки с `.nfo`/постерами оставлены). Бэкап перед — `~/backup-movies-watchlist-20260921-150759.md`.
2. `POST /api/v3/command {"name":"RescanMovie","movieId":N}` для id 4, 18, 35, 36, 37 → `hasFile=false`.
3. `PUT /api/v3/movie/{id}` с `.monitored=false` → все 5 `monitored=false`. Бэкап — `~/backup-radarr-unmonitor-20260921-151117.json`.
⚠️ **Без шага 3 Radarr перекачал бы все 403 ГБ.** Порядок: `monitored=false` **до** любого поиска.
⚠️ Без шага 2 `hasFile` остаётся `true` в кэше — сверить после рескана.
- ✅ **Стоп-кран добавлен 2026-09-21** (`watchlist-sync`, коммит `2642882`): `MIN_FREE_GB = 100.0` в `sync_down.py`, проверка через **`shutil.disk_usage`, НЕ `df`** (`df` врёт на ~4%, учитывает root-резерв ext4). При нехватке — `[STOP] free space ... < 100 GiB — nothing queued` и выход без добавления. Там же добавлен фильтр ужасов (`is_horror()`, `⭐` обходит). Разбор — [[family/plans/watchlist-disk-overflow-fix]].
- **34 фильма в базе, 12 с файлами** (до удаления 16 авто-закачек было 50/28).
- 🔴 **`monitored=0` — ни один фильм не отслеживается.** Radarr ничего не докачает.
- Объём библиотеки на диске: **251.9 GB**.
- Топ по размеру: Chaos Walking 63 GB, Oldboy 31, Project Hail Mary 30, Whiplash 25, The Drama 21.
- Диск: **73%, свободно 477 GB** (`/dev/sda1`, 1.8T).
- ✅ **Диск был освобождён 2026-09-21: 100% → 77%.** История: `sync-down --batch 5` качал
5 фильмов ежедневно без проверки места → диск в 0 байт, Radarr отдавал `disk I/O error`
(SQLite не пишет при нуле места). Удалены 5 remux = 403.4 ГБ (Babylon 92.0, Schindler's
List 89.4, Midsommar 85.6, Triangle of Sadness 79.7, Unhinged 56.7). Бэкапы:
`~/backup-movies-watchlist-20260921-150759.md`, `~/backup-radarr-unmonitor-20260921-151117.json`.
**Порядок при удалении: `RescanMovie` → `PUT monitored=false` → `DELETE`.**
Без снятия monitored Radarr перекачал бы все 403 ГБ.
- ✅ **Стоп-кран `MIN_FREE_GB = 100.0`** в `sync_down.py` (коммит `2642882`): проверка через
**`shutil.disk_usage`, НЕ `df`** (`df` врёт на ~4%, учитывает root-резерв ext4).
При нехватке — `[STOP] free space ... < 100 GiB` и выход без добавления.
Там же фильтр ужасов (`is_horror()`, `⭐` обходит). Разбор — [[family/plans/watchlist-disk-overflow-fix]].
- ⚠️ **С 2026-09-22 `sync-down` в кроне не запускается вообще** — стоп-кран и профиль качества
остаются как страховка для ручного запуска.
- `recycleBin: ''` — **корзины нет, и настраивать её решено НЕ будет** (2026-09-21). `PUT config/mediamanagement` с путём хоста даёт `400 FolderWritableValidator: not writable by user 'abc'`: внутри контейнера Radarr медиа замаплено как `/media`, хостового пути `/srv/...6194539b.../media/.recyclebin` там не существует. Обходить маппингом ради корзины признано нецелесообразным — удаление идёт через Radarr API, а не `rm`. `recycleBinCleanupDays: 7`, `deleteEmptyFolders: False`.
- **Все monitored=True.** Если удалить файл, не сняв monitored, Radarr скачает заново — поэтому `cleanup` делает `PUT monitored=false` **до** `DELETE` (порядок критичен).
- 🔴 **Все `monitored=false` (2026-09-22).** Если удалять файл — `PUT monitored=false` **до** `DELETE` (порядок критичен, иначе скачает заново).
Проверка одним вызовом:
```bash
KEY=$(grep -oP '(?<=<ApiKey>)[^<]+' /srv/...6194539b.../docker/radarr/config/config.xml)
# только фильмы с файлами
curl -s "http://localhost:7878/radarr/api/v3/movie?apikey=$KEY" \
| jq -r '.[] | select(.hasFile) | "\(.id)\t\(.sizeOnDisk/1e9|floor)GB\t\(.monitored)\t\(.title)"'
# сводка одной строкой
curl -s "http://localhost:7878/radarr/api/v3/movie?apikey=$KEY" | jq -r '
"всего=\(length) сФайлом=\([.[]|select(.hasFile)]|length) monitored=\([.[]|select(.monitored)]|length)"'
```
## Watchlist → Lampa: JSON-каталог (2026-09-22)
Второй потребитель watchlist, помимо Radarr/Sonarr: **модуль Catalog в Lampa**. Пайплайн:
```
movies-watchlist.md (боевой .md)
↓ gen_watchlist.py ← крон 30 2 * * * (watchlist-catalog.sh)
watchlist.json + missing.json
↓
Lampa (Catalog): карточки с постерами + маркер ❓ для нерезолвленных
```
### Пути
| Что | Путь |
|---|---|
| Генератор | `$H/lampac/scripts/gen_watchlist.py` |
| Маркер | `$H/lampac/scripts/mark_missing.py` |
| Крон-скрипт | `~/scripts/watchlist-catalog.sh` |
| Боевой `.md` | `$H/obsidian/family/documents/movies-watchlist.md` |
| Вывод | `$H/lampac/wwwroot/watchlist.json` (376 позиций) |
| Нерезолвленные | `$H/lampac/wwwroot/missing.json` |
| Кэш | `$H/lampac/cache/.lampac_tmdb_{cache,details}.json` (скрытые файлы) |
где `$H = /srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f`
### Резолв позиции — три уровня
```
1. Radarr (по названию) ← самый надёжный
2. TMDB поиск по названию (+год ±1)
2b. эвристика КП по названию
2c. kp_id из ссылки в .md → КП → TMDB ← машинный, однозначный (проверяется ПЕРВЫМ из КП)
3. промах → маркер ❓ в .md
```
`KP_SIM_THRESHOLD = 0.75` — порог совпадения названия в КП.
⚠️ **`watchlist.json` использует `channels.*.items[].name`**, НЕ `title`. Поле `title` там отсутствует — не путать при парсинге.
🔴 **Кириллица в ключе каталога Lampa → `ModInit.goInit` чистит `[^a-z0-9\-]` → HTTP 400.**
Нужен `plugin: watchlist` + **числовой** `tmdb_id` (`format: "long.TryParse(...)"`).
Проверять через `/catalog/card?...&type=movie`, НЕ `/card`.
### Маркеры в боевом `.md`
| Маркер | Значение |
|---|---|
| `❓` | не резолвлен (нет в TMDB/КП) |
| `🗓️` | ещё не вышел |
| `👎` | не надо |
| `[x]` | смотрел |
| `⭐` | приоритет (обходит фильтр ужасов и рейтинг) |
`mark_missing.py` работает **в обе стороны**: нет позиции в `missing.json` → маркер `❓` **снимается**.
Полный разбор генератора: [[personal/plans/watchlist-tmdb-missing-marker]].
Деплой и плагин: [[personal/tech/lampac-deployment]].
## Notes
- See [[arr-stack-taiga]] for Taiga (secondary) arr stack
+3
View File
@@ -15,6 +15,9 @@ related:
- '[[personal/plans/lampac-kraken]]'
- '[[personal/plans/lampac-watchlist-plugin]]'
- '[[personal/plans/watchlist-tmdb-missing-marker]]'
- '[[family/how-to/lampac-torrents]]'
- '[[personal/tech/lampac-torrserver]]'
- '[[family/how-to/arr-stack-kraken]]'
- '[[personal/tech/multistream-single-flow-limit]]'
- '[[family/how-to/kraken-network]]'
- '[[family/how-to/tv-luna-send]]'