--- 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 стал ПУСТ. **Общее правило: дамп API ДО удаления; если сносишь корневую папку библиотеки — планируй чистку записей в том же проходе, потом уже не получится.** 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 на ТВ (сжато) ```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): **765 ГБ**, диск 477 ГБ → 1,2 ТБ, Transmission 249 → 9 раздач. Детали: [[personal/plans/kraken-media-inventory-cleanup]]. - ✅ **Фантомы 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 не подтверждена. ## Реальный скилл (файл) `~/.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/`.