[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

@@ -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` — стек Кра́кена, порты, питфоллы