Files
obsidian-vault/family/plans/watchlist-disk-overflow-fix.md
T

166 lines
8.7 KiB
Markdown
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: План — переполнение диска Kraken (watchlist pipeline)
created: '2026-09-21'
updated: '2026-09-21'
type: plan
namespace: family
status: in-progress
tags:
- kraken
- watchlist
- disk
- radarr
- incident
related:
- '[[family/projects/watchlist-automation]]'
- '[[family/plans/watchlist-cleanup]]'
- '[[family/how-to/arr-stack-kraken]]'
---
# План: переполнение диска Kraken — причины и ремонт
> **Инцидент 2026-09-21.** Диск `/dev/sda1` на Кра́кене (1.8 ТБ) заполнен до **нуля байт**.
> Radarr лежит с `disk I/O error`. `watchlist-nightly` и `watchlist-discover` остановлены.
> Причина: `sync-down --batch 5` качал 5 фильмов ежедневно **без проверки свободного места**.
---
## Статус: Фаза 0 ожидает апрува Alex
| Фаза | Что | Статус |
|---|---|---|
| 0 | Освободить место (удалить 5 remux = 403.4 ГБ) | 🔴 **ЖДЁТ АПРУВА** |
| 0b | Снять `⬇️` у Неистового в watchlist | ⏸ после Фазы 0 |
| 1 | `MIN_FREE_GB` в скрипт (стоп-кран) | ⏸ |
| 2 | Лимит размера файла | ❌ **НЕ ДЕЛАЕМ** — Alex: «лимит качества и так настроен» |
| 3 | Починить `cleanup` (видит только Radarr) | ⏸ отдельно |
| 4 | Вернуть крон с меньшим `--batch` | ⏸ после Фазы 1 |
**Сделано 2026-09-21:** крон `watchlist-nightly` + `watchlist-discover` остановлен.
Бэкап crontab: `~/crontab-backup-20260921.txt`.
---
## Фаза 0 — Освободить место (БЛОКЕР)
### Что удалять: 5 remux-файлов, 403.4 ГБ
Замер `find -printf` по `/media/movies-radarr` — 27 видеофайлов, **remux'ов ровно 5**:
```
92.0 GB /media/movies-radarr/Babylon (2022)/Babylon (2022) - UHD BD-Remux by Wild_Cat.mkv
89.4 GB /media/movies-radarr/Schindler's List (1993)/Schindler's.List.1993.2160p.HDR.BDRemux.mkv
85.6 GB /media/movies-radarr/Midsommar (2019)/Midsommar.2019.DC.BDREMUX.2160p.HDR.seleZen.mkv
79.7 GB /media/movies-radarr/Triangle of Sadness (2022)/Triangle.of.Sadness.2022.BDREMUX.2160p.HDR.seleZen.mkv
56.7 GB /media/movies-radarr/Unhinged (2020)/Неистовый.2020.UHD.Blu-Ray.Remux.2160p.mkv
```
Полный префикс пути: `/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f`.
### ⚠️ Что НЕ трогать
**22 остальных файла — не remux** (WEB-DL / BDRip / x264 / x265, 4–29 ГБ). Размер не признак:
| Файл | Размер | Тип |
|---|---|---|
| `Oldboy (2003)/Oldeuboi [2003].mkv` | 28.6 GB | не remux |
| `Project.Hail.Mary...2160p.iT.WEB-DL.DV.HDR.H.265.mkv` | 28.1 GB | не remux (WEB-DL) |
| `Whiplash (2014)/Одержимость (Whiplash) 2014.mkv` | 23.7 GB | не remux |
**Признак remux — имя файла:** `Remux` / `BDREMUX` / `BDRemux` / `BD-Remux`.
### 🔴 Метки `⬇️` в watchlist — есть только у одного из пяти
`family/documents/movies-watchlist.md`:
| Фильм | Строка | Метка |
|---|---|---|
| Неистовый (Unhinged) | 107: `- [x] ⬇️ Неистовый` | ✅ |
| Babylon (2022) | 83: `- [ ] Babylon (2022)` | ❌ |
| Midsommar | 81: `- [ ] 🧟‍♀️ midsommar 2019` | ❌ |
| Triangle of Sadness | 82: `- [ ] Triangle of Sadness 2022` | ❌ |
| Schindler's List | — | **отсутствует в файле** |
`sync-down` ставит `⬇️` только на то, что добавил сам. Эти четыре попали в Radarr иначе.
**Решение Alex:** снять `⬇️` (там, где есть). `[x]` у Неистового **не трогать** — это отметка просмотра.
### Почему удаляем файлами, а не через Radarr API
Radarr **не отвечает** — диск в нуле, SQLite не может писать:
```json
{"message": "disk I/O error",
"description": "...System.Data.SQLite.SQLiteException (0x87AF045D): disk I/O error..."}
```
После освобождения места Radarr сам пересканирует и увидит `hasFile=false`.
---
## Фаза 1 — Стоп-кран `MIN_FREE_GB` (главный фикс)
**Цель:** перед добавлением фильма в Radarr проверить свободное место. Если мало — не добавлять.
**Где:** `watchlist_sync/sync_down.py` (или `cli.py` — уточнить по коду перед правкой).
```python
# Minimum free space on the media disk before queueing new downloads.
# Prevents filling the disk to zero (incident 2026-09-21).
MIN_FREE_GB = 100 # ← значение согласовать с Alex
```
Проверка **перед** циклом добавления:
```python
st = os.statvfs(MEDIA_PATH) # НЕ shutil.disk_usage("/media")!
free_gb = (st.f_bfree * st.f_frsize) / (1024**3)
if free_gb < MIN_FREE_GB:
print(f"only {free_gb:.1f} GB free (< {MIN_FREE_GB} GB) — not queueing anything")
return
```
⚠️ **Питфолл:** `/media` — **не медиа-диск**, это пустая папка на SD-карте (`/dev/mmcblk0p2`, 14 ГБ). Реальный диск — `/srv/dev-disk-by-uuid-6194539b-.../`. Брать `os.statvfs` по реальному корню.
⚠️ **`df` завышает** (~+4%, root-резерв ext4). Для порогов использовать `os.statvfs`.
**Порядок работ:** бэкап → правка → dry-run → проверка Alex → коммит.
---
## Фаза 2 — Лимит размера ❌ НЕ ДЕЛАЕМ
Alex 2026-09-21: **«лимит качества и так настроен»**. Профиль `WEB-4K (no remux)` (Radarr/Sonarr id **7**) уже запрещает Remux-1080p/2160p и BR-DISK. Новых лимитов не вводим.
⚠️ Но: профиль **не ограничивает размер** — только тип релиза. Все 5 виновников качались под профилем `Any` (id 1) **до фикса 2026-09-04**. Существующие файлы под новый профиль не подпадают.
---
## Фаза 3 — Починить `cleanup` (отдельно, осторожно)
**Дефект:** cleanup сопоставляет `[x]` из watchlist с **Radarr-библиотекой**, а просмотренное лежит в `/media/movies` (ручные торренты). Пересечение = 0 → удаляет 0 файлов.
**Замер 2026-09-21:** `watchlist [x] items: 177` / `radarr movies with file: 28` / `nothing to delete`.
**Это не причина инцидента** — cleanup не мог занять место, он только удаляет. Расширять его — отдельная задача, идёт после Фаз 0–1.
---
## Фаза 4 — Вернуть крон
После того как Фаза 1 проверена и стоп-кран работает:
- вернуть строки `watchlist-nightly` (01:00) и `watchlist-discover` (вс 09:00) в crontab;
- **снизить `--batch`** (сейчас 5) — 5 фильмов/сутки без учёта размера и есть корень инцидента.
---
## Уроки
1. **Любой скрипт, ставящий закачки в очередь, ОБЯЗАН проверять свободное место до добавления.** Лимита качества недостаточно — он про тип релиза, не про размер.
2. **«Radarr молчит / I/O error» на заполненном диске — сначала проверить место**, потом конфиг и сеть.
3. **Крон в 01:00 без присмотра = диск заполняется незаметно.** Тревога при >порога не настроена: cleanup писал «nothing to delete» и молчал.
4. **Не выдавать догадки за факт.** Первая версия разбора указывала на `cleanup` как виновника — Alex поправил: cleanup удаляет, а не занимает. Виновник — `sync-down`.
---
## Связанные заметки
- [[family/projects/watchlist-automation]] — полный pipeline, статус крона
- [[family/plans/watchlist-cleanup]] — механизм cleanup (порог 90%, лимит 10)
- [[family/how-to/arr-stack-kraken]] — *arr стек, профили качества, API