[2026-09-23] eagle: family/how-to/htpc-webos-luna.md family/how-to/kraken-network.md family/how-to/rasputin-router.md personal/plans/kraken-media-inventory-cleanup.md personal/tech/radarr-sonarr-phantom-records.md personal/tech/skill-lampac-kraken-deploy.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-23 09:45:52 +06:00
1 parent de1d2fd93b
commit 5deb31f01f
6 files changed
+376 -28

No files matched your search

+110 -11
View File
@@ -6,7 +6,7 @@ related:
- '[[personal/plans/lampac-kraken]]'
- '[[personal/tech/lampac-deployment]]'
- '[[personal/tech/kraken-truenas-media-copies]]'
status: deleted-765gb-done-fixing-arr-phantoms
status: deleted-765gb-done-arr-phantoms-cleared-jellyfin-rescan-pending
tags:
- kraken
- media
@@ -16,6 +16,9 @@ tags:
- disk-space
- transmission
- truenas
- radarr
- sonarr
- jellyfin
title: Кра́кен — инвентаризация медиа под удаление
type: plan
updated: '2026-09-22'
@@ -26,8 +29,15 @@ updated: '2026-09-22'
> Итог: **802 файла, 233 позиции, 1 236 ГБ.** В watchlist (Lampa покажет) — 29 позиций / 456 ГБ.
> Не в watchlist — 204 позиции / 780 ГБ. **Точных дублей — 46 групп, зря занято 89,2 ГБ.**
>
> ✅ **ВЫПОЛНЕНО 2026-09-22: освобождено 765 ГБ.** Диск 1,3 ТБ → **511 ГБ занято / 1,2 ТБ свободно**.
> Transmission **249 → 9** раздач. Arr-фантомы сняты (Radarr 12 → 0, Sonarr 57 → 0).
> Осталось: **rescan Jellyfin** + уборка `/Users/admin/personal/`.
>
> 🔴 **Цифры watchlist-матча ЗАНИЖЕНЫ — требует пересчёта.** Alex поймал 4 позиции,
> ошибочно записанные в «не в watchlist», хотя они В watchlist (см. раздел «Матч»).
>
> 🔴 **Lampa играет с торрентов, НЕ с диска Кра́кена** (TorrServer `UseDisk: false`).
> Файлы в `media/` в воспроизведении Lampa не участвуют — снос их Lampa не ломает.
## 🔴 Ошибка матча (найдена Alex'ом 2026-09-22)
@@ -598,25 +608,114 @@ Lampa **не участвуют**. Поэтому 24 «watchlist»-фильма
- [x] **Шаг 6b-2 — удалить раздачи из Transmission** ✅ **249 → 9** (три прохода, см. «Шаг 3»)
- [x] **Шаг 6c — удаление файлов** ✅ **693 ГБ**, диск 477 ГБ → 1,2 ТБ свободно
- [x] **Шаг 6d — rescan Radarr/Sonarr** ✅ выполнен (фантомы остались — см. 5b)
- [ ] **Шаг 6e — снять фантомы arr (409)** ⏳ ждёт выбора Alex'а из 3 путей
- [ ] Шаг 6f — приёмка Alex'ом (`df`, Jellyfin, UI)
- [ ] Шаг 6g — обновить доки + коммит
- [x] **Шаг 6e — снять фантомы arr (409)** ✅ **РЕШЕНО** (путь 1, см. «Решение 409»)
- [x] **Шаг 6f — приёмка `df`** ✅ 511 ГБ занято / 1,2 ТБ свободно
- [x] **Шаг 6g — разбор диска** ✅ см. «Что осталось на Кра́кене»
- [ ] Шаг 6h — **rescan Jellyfin** ⏳ (UI вручную или API-ключ)
- [ ] Шаг 6i — приёмка Alex'ом в UI → коммит vault
- [ ] Уборка: `rm -rf /Users/admin/personal` (побочный артефакт, см. ниже)
## 🎯 ГДЕ МЫ СЕЙЧАС (для следующей сессии)
**Медиа удалено (693 ГБ). Transmisson чист (9 раздач). Остались фантомы в arr-стеке.**
**Медиа удалено (765 ГБ), Transmission чист (9 раздач), arr-фантомы СНЯТЫ.**
Диск: **511 ГБ занято / 1,2 ТБ свободно.**
Чтобы продолжить:
1. Получить от Alex выбор из 3 путей решения 409 (см. «Пути решения» выше).
Рекомендация — путь 1, скрипт `/tmp/step10_fix.sh` готов.
2. Если путь 1: `bash /tmp/step10_fix.sh` → проверить, что `hasFile` = 0 у всех.
3. Проверить библиотеки Jellyfin (`:8096`) — смотрит ли он в `media/`.
4. Приёмка Alex'ом → коммит vault.
Осталось ровно два пункта:
1. **Rescan Jellyfin** (`:8096`) — программно не сделан, API-ключа нет. Быстрее всего
руками: Dashboard → Libraries → три точки → **Scan All Libraries** (10 секунд).
Либо создать API-ключ (Dashboard → API Keys) и отдать мне.
2. **Уборка `/Users/admin/personal/`** — побочный артефакт относительного пути.
⚠️ **Манифест уже отработал — повторно не запускать.** `/tmp/delete-manifest.txt`
хранится для истории; путь в нём указывает на удалённые объекты.
## ✅ Решение 409 (Radarr/Sonarr) — пусть 1, выполнено
Alex выбрал путь 1. Понадобилось **два** подхода, потому что 409 менял причину:
| Попытка | Ответ API | Что сделано |
|---|---|---|
| 1 | `Movie's root folder (/media/movies-radarr) doesn't exist` | создал пустые папки через `sudo mkdir` |
| 2 | `Movie's root folder (/media/movies-radarr) is empty. Rescan` | положил заглушку `.keep` + `RescanMovie`/`RescanSeries` → **фантомы снялись сами** |
🔴 **Ключевой факт:** Radarr/Sonarr **блокируют любое изменение записей файлов (409)**,
пока корневая папка отсутствует **или пуста**.
`mkdir` обычным пользователем НЕ работает — `media/` принадлежит `root`,
нужен `sudo mkdir` + `sudo chown kraken:kraken`.
**Порядок, который сработал:**
```bash
# 1. восстановить корневые папки
sudo mkdir -p $M/movies-radarr $M/series-sonarr $M/movies $M/series
sudo chown kraken:kraken $M/{movies-radarr,series-sonarr,movies,series}
# 2. положить заглушку в КОРЕНЬ (иначе «root folder is empty»)
printf 'decoy' > $M/movies-radarr/.keep
printf 'decoy' > $M/series-sonarr/.keep
# 3. RescanMovie / RescanSeries через API — фантомы снимаются САМИ, DELETE не нужен
curl -sL -X POST -H "X-Api-Key: $RKEY" -H 'Content-Type: application/json' \
-d '{"name":"RescanMovie"}' "http://127.0.0.1:7878/radarr/api/v3/command"
curl -sL -X POST -H "X-Api-Key: $SKEY" -H 'Content-Type: application/json' \
-d '{"name":"RescanSeries"}' "http://127.0.0.1:8989/sonarr/api/v3/command"
# 4. убрать заглушки и пустые папки
sudo rm -rf $M/{movies-radarr,series-sonarr,movies,series}
```
⚠️ **`DELETE /api/v3/moviefile/{id}` и `/episodefile/{id}` бесполезны** — они всегда
отдают 409, пока корень битый. Не тратить время, сразу делать Rescan.
**Итог:** Radarr `hasFile=12 → 0`, Sonarr episodeFile `57 → 0`.
Скрипты: `/tmp/step10c.sh` (диагностика причины), `/tmp/step11.sh` (заглушка + rescan),
`/tmp/step12.sh` (ожидание скана + уборка).
🔴 **API-ключи arr НЕ передаются через `?apikey=`** — нужен заголовок `X-Api-Key`.
И **обязателен `curl -sL`**: без `-L` придёт `307` (URL base `/radarr`, `/sonarr`)
и пустой ответ. Ключи: `<ApiKey>` в `docker/{radarr,sonarr}/config/config.xml`.
## Что осталось на Кра́кене (2026-09-22, после чистки)
**Занято 511 ГБ / свободно 1,2 ТБ** (`/dev/sda1`, смонтирован в `...6194539b...`).
| Папка | Размер |
|---|---|
| `documentaries-series` | 236 ГБ |
| `downloads` | 80 ГБ |
| `documentaries` | 72 ГБ |
| `cartoons` | 38 ГБ |
| `cartoons-series` | 31 ГБ |
| `music` | пусто |
| **итого `media`** | **455 ГБ** |
| прочее (docker, логи, БД, backups) | ~56 ГБ |
Мультфильмы: было 169 ГБ → стало 69 ГБ (выжили только короткометражки `cartoons`,
которые Alex не называл). Доксериалы/документалки (307,5 ГБ) — **не тронуты**,
копий на TrueNAS у них нет.
## Time Machine на TrueNAS — шары НЕТ
Проверено 2026-09-22:
| Шара | Путь | `timemachine` | purpose |
|---|---|---|---|
| `old-bu` | `/mnt/RED_2TB/old-bu` | ❌ false | `DEFAULT_SHARE` |
| `storage` | `/mnt/RED_2TB/storage` | ❌ false | `DEFAULT_SHARE` |
| `t610` | `/mnt/RED_2TB/backup/t610` | ❌ false | `DEFAULT_SHARE` |
Ни одна шара не настроена как Time Machine. Finder не увидит их как диск для
резервных копий. Проверять: `midclt call sharing.smb.query | jq -r '.[] |
"\(.name) tm=\(.timemachine) purpose=\(.purpose)"'`.
⚠️ `midclt` под `ssh` требует **`ssh -t`** (нужен TTY), иначе `sudo: a password is required`.
Включение TM на шаре — одна правка `timemachine=true`, Alex'у не предлагалось (не спрашивал).
## ⏳ Открытый вопрос по Jellyfin
Сервер жив: `/health` и `/System/Info/Public` отдают **302** (= страница логина,
не «сломан»). Библиотеки в XML **не видны** — Jellyfin 10.x держит их в SQLite
(`config/data/jellyfin.db`), API-ключ в конфиге не найден.
`docker inspect jellyfin` → смотрит в `/media` (тот же диск).
🔴 **Программный rescan не выполнен.** Сделать рукой в UI либо создать API-ключ.
До этого нельзя утверждать, что библиотека Jellyfin консистентна после сноса.
⚠️ **`rm -rf` на папки `movies`/`movies-radarr`/`series`/`series-sonarr` целиком** —
именно так устроен манифест (41 путь = 4 папки + 37 папок мультфильмов).
Внутренний отбор не пофайловый, а по целым папкам.
@@ -0,0 +1,101 @@
# Radarr / Sonarr — снятие фантомных записей после удаления файлов
> Составлен 2026-09-22 по итогам чистки медиа на Кра́кене (освобождено 765 ГБ).
> Проблема: файлы удалены с диска вручную, а Radarr/Sonarr продолжают показывать
> их как «присутствующие», и **любая попытка исправить это через API падает с HTTP 409**.
## Симптом
После `rm -rf` библиотечных папок:
```bash
curl -X DELETE -H "X-Api-Key: $KEY" "$R/api/v3/moviefile/$FID"
# HTTP 409
{
"message": "Movie's root folder (/media/movies-radarr) doesn't exist.",
"description": "NzbDrone.Core.Exceptions.NzbDroneClientException: ... \
at NzbDrone.Core.MediaFiles.MediaFileDeletionService.DeleteMovieFile(...)"
}
```
Дальше причина **меняется** — это ловушка, на которой легко застрять:
| Состояние корневой папки | Ответ API |
|---|---|
| Удалена | `root folder (/media/x) doesn't exist` |
| Создана, но пуста | `root folder (/media/x) is empty. Rescan` |
| Есть хотя бы один файл | ✅ операция проходит |
🔴 **DELETE `/api/v3/moviefile/{id}` и `/api/v3/episodefile/{id}` в принципе бесполезны**,
пока корень битый. Они проверяют корневую папку **до** удаления записи и отваливаются.
Не подбирать параметры — сразу делать Rescan (см. ниже).
## Решение (порядок, который работает)
```bash
# Переменные
M=/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/media
B=/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/docker
RKEY=$(sudo grep -oE '<ApiKey>[^<]+' "$B/radarr/config/config.xml" | sed 's/<ApiKey>//')
SKEY=$(sudo grep -oE '<ApiKey>[^<]+' "$B/sonarr/config/config.xml" | sed 's/<ApiKey>//')
R="http://127.0.0.1:7878/radarr"; S="http://127.0.0.1:8989/sonarr"
# 1. Восстановить корневые папки. 🔴 media/ принадлежит root — нужен sudo!
sudo mkdir -p "$M/movies-radarr" "$M/series-sonarr" "$M/movies" "$M/series"
sudo chown kraken:kraken "$M/movies-radarr" "$M/series-sonarr" "$M/movies" "$M/series"
# 2. Положить заглушку В КОРЕНЬ — иначе «root folder is empty»
printf 'decoy' > "$M/movies-radarr/.keep"
printf 'decoy' > "$M/series-sonarr/.keep"
# 3. Rescan через API — фантомы снимаются САМИ
curl -sL -X POST -H "X-Api-Key: $RKEY" -H 'Content-Type: application/json' \
-d '{"name":"RescanMovie"}' "$R/api/v3/command"
curl -sL -X POST -H "X-Api-Key: $SKEY" -H 'Content-Type: application/json' \
-d '{"name":"RescanSeries"}' "$S/api/v3/command"
# 4. Подождать скан (Sonarr идёт ~60 сек, снимает пачками), проверить
curl -sL -H "X-Api-Key: $RKEY" "$R/api/v3/movie" | jq '[.[]|select(.hasFile==true)]|length' # → 0
curl -sL -H "X-Api-Key: $SKEY" "$S/api/v3/series" | jq '[.[].statistics.episodeFileCount]|add' # → 0
# 5. Убрать заглушки и пустые папки
sudo rm -rf "$M/movies-radarr" "$M/series-sonarr" "$M/movies" "$M/series"
```
Проверено: Radarr `hasFile` **12 → 0**, Sonarr episodeFile **57 → 0**.
## Питфоллы
🔴 **`?apikey=` НЕ работает.** Нужен заголовок `X-Api-Key`. С query-параметром
приходит пустой ответ или 401, и выглядит как «API мёртв».
🔴 **Обязателен `curl -sL`.** У обоих стеков задан `UrlBase` (`/radarr`, `/sonarr`) —
без `-L` вернётся `307 Temporary Redirect` с нулевым телом.
Проверять: `curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:7878/` → `307`.
🔴 **`mkdir` без sudo падает** (`Permission denied`) — каталог `media/` на диске
принадлежит `root:root`, при том что вложенные папки уже `kraken:kraken`.
⚠️ **Сканы асинхронные.** `RescanSeries` возвращает `{"status":"started"}` мгновенно,
работа идёт десятками секунд и снимает записи **пачками** (25 → 13 → 0).
Не делать вывод «не сработало» по одному замеру — поллить.
⚠️ **RescanMovie/RescanSeries без `movieIds`/`seriesIds` = вся библиотека.** С `ids`
сканируется только указанное. Для снятия фантомов нужен полный вариант.
## Родственный факт: Transmission пересоздаёт раздачи
После `torrent-remove` часть раздач **возвращается с новыми ID** (у нас 8 из 240).
Причина — файлы ещё на диске + активное сидирование. Лечится повторным проходом
после удаления файлов, причём фильтровать надо по `downloadDir`, а не по сохранённому
списку ID.
⚠️ В `downloadDir` бывают пути **вне** ожидаемых префиксов — у нас `/downloads/radarr`
не попал под фильтр `("/downloads/complete", ...)`, и раздача пережила первый проход.
Проверять итог по фактическому `torrent-get`, а не по «сколько отправили на удаление».
## Связанное
- `personal/plans/kraken-media-inventory-cleanup.md` — вся чистка 765 ГБ
- `personal/tech/kraken-truenas-media-copies.md` — сверка копий Кра́кен ↔ TrueNAS
- `personal/tech/lampac-deployment.md` — стек Кра́кена, порты, питфоллы
+77 -12
View File
@@ -134,14 +134,77 @@ related:
**Причина: `rootfolder` хранится в БД arr.** Удалил папку — `MediaFileDeletionService`
отказывается работать с записями. **Rescan НЕ помогает** (файлы исчезли ДО скана):
осталось 12 фильмов и 57 эпизодов фантомами. У Radarr список rootfolders стал ПУСТ.
**Лечение:** пересоздать пустые root-папки → DELETE записей → `sudo rmdir`.
**Общее правило: дамп API ДО удаления; если сносишь корневую папку библиотеки —
планируй чистку записей в том же проходе, потом уже не получится.**
32. ⚠️ **rescan командой, а не через UI:**
`POST /radarr/api/v3/command {"name":"RescanMovie"}`,
`POST /sonarr/api/v3/command {"name":"RescanSeries"}` (с `-L` и `X-Api-Key`).
33. ⚠️ **Jellyfin на Кра́кене жив** (`/health` → 302). Порт `:8096`. Проверять библиотеки
до/после — единственная реальная связь `media/` с просмотром.
32. 🔴🔴 **409 меняет причину — двух барьеров ДВА, останавливаться на первом нельзя.**
```
папки нет → "root folder (...) doesn't exist"
папка пуста → "root folder (...) is empty. Rescan"
есть файл → ✅ операция проходит
```
⚠️ **DELETE `moviefile`/`episodefile` — тупик.** Эти эндпоинты проверяют корень
ДО удаления записи, поэтому 409 будет вечно. Не крутить параметры — сразу Rescan.
**✅ ЛЕЧЕНИЕ (применено 2026-09-22, Radarr 12→0 / Sonarr 57→0):**
```bash
M=/srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/media
# 1. корневые папки — 🔴 sudo обязателен, сам media/ принадлежит root
sudo mkdir -p "$M"/{movies-radarr,series-sonarr,movies,series}
sudo chown kraken:kraken "$M"/{movies-radarr,series-sonarr,movies,series}
# 2. заглушка В КОРЕНЬ — иначе вторые ворота «root folder is empty»
printf 'decoy' > "$M/movies-radarr/.keep"; printf 'decoy' > "$M/series-sonarr/.keep"
# 3. Rescan — фантомы снимаются САМИ, DELETE не нужен
curl -sL -X POST -H "X-Api-Key: $RKEY" -H 'Content-Type: application/json' \
-d '{"name":"RescanMovie"}' "$R/api/v3/command"
curl -sL -X POST -H "X-Api-Key: $SKEY" -H 'Content-Type: application/json' \
-d '{"name":"RescanSeries"}' "$S/api/v3/command"
# 4. убрать заглушки и папки
sudo rm -rf "$M"/{movies-radarr,series-sonarr,movies,series}
```
⚠️ **Сканы асинхронные, снимают пачками** (25 → 13 → 0), Sonarr ~60 сек.
Не судить по одному замеру — поллить `jq '[.[].statistics.episodeFileCount]|add'` до 0.
⚠️ `RescanMovie`/`RescanSeries` БЕЗ `ids` = вся библиотека (нужен именно такой).
⚠️ `mkdir` без `sudo` падает — `media/` это `root:root`, хотя дети `kraken:kraken`.
Скрипты: `/tmp/step10c.sh` (диагностика), `/tmp/step11.sh` (заглушка+rescan),
`/tmp/step12.sh` (ожидание + уборка).
33. ⚠️ **Jellyfin на Кра́кене жив** (`/health` → 302). 🔴 **302 = страница логина, НЕ поломка.**
Порт `:8096`. Библиотеки в XML **не видны** — Jellyfin 10.x держит их в SQLite
(`docker/jellyfin/config/data/jellyfin.db`), API-ключа в конфиге нет → программный
rescan не сделать. Быстро: Dashboard → Libraries → три точки → **Scan All Libraries**.
⛔ **Не объявлять библиотеку консистентной после массового сноса до этого rescan.**
## ✅ Чистка медиа — ЗАВЕРШЕНА 2026-09-22
| Метрика | До | После |
|---|---|---|
| Свободно | 477 ГБ | **1,2 ТБ** |
| Занято | 1,3 ТБ | **511 ГБ** |
| Раздач Transmission | 249 | **9** (только документалки) |
| Radarr фильмов с файлами | 12 | **0** |
| Sonarr эпизодных файлов | 57 | **0** |
Освобождено **765 ГБ**. Снесено: `movies` 309,7 · `movies-radarr` 234,6 · `series-sonarr` 116,1 ·
`series` 3,6 · 37 папок мультфильмов 168 ГБ.
**Осталось в `media/` (455 ГБ):** `documentaries-series` 236 · `downloads` 80 ·
`documentaries` 72 · `cartoons` 38 · `cartoons-series` 31 · `music` пусто.
Мультфильмы 169 → 69 ГБ (выжили только короткометражки, которые Alex не называл).
⚠️ **Документалки (307,5 ГБ) НЕ ТРОГАЛИ — копий нет ни на одном хосте.**
## TrueNAS: шары Time Machine НЕТ
```bash
ssh -t truenas_admin@mallexxx.duckdns.org \
'midclt call sharing.smb.query | jq -r ".[] | \"\(.name) tm=\(.timemachine) purpose=\(.purpose)\""'
```
```
old-bu tm=false /mnt/RED_2TB/old-bu purpose=DEFAULT_SHARE
storage tm=false /mnt/RED_2TB/storage purpose=DEFAULT_SHARE
t610 tm=false /mnt/RED_2TB/backup/t610 purpose=DEFAULT_SHARE
```
Ни одна шара не включена как Time Machine — Finder не предложит её для бэкапа.
Включение = один флаг `timemachine=true`, **не делалось** (Alex не просил).
⚠️ `midclt` по ssh требует **`ssh -t`** (нужен TTY), иначе `sudo: a password is required`.
## Установка Lampa на ТВ (сжато)
@@ -180,15 +243,17 @@ ssh kraken 'sudo rm -rf /srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e8
- Лимит кэша TorrServer — дефолт (`UseDisk: false`, 96 МБ RAM). ⚠️ Это и есть причина,
что Lampa играет с торрентов, а не с диска — менять только осознанно.
- ✅ **Удаление медиа на Кра́кене ВЫПОЛНЕНО** (2026-09-22): 693 ГБ, диск 477 ГБ → 1,2 ТБ,
- ✅ **Удаление медиа на Кра́кене ВЫПОЛНЕНО** (2026-09-22): **765 ГБ**, диск 477 ГБ → 1,2 ТБ,
Transmission 249 → 9 раздач. Детали: [[personal/plans/kraken-media-inventory-cleanup]].
- 🔴 **НЕ ЗАКРЫТО: 12 фантомных фильмов в Radarr + 57 эпизодов в Sonarr.** DELETE через API
→ **409** (`root folder doesn't exist`). Решение предложено, ответа Alex'а нет.
Скрипт `/tmp/step10_fix.sh` готов, не запускался. Питфолл 31 выше.
- ⚠️ Проверка библиотек Jellyfin на Кра́кене перед удалением — **не сделана**
(команда ушла в таймаут апрува). Jellyfin жив: `/health` → 302.
- ✅ **Фантомы arr СНЯТЫ** (2026-09-22): Radarr `hasFile` 12 → 0, Sonarr episodeFile 57 → 0.
Лечение — питфолл 32. Отдельный справочник: [[personal/tech/radarr-sonarr-phantom-records]].
- ⏳ **Jellyfin: rescan НЕ сделан.** Жив (`/health` → 302 = логин, не поломка), но библиотека
не пересканирована — программно нельзя без API-ключа. Сделать в UI:
Dashboard → Libraries → три точки → **Scan All Libraries**.
- ⚠️ Уборка: каталог `/Users/admin/personal/` (артефакт записи по относительному пути) —
удалить.
- ⚠️ **TrueNAS: шары Time Machine нет** (`timemachine=false` у `old-bu`, `storage`, `t610`).
Включается флагом, но Alex не просил.
- Шаг 7 — watchlist в UI Lampa: [[personal/plans/lampac-watchlist-plugin]].
- Секции Watchlist внутри CUB-фида — инжект залит, приёмка в UI не подтверждена.