Files
obsidian-vault/personal/tech/skill-lampac-kraken-deploy.md
T

273 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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/<id> → 409
DELETE /sonarr/api/v3/episodefile/<id> → 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/`.