From 7df9dfca4afc1b43b21496cd42512d6b9b32ef5e Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Tue, 22 Sep 2026 19:39:31 +0600 Subject: [PATCH] docs(arr-kraken): Radarr 34/monitored=0, sync-down removed, catalog cron, watchlist->Lampa pipeline --- family/how-to/arr-stack-kraken.md | 168 ++++++++++++++++++++++------- personal/tech/lampac-deployment.md | 3 + 2 files changed, 133 insertions(+), 38 deletions(-) diff --git a/family/how-to/arr-stack-kraken.md b/family/how-to/arr-stack-kraken.md index f37c3d97..e71633d1 100644 --- a/family/how-to/arr-stack-kraken.md +++ b/family/how-to/arr-stack-kraken.md @@ -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 '(?<=)[^<]+' /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 diff --git a/personal/tech/lampac-deployment.md b/personal/tech/lampac-deployment.md index 4b299eba..2ba3485e 100644 --- a/personal/tech/lampac-deployment.md +++ b/personal/tech/lampac-deployment.md @@ -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]]'