--- title: Skill — lampac-kraken-deploy created: '2026-09-22' updated: '2026-09-22' type: tech namespace: personal tags: - skill - lampac - docker - kraken - devops related: - '[[personal/tech/lampac-deployment]]' - '[[personal/plans/lampac-kraken]]' - '[[family/how-to/tv-luna-send]]' --- # Skill: `lampac-kraken-deploy` > Зеркало скилла `devops/lampac-kraken-deploy`. Файл скилла: > `~/.hermes/hermes-whale/skills/devops/lampac-kraken-deploy/SKILL.md` ## Когда загружать - Деплой/рестарт/отладка Lampac на Кра́кене - Свежий контейнер `healthy`, но `curl :9118` → `Connection reset by peer` - Подключение Lampa на LG ТВ - Вопрос «нужен ли отдельный контейнер TorrServer» Полная техническая справка: [[personal/tech/lampac-deployment]]. ## Ключевое из скилла 1. **Хост — Кра́кен** (`ssh kraken`), aarch64 Debian 12. Не TrueNAS. 2. Образ содержит `linux/arm64` — сборка из исходников не нужна. 3. 🔴 **TorrServer встроенный** — второй контейнер не ставить. 4. Каталоги в корне диска — только через `sudo mkdir` (корень `root:root`, sudo без пароля). 5. 🔴 **Первый старт ~4 минуты.** `Connection reset by peer` — норма, ждать `Configure complete`. `healthy` ≠ готовность HTTP. 6. `docker manifest inspect` с Mac → `denied`; проверять **из Кра́кена**. 7. `docker compose` только как плагин (v5.1.3), не `docker-compose`. 8. Приёмка = играет 5+ минут на ТВ, а не «API отвечает». 9. 🔴 **Lampa на ТВ ставится по SSH, флешка и Media Station X НЕ нужны.** См. [[personal/tech/lampac-deployment]]. 10. 🔴 **`luna-send` по SSH печатает хелп вместо ответа** — обернуть в `script -q -c "..." /tmp/o.txt`. 11. Фактический appId Lampa на ТВ — **`com.lampac.tv`** (не `org.lampa.tv` из запроса установки). ## Инвентаризация диска и удаление (добавлено 2026-09-22) Полная таблица: [[personal/plans/kraken-media-inventory-cleanup]]. 12. 🔴 **arr индексирует только 252 ГБ из 1236** (21%). Остальное — ручные закачки, невидимые в UI Radarr/Sonarr. «Нет в Radarr» ≠ «нет на диске». 13. 🔴 **`downloads/complete/sonarr/` — завершённые раздачи, не удалённые после импорта.** Байт-в-байт дубли библиотеки = **78,6 ГБ зря**. Самый безопасный кандидат на снос. 14. 🔴 **Матч с watchlist — только СТРОГОЕ равенство** нормализованных названий, `len >= 4`. Подстрочный матч раздувает счёт: 42 позиции / 811 ГБ вместо реальных 29 / 456 ГБ. 15. 🔴 **В `watchlist.json` нет поля `tmdb_id`** — он в `href` (`.../movie/424781`), вынимать регексом `/(\d{2,9})/?$`. 16. 🔴 **`missing.json` (30 позиций с `❓`) не пересекается с диском** — это рукописные заметки в списке. «Недоступно в Lampa» для файлов = **нет в watchlist**, не «нет в TMDB». 17. Группировка 802 файлов: файлы в корне `movies`/`cartoons`/`documentaries` — каждая своя позиция (иначе «Вивариум» 1,46 ГБ склеивается в группу на 135 ГБ). 18. Удаление только через API arr-стека; `deleteFiles=true` — проверять, что путь внутри библиотеки. Дамп API в файл перед операцией. Читать продолжение поверх: [[personal/tech/lampac-deployment]], раздел «Transmission на Кра́кене». 19. 🔴 **Матч с watchlist — `name` И `original` + год ±1.** Строгое равенство только по русскому `name` пропускает файлы, названные по оригиналу: `Bram.Stoker's Dracula.1992` → «Дракула» (6114), `The.Crow.1994` → «Ворон» (9495), `despicable.me.4.2024` → «Гадкий я 4» (519182). 4 промаха = 27,3 ГБ, ошибочно помеченных «не в watchlist». Токенный матч тоже гадит: «пингвины. шпион в толпе» → «Шпион» (2015). 20. 🔴 **`UseDisk: false` у TorrServer — Lampa играет С ТОРРЕНТОВ, не с диска.** Проверять `curl -X POST :9118/ts/settings -d '{"action":"get"}'` перед любым предупреждением «снесёшь то, что играет». Файлы `media/` в плейбэке Lampa не участвуют. 21. 🔴 **Transmission RPC на Кра́кене: авторизации нет, но нужен session-id.** Первый POST → 409 + `X-Transmission-Session-Id`; забрать и повторить. `error: 3` = `"No data found!"` — файлы удалены, раздачи висят (21 шт. / 561,6 ГБ). ⚠️ `downloadDir` = путь **внутри контейнера** (`/media/...`), не host-путь. 22. 🔴 **Перед сносом «копия есть на другом хосте» — СЧИТАТЬ, а не `ls`.** На TrueNAS `documentaries` = 1 файл, `documentaries-series` = пусто, `cartoons-series` = 1 сборник. 307 ГБ доксериалов/документалок Кра́кена уникальны. 23. ⚠️ **Jellyfin на Кра́кене (`:8096`) может смотреть в `media/`** — проверить библиотеки до удаления, rescan после. Это единственная реальная связь `media/` с просмотром. 24. 🔴 **Radarr/Sonarr API: обязателен префикс `UrlBase` + `-L`.** `curl :7878/api/v3/...` → **HTTP 307 с ПУСТЫМ телом** (0 байт в дампе) — выглядит как «API лежит / ключ неверный». Правильно: `curl -sL -H "X-Api-Key: $KEY" "http://127.0.0.1:7878/radarr/api/v3/movie"` (и `/sonarr` для аналогичного). `UrlBase` в `config/config.xml`. Диагностика: `curl -o /dev/null -w "%{http_code}"` → `307`. Скрипт: `/tmp/step1c.sh`. 25. 🔴 **У Sonarr 9 из 13 сериалов — фантомы** (записи без файлов): `Magical Police Department`, `The Meeting Place Cannot be Changed`, `MOZU`, `Delicious in Dungeon`, `Double or Quits`, `Severance`, `Futurama`, `True Detective`, `Brassic`. Файлы есть только у `Our Flag Means Death`, `Stranger Things`, `The Cyberfarm`, `Rick and Morty`. Рассинхрон раскладки, не ошибка чтения. 26. 🔴 **После `docker stop transmission` RPC недоступен** — править состояние через bind-mount `/srv/.../docker/transmission/` (`torrents/`, `resume/`, `settings.json`). 27. 🔴 **Правила чистки раздач (утверждено Alex'ом):** `error==3` (data missing) → снести; `downloadDir` под удаляемые папки → снести **ЦЕЛИКОМ**; `status==0` и `percentDone<1` (недокачанные) → снести. Итог 2026-09-22: **240 снести / 1769 ГБ, 9 оставить**. 28. 🔴 **Манифест удаления строится целыми папками** — `movies`, `movies-radarr`, `series`, `series-sonarr` по одной строке каждая + папки мультфильмов. Перед этим сверить состав папки с утверждённым списком (51 + 11 позиций — совпало). ⚠️ **Инвентарь видит только видеофайлы** — `.nfo`/`.srt`/постеры от ранее удалённых фильмов (`Master.i.Margarita.2023`, `Pchelovod.2024`, `Леон`, `Ворон_2024`) в манифест попадают «бонусом». Это правильно, но выглядит шире списка. ⚠️ **Расхождение итога с утверждённой суммой = несовпадение имён папок.** 693 ГБ вместо 828 ГБ — 7 папок мультфильмов не сматчились буквально. Всегда `[ -e "$path" ]` каждую строку + печатать `du -sb` построчно. ## Удаление медиа — ВЫПОЛНЕНО 2026-09-22 (питфоллы исполнения) Итог: удалено **693 ГБ**, диск **477 ГБ → 1,2 ТБ**, Transmission **249 → 9 раздач**. Полный журнал: [[personal/plans/kraken-media-inventory-cleanup]], раздел «ВЫПОЛНЕНО». 29. 🔴 **`torrent-remove` по id НЕ работает — Transmission пересоздаёт раздачи.** Снял 240 id → осталось **17, а не 9**: восемь вернулись с **новыми id** (223, 233, 234, 236, 238, 241, 244, 247). Долечены вторым проходом **по `downloadDir`**, третий проход — `Babylon` (`/downloads/radarr`, префикс не в фильтре). **Правило: чистить по `downloadDir`, не по id, и пересчитывать после каждого прохода.** Все префиксы учесть: `/downloads/complete` И `/downloads/radarr` И `/downloads/complete/radarr`. `"delete-local-data": false` — снимает запись, файлы не трогает (их удаляет манифест). 30. 🔴 **`rm -rf` каталога верхнего уровня → `Permission denied` на САМОМ каталоге.** Содержимое удаляется (оно `kraken:kraken`), а каталог `root:root`. Второй проход `sudo rmdir` дочищает (каталоги уже пусты). Скрипт должен уметь оба уровня: содержимое — `rm -rf`, сам каталог — `sudo rmdir`. 31. 🔴🔴 **После удаления root-папок arr отдаёт 409 на любой DELETE файловой записи.** ``` DELETE /radarr/api/v3/moviefile/ → 409 DELETE /sonarr/api/v3/episodefile/ → 409 {"message":"Movie's root folder (/media/movies-radarr) doesn't exist."} Warn|MediaFileDeletionService|Movie's root folder (...) doesn't exist. ``` **Причина: `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/` с просмотром. ## Установка Lampa на ТВ (сжато) ```bash # скачать ipk на ТВ ssh root@192.168.1.70 'curl -sS -o /tmp/lampa.ipk "http://192.168.1.14:9118/lg.ipk"' # установить (только через com.webos.appInstallService + обёртку script) ssh root@192.168.1.70 'rm -f /tmp/i.txt; script -q -c \ "luna-send -n 1 -f luna://com.webos.appInstallService/dev/install \ {\"id\":\"org.lampa.tv\",\"ipkUrl\":\"/tmp/lampa.ipk\",\"subscribe\":true}" /tmp/i.txt; cat /tmp/i.txt' # запустить ssh root@192.168.1.70 'rm -f /tmp/l.txt; script -q -c \ "luna-send -n 1 -f luna://com.webos.applicationManager/launch {\"id\":\"com.lampac.tv\"}" /tmp/l.txt' ``` ТВ: `root@192.168.1.70`, ключ `~/.ssh/konka_webos`, webOS 5.4.2, порты `22`/`3000`/`3001`. ## Проверка ```bash ssh kraken 'docker ps --filter name=lampac --format "{{.Names}} {{.Status}} {{.Ports}}"' ssh kraken 'curl -sS "http://localhost:9118/version?type=hash"' ssh kraken 'curl -sS "http://192.168.1.14:9118/version?type=hash"' ``` ## Откат ```bash ssh kraken 'cd /srv/.../lampac && docker compose down' ssh kraken 'sudo rm -rf /srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/lampac' ``` ## Не закрыто - Лимит кэша TorrServer — дефолт (`UseDisk: false`, 96 МБ RAM). ⚠️ Это и есть причина, что Lampa играет с торрентов, а не с диска — менять только осознанно. - ✅ **Удаление медиа на Кра́кене ВЫПОЛНЕНО** (2026-09-22): 693 ГБ, диск 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. - ⚠️ Уборка: каталог `/Users/admin/personal/` (артефакт записи по относительному пути) — удалить. - Шаг 7 — watchlist в UI Lampa: [[personal/plans/lampac-watchlist-plugin]]. - Секции Watchlist внутри CUB-фида — инжект залит, приёмка в UI не подтверждена. ## Реальный скилл (файл) `~/.hermes/hermes-whale/skills/devops/lampac-kraken-deploy/SKILL.md` ✅ **Синхронизирован 2026-09-22 (вечер).** Пункты 9–11 (установка Lampa на ТВ по SSH, питфолл `luna-send`+`script`, appId `com.lampac.tv`) и новые 12–18 (инвентаризация диска, дубли `downloads/complete`, строгий матч с watchlist, `tmdb_id` в `href`) перенесены в файл скилла, включая раздел «Pillar: disk inventory & deletion candidates». ✅ **Синхронизирован 2026-09-22 (ночь).** Добавлен раздел «Pillar: media inventory, Transmission cleanup & deletion» (пункты 19–23): матч по `name`+`original`+год, TorrServer `UseDisk: false` (Lampa играет с торрентов), Transmission RPC session-id + `error: 3`, cross-host проверка копий счётом, Jellyfin как единственная связь `media/`.