273 lines
20 KiB
Markdown
273 lines
20 KiB
Markdown
---
|
||
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/`.
|