[2026-09-21] eagle: family/how-to/arr-stack-kraken.md family/plans/watchlist-cleanup.md family/plans/watchlist-disk-overflow-fix.md family/projects/watchlist-automation.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-21 15:03:24 +06:00
1 parent c16cf199ce
commit 313df3409d
4 files changed
+309 -10

No files matched your search

+101 -7
View File
@@ -475,15 +475,105 @@ Sonarr API base: http://localhost:8989/sonarr/api/v3/
```
Проверка закачки: `queue` в Radarr показывает `grabbed/downloading`; `history` даёт точное имя взятого релиза. Transmission — `docker exec transmission transmission-remote --list` (RPC-юзер в `settings.json` пустой).
## 🔴 2026-09-21: ДИСК ЗАПОЛНЕН 100%, КРОН `nightly`/`discover` ОСТАНОВЛЕН
**Причина остановки:** `sync-down --batch 5` (5 фильмов ежедневно) работал **без проверки свободного места**. Диск заполнился до **нуля байт**.
### Признак «сервисы ломаются» — Radarr отдаёт disk I/O error
```bash
curl -s "http://localhost:7878/radarr/api/v3/movie?apikey=$KEY"
# → {"message": "disk I/O error\ndisk I/O error",
# "description": "...System.Data.SQLite.SQLiteException (0x87AF045D): disk I/O error..."}
```
SQLite не может писать при нуле свободного места. **Метаданные Radarr через API не читаются, пока диск не освобождён.** Это первое, что надо проверять при «Radarr молчит» на заполненном диске.
### Фактическое заполнение (2026-09-21)
```
df -h → /dev/sda1 1.8T 1.7T 0 100% /srv/dev-disk-by-uuid-6194539b-...
df -h → /dev/mmcblk0p2 14G 4.7G 8.4G 36% / (SD-карта, не медиа-диск)
```
Docker: 29.4.3, Debian 12 bookworm, **arch `aarch64`**, 25 контейнеров, 22 образа.
### Что именно съело место — 5 REMUX-файлов = 403.4 ГБ
Замер `find -printf` по `/media/movies-radarr` (27 видеофайлов). **Настоящих remux'ов ровно 5** — по имени файла (`Remux`/`BDREMUX`/`BDRemux`):
| Размер | Фильм | Файл |
|---|---|---|
| 92.0 GB | Babylon (2022) | `Babylon (2022) - UHD BD-Remux by Wild_Cat.mkv` |
| 89.4 GB | Schindler's List (1993) | `Schindler's.List.1993.2160p.HDR.BDRemux.mkv` |
| 85.6 GB | Midsommar (2019) | `Midsommar.2019.DC.BDREMUX.2160p.HDR.seleZen.mkv` |
| 79.7 GB | Triangle of Sadness (2022) | `Triangle.of.Sadness.2022.BDREMUX.2160p.HDR.seleZen.mkv` |
| 56.7 GB | Unhinged (2020) | `Неистовый.2020.UHD.Blu-Ray.Remux.2160p.mkv` |
| **403.4 GB** | **итого** | |
⚠️ **Остальные 22 файла — НЕ remux** (WEB-DL / BDRip / x264 / x265, 4–29 ГБ). Крупные, но кодированные — не трогать. Например `Oldboy (2003)/Oldeuboi [2003].mkv` 28.6 ГБ и `Project.Hail.Mary...2160p.iT.WEB-DL.DV.HDR.H.265.mkv` 28.1 ГБ — **не remux**, несмотря на размер.
**Корень:** захардкоженный `qualityProfileId: 1` (профиль `Any`) в `arr.py` — починен только 2026-09-04. Всё, что качалось до этого, брало remux'ы по 60–98 ГБ.
### 🔴 Метки `⬇️` на 4 из 5 remux'ов В watchlist НЕТ
Проверено грепом по `family/documents/movies-watchlist.md`:
| Фильм | Строка в watchlist | Метка |
|---|---|---|
| Неистовый (Unhinged) | **107**: `- [x] ⬇️ Неистовый` | ✅ есть (и `[x]`) |
| Babylon (2022) | **83**: `- [ ] Babylon (2022)` | ❌ нет |
| Midsommar | **81**: `- [ ] 🧟♀️ midsommar 2019` | ❌ нет |
| Triangle of Sadness | **82**: `- [ ] Triangle of Sadness 2022` | ❌ нет |
| Schindler's List | **не найден в файле** | ❌ нет |
**Вывод:** `sync-down` помечает `⬇️` только то, что добавил сам. Эти 4 попали в Radarr другим путём (вручную / до появления меток). Снимать метку не с чего — кроме Неистового.
### Порядок работ, согласованный с Alex
1. **Удалить 5 remux-файлов** (403.4 ГБ) → диск оживает → Radarr API заработает.
2. **Снять `⬇️` у Неистового** (строка 107). `[x]` — **не трогать** (это отметка просмотра).
3. **Добавить `MIN_FREE_GB` в скрипт** — стоп-кран перед добавлением в Radarr.
4. ⚠️ Лимит качества Alex считает уже настроенным (`WEB-4K (no remux)`, id 7) — **новый лимит не делаем**.
⚠️ Удаление **напрямую файлами**, не через Radarr API — API лежит на заполненном диске. Radarr пересканирует и увидит `hasFile=false`.
### Остановка крона (сделано 2026-09-21)
```bash
crontab -l > ~/crontab-backup-$(date +%Y%m%d-%H%M%S).txt # бэкап ПЕРЕД
crontab -l | grep -v "watchlist-nightly\|watchlist-discover" > /tmp/crontab-new.txt
crontab /tmp/crontab-new.txt
crontab -l | grep -c "watchlist-nightly\|watchlist-discover" # → 0 (проверка)
```
Бэкап: `~/crontab-backup-20260921.txt`.
**Осталось в кроне:** `sync-vault` (часовой), 2× `pgs-to-srt`, `watchlist-cleanup` (02:00).
**Убрано:** `watchlist-nightly` (01:00), `watchlist-discover` (вс 09:00).
### 🔴 Незакрытые дефекты скрипта (моя ответственность)
| # | Дефект | Следствие |
|---|---|---|
| 1 | Нет проверки свободного места перед `sync-down` | Radarr качает, пока диск не кончится |
| 2 | Нет лимита размера файла | Один фильм = 60–100 ГБ |
| 3 | Нет стоп-крана при заполнении > порога | Нет автоматической остановки |
| 4 | `cleanup` не видит `/media/movies` | Просмотренное не удаляется, диск не освобождается |
**План ремонта (согласован):** сначала Фаза 1 — `MIN_FREE_GB` в скрипт (главный фикс), потом возврат крона с меньшим `--batch`. Cleanup — отдельно.
**Правило на будущее:** любой скрипт, ставящий закачки в очередь, ОБЯЗАН проверять свободное место **до** добавления. Лимита качества недостаточно — он ограничивает тип релиза, но не размер.
---
## Cron Jobs (на Кракене, восстановлены 2026-09-20, дополнены 2026-09-21)
Весь watchlist pipeline работает на Кракене (мигрировал с Eagle 2026-05-27). **Крон был мёртв с 2026-06-20 по 2026-09-20, восстановлен** (детали в начале документа).
| Job | Расписание | Скрипт |
|-----|-----------|--------|
| `watchlist-nightly` | ежедн. 01:00 | `~/scripts/watchlist-nightly.sh` |
| `watchlist-cleanup` | ежедн. 02:00 | `~/scripts/watchlist-cleanup.sh --apply` |
| `watchlist-discover` | вс 09:00 | `~/scripts/watchlist-discover.sh` |
> ⚠️ **С 2026-09-21 `watchlist-nightly` и `watchlist-discover` ОСТАНОВЛЕНЫ** (диск 100%, см. секцию выше). Таблица ниже — целевое состояние; фактически активен только `watchlist-cleanup`.
| Job | Расписание | Скрипт | Факт 2026-09-21 |
|-----|-----------|--------|-----------------|
| `watchlist-nightly` | ежедн. 01:00 | `~/scripts/watchlist-nightly.sh` | ⏹ ОСТАНОВЛЕН |
| `watchlist-cleanup` | ежедн. 02:00 | `~/scripts/watchlist-cleanup.sh --apply` | ✅ активен |
| `watchlist-discover` | вс 09:00 | `~/scripts/watchlist-discover.sh` | ⏹ ОСТАНОВЛЕН |
⚠️ Фактический путь — `~/scripts/`, **не** `~/.hermes/scripts/`. Оба скрипта вызывают CLI напрямую через `uv run --project $WS`, без LLM. `uv` лежит в `~/.local/bin/uv`.
@@ -601,8 +691,12 @@ Jellyfin library mapping: Movies → `movies`, Cartoons → `mixed` (movies + ep
- 🟡 **[2026-09-20] Логи крона в `/tmp/`** — теряются при перезагрузке. Перенести в постоянное место (`~/logs/` или на диск), если нужна история прогонов.
- ✅ **[2026-09-21] Удаление просмотренных фильмов при заполнении диска >90% — ЗАКРЫТО И В КРОНЕ.** Обёртка `~/scripts/watchlist-cleanup.sh` (была в `/tmp` — перенесена через `sudo install`, у kraken sudo **без пароля**), cron `0 2 * * * ... --apply`, лог `/home/kraken/logs/watchlist-cleanup.log`. **Корзина Radarr (`recycleBin`) — решено НЕ настраивать** (контейнерный/хостовый пути расходятся; Alex больше не переспрашивать). Обёртка по умолчанию делает **dry-run** — без `--apply` в кроне был бы вечный холостой ход. Полные детали — [[family/plans/watchlist-cleanup]].
⚠️ Питфолл: `/media` — **не медиа-диск**, а пустая папка на SD-карте (`/dev/mmcblk0p2`), отдаёт 33.9%. Реальный диск `/dev/sda1` в `/srv/dev-disk-by-uuid-6194539b-.../`. Использовать `os.statvfs`, не `shutil.disk_usage("/media")`.
- 🔴 **[2026-09-21] ДИСК КРИТИЧЕН: 94.7% / свободно 4.8 ГБ.** Порог 90% пройден, cleanup реально запускается, но **удаляет 0 файлов**: пересечение `[x]` ∩ Radarr-библиотека = **пусто** (177 просмотренных vs 28 фильмов с файлами). Ждёт, пока в watchlist поставят `[x]` на Radarr-фильмы. Топ-кандидаты: Babylon 98.8 ГБ, Schindler's List 95.9, Midsommar 91.9, Triangle of Sadness 85.6.
- 🔴 **[2026-09-21] КОРЕНЬ: `[x]` не проставляется на новые закачки.** `sync-up` (Jellyfin watched → `[x]`) видит только 6 старых фильмов из `/media/movies`, ни одного из `/media/movies-radarr`. Пока это не починено, cleanup бесполезен, а диск будет заполняться. **Главная незакрытая задача всего pipeline.**
- 🔴 **[2026-09-21] ДИСК ЗАПОЛНЕН 100% (0 байт свободно). `nightly` + `discover` ОСТАНОВЛЕНЫ.** Работал `sync-down --batch 5` ежедневно без проверки места. Radarr лёг с `disk I/O error` (SQLite не может писать). Полный разбор — в секции «🔴 2026-09-21: ДИСК ЗАПОЛНЕН 100%» выше. Бэкап crontab: `~/crontab-backup-20260921.txt`.
- 🔴 **[2026-09-21] ЖДЁТ АПРУВА ALEX: удаление 5 remux-файлов = 403.4 ГБ.** Babylon 92.0 / Schindler's List 89.4 / Midsommar 85.6 / Triangle of Sadness 79.7 / Unhinged 56.7 ГБ. Удалять **файлами напрямую** (Radarr API лежит). Затем снять `⬇️` у Неистового (строка 107), `[x]` не трогать. ⚠️ У 4 из 5 метки `⬇️` в watchlist нет; Schindler's List в файле отсутствует вовсе.
- 🔴 **[2026-09-21] ФАЗА 1 РЕМОНТА: добавить `MIN_FREE_GB` в `sync-down`.** Стоп-кран: если свободно < порога — не добавлять в Radarr. **Главный фикс**, без него возврат крона бессмыслен. Лимит качества Alex считает уже настроенным — **новый не делать**.
- 🔴 **[2026-09-21] КОРЕНЬ: `[x]` не проставляется на новые закачки.** `sync-up` (Jellyfin watched → `[x]`) видит только 6 старых фильмов из `/media/movies`, ни одного из `/media/movies-radarr`. Пока это не починено, cleanup бесполезен, а диск будет заполняться.
- 🔴 **[2026-09-21] ДИСК КРИТИЧЕН: 94.7% / свободно 4.8 ГБ (замер до полного заполнения).** Порог 90% пройден, cleanup реально запускается, но **удаляет 0 файлов**: пересечение `[x]` ∩ Radarr-библиотека = **пусто** (177 просмотренных vs 28 фильмов с файлами).
- 🟡 **[2026-09-21] Cleanup не видит `/media/movies`** — смотрит только Radarr-библиотеку, поэтому просмотренное из папки ручных торрентов не удаляется. Расширять — отдельно и осторожно (удаление файлов).
- 🟡 **[2026-09-20] `sync-down` берёт всего 5 за прогон** — при 250 кандидатах разбор очереди займёт ~50 ночей. Рассмотреть увеличение `--batch` (сейчас `--batch 5` в `watchlist-nightly.sh`). Особенно актуально, раз фильтр `<6.0` уже отсеял 18.
- 🟡 **[2026-09-20] Разобрать 5 застрявших закачек в очереди Radarr** со статусом `warning`: `Brokeback Mountain`, `Мортал Комбат 2`, `Sorry to Bother You`, `Город бога`, `День хомячка`. Висят давно, релиз не находится/не качается.
- 🟡 **[2026-09-20] `Oficina do Diabo` / `Мастерская Сатаны` (2025)** — в Radarr, но релиз не найден. Ждёт RSS. Проверить через несколько дней.