From 21505ec241cacb9b35a5278a2a25d03fb0929bf7 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Mon, 21 Sep 2026 15:34:09 +0600 Subject: [PATCH] [2026-09-21] eagle: family/how-to/arr-stack-kraken.md family/plans/watchlist-cleanup.md family/projects/watchlist-automation.md --- family/how-to/arr-stack-kraken.md | 8 ++++ family/plans/watchlist-cleanup.md | 26 +++++++++-- family/projects/watchlist-automation.md | 60 +++++++++++++++++++++++-- 3 files changed, 87 insertions(+), 7 deletions(-) diff --git a/family/how-to/arr-stack-kraken.md b/family/how-to/arr-stack-kraken.md index 443d2739..d45c1621 100644 --- a/family/how-to/arr-stack-kraken.md +++ b/family/how-to/arr-stack-kraken.md @@ -284,6 +284,14 @@ 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-20: compose-файл может ВРАТЬ про сеть.** Ранее в compose Radarr был указан `jellyfin_default`, а реально контейнер жил в `docker_default`; при починке выяснилось, что compose уже писал `media_net`, но контейнеры не были пересозданы. **Всегда проверять фактическое `docker inspect -f '{{range $k,$v := .NetworkSettings.Networks}}{{$k}} {{end}}' `, а не docker-compose.yml.** - **17 фильмов в Radarr `hasFile=False`** — ждут подходящего релиза в Prowlarr. Scream (1996) в процессе загрузки. - **Prowlarr** — если долго не находит релизы, проверить статус индексеров (`/api/v1/health`). ⚠️ health врёт, реальную причину блокировки смотреть в `config/logs/prowlarr.debug.txt` — см. секцию «🔴 Индексера Prowlarr — починка Cloudflare (2026-09-20)» ниже. diff --git a/family/plans/watchlist-cleanup.md b/family/plans/watchlist-cleanup.md index 4e56f369..5cc0db01 100644 --- a/family/plans/watchlist-cleanup.md +++ b/family/plans/watchlist-cleanup.md @@ -1,9 +1,27 @@ # План: авто-удаление просмотренного (watchlist cleanup) **Дата:** 2026-09-20 (обновлено 2026-09-21) -**Статус:** ✅ РЕАЛИЗОВАНО И В КРОНЕ. Корзина закрыта (без неё). ⚠️ **Бесполезен сейчас: диск 100%, пересечение `[x]` ∩ Radarr = 0. Блокер — заполнение диска, см. [[family/plans/watchlist-disk-overflow-fix]]** +**Статус:** ✅ РЕАЛИЗОВАНО И В КРОНЕ. Корзина закрыта (без неё). ⚠️ **По-прежнему бесполезен: пересечение `[x]` ∩ Radarr = 0 + не покрывает `/media/movies`. Диск освобождён 2026-09-21 вручную (100% → 77%), см. [[family/plans/watchlist-disk-overflow-fix]]** **Связано:** [[watchlist-automation]], [[arr-stack-kraken]], [[watchlist-disk-overflow-fix]] +> ## ✅ 2026-09-21 — ИНЦИДЕНТ ЗАКРЫТ (краткая выжимка для будущих сессий) +> +> Задачу «диск 100%» решали **не через cleanup**, а правкой `sync-down`. Полный разбор — +> [[family/plans/watchlist-disk-overflow-fix]]. Здесь — только то, что касается cleanup: +> +> 1. **cleanup НЕ виноват в заполнении** — он только удаляет (Alex поправил первичный неверный вывод). +> 2. **Корень:** `sync-down --batch 5` ежедневно без проверки места. Починено: `MIN_FREE_GB = 100`, +> фильтр ужасов, надёжный `mark_queued` (коммиты `2642882`, `a131208`). +> 3. **Диск освобождён вручную** — удалены 5 remux (403 ГБ), `monitored=false`. Не cleanup'ом. +> 4. **cleanup всё ещё не освободит место**, потому что: +> - пересечение `[x]` ∩ Radarr-файлы = **0** (просмотренное лежит в `/media/movies` — ручные торренты); +> - cleanup смотрит **только Radarr-библиотеку** и не покрывает `/media/movies`. +> → **Открытая задача.** Расширять cleanup на `/media/movies` — отдельная работа. +> 5. Крон cleanup (`0 2 * * *`) **оставлен активным** — безвреден, сработает когда появится `[x]` ∩ Radarr. +> +> **Порядок правок для будущих сессий:** коммит ДО → правка → заливка → проверка Alex → коммит ПОСЛЕ. +> `~/scripts/` на kraken — root:root, писать только через `sudo install -m 755`, `sudo` без пароля. + --- ## 🟢 ИТОГ 2026-09-21: в кроне, корзины нет @@ -155,8 +173,10 @@ Triangle of Sadness 79.7 / Unhinged 56.7). Остальные 22 файла — **Сделано:** крон `watchlist-nightly` + `watchlist-discover` **остановлен** (бэкап `~/crontab-backup-20260921.txt`). `watchlist-cleanup` (02:00) **оставлен активным** — он безвреден. -**Ожидает апрува:** удаление 5 remux-файлов + снятие `⬇️` у Неистового. -Полный план ремонта — [[family/plans/watchlist-disk-overflow-fix]]. +**⚪ УСТАРЕЛО (историческая запись):** «ожидает апрува удаление 5 remux + снятие `⬇️`». +**Фактически выполнено 2026-09-21:** 5 remux удалены (403 ГБ), `monitored=false` всем 5, +`⬇️` снята у Неистового (стр. 107) и Списка Шиндлера (стр. 396), крон возвращён с `--batch 2`. +Итог и верификация — [[family/plans/watchlist-disk-overflow-fix]]. ### Что это меняет для cleanup diff --git a/family/projects/watchlist-automation.md b/family/projects/watchlist-automation.md index 08611433..bb15fc1f 100644 --- a/family/projects/watchlist-automation.md +++ b/family/projects/watchlist-automation.md @@ -47,27 +47,41 @@ Jellyfin (8096) → rescan → виден контент | `👎` | не хочу (новинка) | process-thumbs перемещает в `## Новинки👎` | | `🗓️` | upcoming (ещё не вышел) | discover помечает, не скачивается | | `❓` | не найдено / ambiguous | ждёт ручного уточнения | -| `🧟‍♀️` | horror (genre_id=27) | информационный маркер | -| `⭐` | **приоритет к загрузке** (U+2B50) | sync-down берёт в первую очередь, **фильтр рейтинга не применяется** ✅ реализовано 2026-09-20 | +| `🧟‍♀️` | horror (genre_id=27) | **не скачивается** (фильтр в `sync-down` с 2026-09-21), если нет `⭐` | +| `⭐` | **приоритет к загрузке** (U+2B50) | sync-down берёт в первую очередь, **обходит ВСЕ фильтры** (рейтинг + ужасы) ✅ 2026-09-20/21 | ⚠️ **`✭` (U+272D) — НЕ приоритет.** Alex 2026-09-20 явно указал: звёздочкой-приоритетом считается только `⭐` (U+2B50). Символ `✭` используется в файле как обычная пометка «выделенное», приоритетом не является. Также: `⭐` засчитывается **только в строке фильма** (`- [ ] Название ⭐ …`), НЕ в под-буллетах кандидатов, которые генерирует `mark_ambiguous` (там формат «Название (год) ★N.N»). `[x]` (просмотренные) с `⭐` игнорируются. Работает **из всех секций** (`## Фильмы`, `## Новинки`, `## Мультфильмы`, `## Аниме`). -## Правила отбора в `sync-down` (актуально с 2026-09-20) +## Правила отбора в `sync-down` (актуально с 2026-09-21) Приоритет определяется **двумя факторами**, а не позицией строки: | Условие | Поведение | |---------|-----------| -| `⭐` (U+2B50) в строке фильма | **первыми**, фильтр рейтинга **не применяется** | +| `⭐` (U+2B50) в строке фильма | **первыми**, фильтры рейтинга И ужасов **не применяются** | +| ужас (`is_horror()`, genre_id=27) без `⭐` | **отсеивается**, с логом `[🧟] … horror, skipped` ⬅️ новое 2026-09-21 | | все остальные `[ ]` | **по порядку файла** (сверху вниз), рейтинг ≥ 6.0 | | рейтинг < 6.0 (включая `0.0`) | отсеивается, с логом `[−] … skipped` | | `[x]` | пропускается | | `❓` / `🗓️` (ambiguous) | пропускается, обрабатывается отдельно | +⚠️ **Стоп-кран по месту (2026-09-21):** перед любым добавлением проверяется `MIN_FREE_GB = 100`. +Если свободно меньше — прогон останавливается (`[STOP] free space … — nothing queued`). +Проверка через **`shutil.disk_usage`**, не `df`. Именно отсутствие этой проверки заполнило диск +на 100% 2026-09-21 — см. [[family/plans/watchlist-disk-overflow-fix]]. + +**Фильтр ужасов работает по ЖАНРУ (`candidate.is_horror()`, TMDB genre_id=27), а не по эмодзи `🧟♀️`.** +В dry-run 2026-09-21: **33 horror item(s) skipped**, 14 rating skipped. +Результат для Alex: 41 фильм с `🧟♀️` (многие — свежие релизы 2025–2026) больше не качается. +Обход — поставить `⭐` в строку фильма. + ⚠️ **Порядок файла ≠ рейтинг.** До 2026-09-20 код сортировал по рейтингу TMDB и игнорировал позицию в списке — из-за этого в батч попадали фильмы «не из начала списка». Исправлено коммитом `ada47da`. +⚠️ **`--batch` снижен 5 → 2** (2026-09-21) после инцидента с диском. Меняется в +`~/scripts/watchlist-nightly.sh` (root:root — править через `sudo cp`). + ⚠️ **`⭐` = обход фильтров, а не смена сортировки.** Это принципиальная позиция Alex («Я блядь сказал в приоритете завела»): звёздочка означает явное «хочу», поэтому рейтинг для неё не проверяется вовсе. ## Структура секций movies-watchlist.md @@ -111,6 +125,44 @@ crontab -l # проверка ⚠️ **В `docker exec hermes-kraken hermes cron list` по-прежнему «No scheduled jobs»** — это НЕ про watchlist. Watchlist-скрипты детерминированные, живут в системном cron, в Hermes-планировщике их не должно быть. Не искать их там. +## 🔴 2026-09-21: ДИСК 100% — инцидент и починка `sync-down` + +**Симптом:** диск `/dev/sda1` на Kraken — **0 байт свободно** (`df` 100%). Radarr API отдавал +`disk I/O error` (SQLite не может писать при нуле места) — метаданные недоступны. + +**Причина (НЕ cleanup):** `sync-down` в кроне `watchlist-nightly` (01:00) добавлял +**5 фильмов ежедневно** (`--batch 5`), **без проверки свободного места** и **без фильтра ужасов**. +Radarr качал remux'ы по 57–93 ГБ, пока диск не кончился. Профиль `WEB-4K (no remux)` фильтрует +**тип релиза**, но НЕ размер файла и НЕ проверяет место — от переполнения не защищает. + +**Освобождено вручную:** удалены 5 remux = **403 ГБ** (Babylon 93 / Schindler's List 90 / +Midsommar 86 / Triangle of Sadness 80 / Unhinged 57 ГБ), всем выставлен `monitored=false` +через Radarr API. Диск: **100% → 77%** (404 ГБ). + +**Починено в коде (коммиты `2642882`, `a131208`):** + +| Что | Деталь | +|---|---| +| Стоп-кран по месту | `MIN_FREE_GB = 100.0` в `sync_down.py`, проверка через `shutil.disk_usage` (не `df`) | +| Фильтр ужасов | `candidate.is_horror()` (genre_id=27) пропускает ужасы, если нет `⭐` | +| `mark_queued` | возвращает `bool`, поглощает эмодзи-префикс, логирует промах через `_mark()` | +| `unmark_queued` | **новая функция** — снятие `⬇️` (не существовала) | +| `_clean` | чистит **множественные** эмодзи (`^(?:[chars]+\s*)+`) и **одиночный** год (`*` вместо `+`) | +| `sync_up._mark_watched` | видит эмодзи-префикс (иначе фильм не переходил в `[x]`) | +| `--batch` | **5 → 2** в `~/scripts/watchlist-nightly.sh` (root:root, править `sudo cp`) | + +**Питфоллы, найденные в процессе:** +- `~/scripts/` на Kraken — **root:root 755**, `scp` падает с `Permission denied`. Только `sudo cp`. +- Крон-файлы вернуть можно только через `crontab /tmp/файл`; `crontab -l > f` для бэкапа обязателен. +- `du` по USB-HDD не влезает в SSH-таймаут на 100%-заполненном диске — запускать в фоне через `systemd-run`. +- Когда диск в нуле, **сначала освободить место**, только потом любые API-вызовы Radarr: SQLite мёртв. + +**Открытая задача:** `cleanup` ([[family/plans/watchlist-cleanup]]) **не покрывает `/media/movies`** — +смотрит только Radarr-библиотеку, поэтому просмотренное из ручных торрентов не удаляется. +Пересечение `[x]` ∩ Radarr-файлы = 0. + +**Полный разбор инцидента:** [[family/plans/watchlist-disk-overflow-fix]] + ## 🔴 Аудит 2026-09-20: как выглядело состояние ДО восстановления (историческая справка) **На момент аудита автодобавление фильмов НЕ работало по расписанию.** Скрипты были живы, но их никто не запускал.