From 5deb31f01f0abeda60ccd88303b5e91e5b1c3c03 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Wed, 23 Sep 2026 09:45:52 +0600 Subject: [PATCH] [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 --- family/how-to/htpc-webos-luna.md | 23 +++- family/how-to/kraken-network.md | 38 +++++- family/how-to/rasputin-router.md | 32 ++++- .../plans/kraken-media-inventory-cleanup.md | 121 ++++++++++++++++-- .../tech/radarr-sonarr-phantom-records.md | 101 +++++++++++++++ personal/tech/skill-lampac-kraken-deploy.md | 89 +++++++++++-- 6 files changed, 376 insertions(+), 28 deletions(-) create mode 100644 personal/tech/radarr-sonarr-phantom-records.md diff --git a/family/how-to/htpc-webos-luna.md b/family/how-to/htpc-webos-luna.md index f9f8d52a..da851b56 100644 --- a/family/how-to/htpc-webos-luna.md +++ b/family/how-to/htpc-webos-luna.md @@ -91,7 +91,7 @@ ssh root@192.168.1.70 'rm -f /tmp/f.txt; script -q -c \ | SSH | `root@192.168.1.70`, **ключ `~/.ssh/id_rsa`**, `StrictHostKeyChecking no` | | Порты | `22` SSH, `3000`/`3001` Luna | | webOS | **5.4.2**, ядро `4.4.84`, image `starfish-dvb-secured`, build 2602 | -| eth0 link | **100 Mbit/s full duplex** (проверено 2026-09-22, `cat /sys/class/net/eth0/speed` → `100`) | +| eth0 link | **100 Mbit/s full duplex — ЖЕЛЕЗНЫЙ ПОТОЛОК ТВ** (проверено 2026-09-22) | | Кастомные приложения | `org.webosbrew.hbchannel` 0.7.2, `org.webosbrew.inputhook`, `me.wouterdek.magic4pc`, **`com.lampac.tv`** | ⚠️ SSH печатает `post-quantum key exchange` warning — **это норма**, не ошибка. @@ -114,6 +114,27 @@ ssh -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -i ~/.ssh/id_rsa \ раньше, чем успевает пройти pubkey-аутентификация на этой прошивке — не использовать как «проверку», что ключа нет. +## Скорость eth-порта ТВ — потолок железа + +``` +eth0: 100 Mbit/s, full duplex +``` + +🔴 **Это предел сетевой карты телевизора, а не кабеля.** Проверено с заведомо гигабитным +кабелем — ТВ всё равно показывает `100`, больше не даёт. Не диагностировать это как +«битый кабель», не менять патч-корд, не искать гигабит: модель физически не умеет. + +Порт роутера со стороны ТВ при этом может показывать `1000FD` — рассинхрон нормален +и означает, что ограничение на стороне ТВ. + +Проверка (только ключ `id_rsa`): + +```bash +ssh -o StrictHostKeyChecking=no -o IdentitiesOnly=yes -i ~/.ssh/id_rsa \ + -o HostkeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa \ + root@192.168.1.70 'cat /sys/class/net/eth0/speed; cat /sys/class/net/eth0/duplex' +``` + ## Связанные заметки - [[family/how-to/tv-luna-send]] — враппер `~/Automation/tv-luna-send.sh` diff --git a/family/how-to/kraken-network.md b/family/how-to/kraken-network.md index 857869db..12aac2c1 100644 --- a/family/how-to/kraken-network.md +++ b/family/how-to/kraken-network.md @@ -54,7 +54,35 @@ Mac → ТВ 192.168.1.70: 0.596 / 2.295 / 26.874 ms 0% loss (через Mac → Кра́кен 192.168.1.15: 1.321 / 3.169 / 4.233 ms 0% loss ``` -🔴 **Пропускная способность нигде не измерена** — `iperf3` не установлен ни на Mac, ни на Rasputin, ни на Кра́кене. Все цифры выше — **латентность**, не скорость. Для Мбит/с нужен `iperf3`: на OpenWrt `opkg install iperf3`, на Mac `brew install iperf3`. +🔴 **Пропускная способность (throughput) нигде не измерена** — все цифры выше это **латентность (RTT)**, не скорость. `1000FD` в `robocfg`/`ethtool` — это **link speed**, согласованная скорость линка, а НЕ реальные Мбит/с. Три разных величины, которые легко спутать: + +| Мера | Инструмент | Что отвечает | +|---|---|---| +| Link speed | `ethtool` / `robocfg` / `sysfs speed` | согласованная скорость линка (потолок) | +| Throughput | `iperf3` | реальные Мбит/с через линк | +| Интернет | speedtest | что даёт провайдер | + +**Состояние `iperf3` (2026-09-22):** + +``` +Распутин: iperf3 3.17.1 ✅ (opkg install iperf3) +Кра́кен: iperf3 3.12 ✅ (apt-get install iperf3) +Mac: НЕ установлен +``` + +⚠️ На OpenWrt в комплекте уже были `libiperf3` и `python3-iperf3` — это **библиотеки, не бинарь**. Проверять `which iperf3`, а не `opkg list-installed | grep iperf`. + +**Замер ещё НЕ сделан.** Блокер: sshd на Распутине отказал (`Connection refused` при живом пинге). Партнёр готов, на Кра́кене сервер поднят на `:5201`. Команды: + +```bash +# на Кра́кене +nohup iperf3 -s -p 5201 > /tmp/iperf3s.log 2>&1 & + +# на Распутине +iperf3 -c 192.168.1.14 -p 5201 -t 10 +``` + +⚠️ Гигабитный линк физически даёт максимум ~940–950 Мбит/с (оверхед Ethernet). На NanoPi R5S реальный потолок может быть ниже — упрётся в CPU. ## Проверка скорости линка — команды (проверено 2026-09-22) @@ -74,9 +102,13 @@ ssh root@192.168.6.1 'cat /sys/class/net/eth0/speed' 🔴 **`robocfg show` на Merlin показывает `1000FD` по порту, но это НЕ значит, что партнёр на гигабите.** Порт 4 показывал `1000FD`, при этом USB-адаптер Mac отдавал `100baseTX` — рассинхрон. Доверять надо цифре **на клиенте** (`ethtool` / `/sys/class/net/*/speed`), а `robocfg` — только как второе мнение. -## ETH-линк ТВ: 100 Мбит (обнаружено 2026-09-22) +## ETH-линк ТВ: 100 Мбит — это ПОТОЛОК ЖЕЛЕЗА ТВ (уточнено 2026-09-22) -ТВ `192.168.1.70` (MAC `ac:5a:f0:25:11:c6`) подключён **кабелем**, и его eth0 держит **100 Mbit/s full duplex** (подтверждено чтением `/sys/class/net/eth0/speed` → `100`). Гигабитные порты роутера при этом дают `1000FD` на других клиентах. +ТВ `192.168.1.70` (MAC `ac:5a:f0:25:11:c6`) подключён **кабелем**, и его eth0 держит **100 Mbit/s full duplex** (подтверждено чтением `/sys/class/net/eth0/speed` → `100`). + +🔴 **Это предел сетевой карты телевизора, а НЕ кабеля.** Проверено с **заведомо гигабитным патч-кордом** — ТВ всё равно отдаёт `100` и больше не даёт. Не диагностировать как «битый/полуживой кабель», не менять патч-корд, не искать гигабит: модель физически не умеет. + +⚠️ Ранняя версия этой заметки (2026-09-04) объясняла 100M «downshift из-за плохого провода» по аналогии с Kraken — **это была неверная гипотеза**. Причина у ТВ другая: ограничение самой сетевой карты. У Kraken причина была своя (патч-корд, заменён 2026-09-04 → линк `1000 full`, подтверждено 2026-09-22). Не переносить вывод с одного устройства на другое. ⚠️ На роутере порт ТВ «мигает» между состояниями в течение сессии: сначала MAC ТВ виден на **Port 1** (`DOWN` в `robocfg`, но MAC присутствует в FDB моста `br0`), затем порт ТВ переехал в **Port 4** (`1000FD`). То есть кабель ТВ перекладывали. **Вывод о линке всегда проверять заново** — он менялся прямо в ходе диагностики. diff --git a/family/how-to/rasputin-router.md b/family/how-to/rasputin-router.md index 173f6405..0e2c3ef7 100644 --- a/family/how-to/rasputin-router.md +++ b/family/how-to/rasputin-router.md @@ -574,7 +574,37 @@ ARP на Rasputin: и `.14`, и `.15` резолвятся в **один** lladd ⚠️ На OpenWrt **`ping -i 0.3` не поддерживается** — busybox-ping отдаёт `ping: invalid number '0.3'`. Использовать `ping -c N` без `-i` или с целым числом. -🔴 **Пропускная способность не измерена** — `iperf3` на Распутине НЕТ. Для Мбит/с: `opkg install iperf3` (нужен интернет через WAN). +🔴 **Пропускная способность не измерена** (2026-09-22). `iperf3` **установлен** на Распутине (`opkg install iperf3` → 3.17.1, `/usr/bin/iperf3`) и на Кра́кене (3.12, `apt-get install iperf3`). Замер не сделан, потому что **sshd на Распутине отказал** (`Connection refused` при живом пинге, см. ниже). + +⚠️ На OpenWrt в комплекте уже были `libiperf3` (3.17.1-r4) и `python3-iperf3` — это **библиотеки, не бинарь**. `which iperf3` до установки пакета пусто. Проверять `which`, а не `opkg list-installed | grep iperf`. + +Замер, когда sshd вернётся: + +```bash +# на Кра́кене +nohup iperf3 -s -p 5201 > /tmp/iperf3s.log 2>&1 & + +# на Распутине +iperf3 -c 192.168.1.14 -p 5201 -t 10 +``` + +⚠️ `1000FD` в `robocfg`/`ethtool` — это **link speed**, НЕ throughput. Реальные Мбит/с даёт только `iperf3`. Гигабит физически даёт максимум ~940–950 Мбит/с (оверход Ethernet); на NanoPi R5S потолок может быть ниже — упрётся в CPU. + +## ⚠️ sshd на Распутине отказывает (2026-09-22, НЕ закрыто) + +Симптом: `ssh root@192.168.6.1` → `Connection refused`, при этом `ping 192.168.6.1` идёт 0% loss (4.4–7.6 ms), и `nc -z 192.168.6.1 22` → `CLOSED`. + +То есть **сеть до роутера жива, но sshd не слушает**. В начале той же сессии SSH работал. Не выяснено: упал ли sshd, кончились ли ресурсы, сработала ли защита, или дело в watchdog/перезагрузке. + +Диагностика на месте (когда будет доступ): + +```sh +service dropbear status # OpenWrt: dropbear, НЕ openssh +logread | grep -i dropbear +netstat -tlnp | grep :22 +``` + +⚠️ Это **второй** случай нестабильного SSH за сессию: ASUS (`192.168.1.1`) тоже начал отдавать `Connection closed by 192.168.1.1 port 22` без причины (порт 22 при этом `nc -z` → succeeded). При недоступности роутера по SSH — сначала `ping` + `nc -z`, чтобы развести «сеть легла» и «демон отказал». ### ✅ ЧТО СДЕЛАНО (2026-09-17) — правило `ip rule` добавлено и работает diff --git a/personal/plans/kraken-media-inventory-cleanup.md b/personal/plans/kraken-media-inventory-cleanup.md index 4897be08..4ef4fa77 100644 --- a/personal/plans/kraken-media-inventory-cleanup.md +++ b/personal/plans/kraken-media-inventory-cleanup.md @@ -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`) +и пустой ответ. Ключи: `` в `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 папок мультфильмов). Внутренний отбор не пофайловый, а по целым папкам. diff --git a/personal/tech/radarr-sonarr-phantom-records.md b/personal/tech/radarr-sonarr-phantom-records.md new file mode 100644 index 00000000..8f3d1d45 --- /dev/null +++ b/personal/tech/radarr-sonarr-phantom-records.md @@ -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 '[^<]+' "$B/radarr/config/config.xml" | sed 's///') +SKEY=$(sudo grep -oE '[^<]+' "$B/sonarr/config/config.xml" | sed 's///') +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` — стек Кра́кена, порты, питфоллы diff --git a/personal/tech/skill-lampac-kraken-deploy.md b/personal/tech/skill-lampac-kraken-deploy.md index e7c9e6f5..b99f74e0 100644 --- a/personal/tech/skill-lampac-kraken-deploy.md +++ b/personal/tech/skill-lampac-kraken-deploy.md @@ -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 не подтверждена.