--- title: Lampac — развёртывание и эксплуатация (Кра́кен) created: '2026-09-22' updated: '2026-09-22' type: tech namespace: personal tags: - lampac - torrserver - docker - kraken - streaming - webos related: - '[[personal/plans/lampac-kraken]]' - '[[personal/plans/lampac-watchlist-plugin]]' - '[[personal/tech/multistream-single-flow-limit]]' - '[[family/how-to/kraken-network]]' - '[[family/how-to/tv-luna-send]]' --- # Lampac — развёртывание и эксплуатация (Кра́кен) > Технический справочник. Развёрнуто 2026-09-22. План и статус шагов — [[personal/plans/lampac-kraken]]. ## Что это `lampac-nextgen/lampac` (MIT, .NET 10) — серверный бэкенд для Lampa. Один контейнер, порт **9118**. **Внутри (всё в одном образе):** - **TorrServer** — subprocess, кэш раздач - **JacRed** — Jackett-совместимый индексатор - **LampaWeb** — веб-морда - **TmdbProxy**, **DLNA**, **Sync** 🔴 **TorrServer встроенный. Отдельный контейнер не нужен.** Проверено 2026-09-22: в логах первого старта видно `compilation TorrServer`. Внешний TS — лишняя сущность. ## Расположение на Кра́кене ``` /srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/lampac/ ├── docker-compose.yml (бэкапы .bak-*, .bak2-*) ├── config/ → /lampac/config ├── cache/ → /lampac/cache (кэш TorrServer — только сюда) ├── data/ → /lampac/data (БД JacRed) ├── config-module/init.conf → /lampac/init.conf:ro (наш конфиг) ├── catalog/sites/ → /lampac/module/Catalog/sites ├── catalog/override/ → /lampac/module/Catalog/override ├── wwwroot/ → /lampac/wwwroot (JSON-каталог watchlist) └── scripts/gen_watchlist.py (генератор .md → JSON) ``` Владелец `kraken:kraken`, права `755`. ⚠️ Всё пишущее — на data-диск (1.8T). **НЕ на SD** (`/`, 14G, 8.6G свободно). ## docker-compose.yml (актуальный, 2026-09-22) ```yaml services: lampac: image: ghcr.io/lampac-nextgen/lampac:latest container_name: lampac platform: linux/arm64 restart: unless-stopped ports: - "9118:9118" environment: - TZ=Asia/Bishkek - LANG=ru_RU.UTF-8 volumes: - ./config:/lampac/config - ./cache:/lampac/cache - ./data:/lampac/data # Наш конфиг: перекрывает base.conf из образа. Включает модуль Catalog. # Без монтирования правки теряются при пересоздании контейнера. - ./config-module/init.conf:/lampac/init.conf:ro # Каталоги Catalog - ./catalog/sites:/lampac/module/Catalog/sites - ./catalog/override:/lampac/module/Catalog/override # Статика: JSON-каталог watchlist (Lampac отдаёт wwwroot по HTTP сам) - ./wwwroot:/lampac/wwwroot ``` ⚠️ В контейнере рабочий каталог `/lampac`, часть файлов читается **из корня**, не из `config/`. ### Минимальный `config-module/init.conf` Перекрывает `base.conf`, поэтому список `SkipModules` нужно **повторить целиком**, без `Catalog`: ```json { "BaseModule": { "SkipModules": [ "Tracks", "Transcoding", "WebLog", "CacheMedia", "ForkPlayerXML", "MsxNative", "Potok", "TelegramAuth", "TelegramAuthBot" ] }, "LampaWeb": { "initPlugins": { "catalog": true } } } ``` После любой правки — `docker compose up -d` (пересоздаст контейнер) или `docker restart lampac`. ## Управление ```bash ssh kraken cd /srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f/lampac docker compose up -d docker compose logs -f docker compose restart docker compose down ``` Правка `docker-compose.yml` — без `sudo` (каталог `kraken:kraken`). Создание новых каталогов в корне диска — **через `sudo`** (корень `root:root`). У `kraken` sudo без пароля. ## Проверка работоспособности ```bash curl -sS --max-time 20 "http://localhost:9118/version?type=hash" # → 46b29e1fe8fa6021cd83e75c41abffb7 (для текущего :latest) ``` По сети: `http://192.168.1.14:9118/version?type=hash` — то же значение. ## ⚠️ Питфоллы ### 1. Первый старт долгий (~4 минуты) Контейнер компилирует и грузит ~40 native-модулей: `compilation LampaWeb`, `DLNA`, `GStreamer`, `Sync`, `TorrServer`, ... затем `loaded module: <имя>`. Пока идёт загрузка, HTTP **рвёт соединение**: ``` curl: (56) Recv failure: Connection reset by peer ``` 🔴 **`health: healthy` не означает готовность HTTP.** Статус встаёт раньше. Признак готовности — лог **`Configure complete`** (идёт после последнего `loaded module:`). **Не перезапускать контейнер, не считать это поломкой.** Просто ждать. ### 2. `docker manifest inspect` с Mac отдаёт `denied` GHCR требует авторизацию при обращении с Mac. Проверять наличие `linux/arm64` **из Кра́кена**: ```bash ssh kraken 'docker manifest inspect ghcr.io/lampac-nextgen/lampac:latest' | jq -r '.manifests[].platform | .os + "/" + .architecture' # linux/amd64 # linux/arm64 ← есть, сборка из исходников не нужна # unknown/unknown # unknown/unknown ``` ### 3. Шаблон логов первого старта ``` compilation Alloha compilation LampaWeb ... loaded module: Vibix loaded module: TorrServer ... Configure complete ← HTTP начинает отвечать ``` ## Сеть | Хост | IP | |---|---| | Кра́кен (eth0) | `192.168.1.14` (второй адрес `192.168.1.15`) | | ТВ LG | `192.168.1.70` | | Mac Alex | `192.168.1.57` | Один сегмент `192.168.1.x` — туннели и проброс портов не нужны. Подробнее: [[family/how-to/kraken-network]]. ## Модуль Catalog — каталоги из YAML Модуль **`Catalog`** (в образе, по умолчанию **выключен**) отдаёт свои каталоги как плагин Lampa. Разобрано по коду и **включено в работу 2026-09-22** — см. [[personal/plans/lampac-watchlist-plugin]]. ### Наш каталог «Мой список» Отдаёт `movies-watchlist.md` как каталог в Lampa. Файлы: | Путь на HDD (`.../lampac/`) | Роль | |---|---| | `config-module/init.conf` | включает Catalog (монтируется в `/lampac/init.conf:ro`) | | `catalog/sites/watchlist.yaml` | описание каталога для Catalog | | `catalog/override/` | переопределения (пусто) | | `wwwroot/watchlist.json` + `watchlist-.json` | JSON-данные (Lampac отдаёт по HTTP) | | `scripts/gen_watchlist.py` | генератор: .md → JSON | | `~/scripts/watchlist-catalog.sh` | обёртка + перезапуск (сброс кэша), cron 02:30 | Плагин на ТВ: `http://192.168.1.14:9118/catalog.js` → источник «Мой список». ### Общее про модуль | Что | Как | |---|---| | Данные | `sites/.yaml` — `host`, `menu`, `search`, `list`, `content` | | Переопределения | `override/.yaml`, `override/_.yaml` | | Роуты | `/catalog.js`, `/catalog`, `/catalog/list`, `/catalog/card` | | WAF | `^/catalog/` → 10 req/sec | | Примеры | 10 файлов: `vokino`, `rezka`, `kinopub`, `aniliberty`, `eneyida`, `filmix`, `filmixapp`, `getstv`, `kinobase`, `kinoukr` | **Обязателен HTTP:** `if (!url.StartsWith("http")) url = $"{init.host}/{url}"` — локальные файлы не читаются. **Два режима:** `jsonPath: true` → `JToken.Parse` (JSON), иначе HtmlAgilityPack (HTML). 🔴 **Питфолл: элемент с пустым `href` ВЫБРАСЫВАЕТСЯ** — `if (!IsNullOrWhiteSpace(name) && !IsNullOrWhiteSpace(href))` (ListController.cs). Нужен непустой `href` у каждого элемента. 🔴 **Питфолл: `{cat}` НЕ подставляется в `nodes`** — JSONPath статичен. Разные категории = разные JSON-файлы. 🔴 **Питфолл: кэш без версии данных** — ключ `catalog:{plugin}:{search}:{sort}:{cat}:{page}`. После правки данных нужен `docker restart lampac`. **Выключен в двух местах** `base.conf`/`current.conf`: ```jsonc "BaseModule": { "SkipModules": [ "Catalog", ... ] } "LampaWeb": { "initPlugins": { "catalog": false } } ``` Синапс модулей (всего 33): `AdminPanel, Adult, Catalog, Community, DLNA, DatabaseEditor, ExternalBind, ForkPlayerXML, GStreamer, JacRed, Kit, LampaWeb, LampacApk, LogUserRequest-Lite, MsxNative, Music, NextHUB, Online, OnlineAnime, OnlineENG, OnlineGEO, OnlinePaid, OnlineRUS, OnlineUKR, PidTor, Potok, Proxy, SISI, Sync, Telemetry, Tracks, Transcoding, WebLog`. Полный пример YAML (`vokino.yaml`): `docker exec lampac cat /lampac/module/Catalog/sites/vokino.yaml`. ## Занятые порты на Кра́кене (2026-09-22) `7878` Radarr · `8096` Jellyfin · `8191` FlareSolverr · `8989` Sonarr · `9000` Portainer · `9091` Transmission · `9696` Prowlarr · `51413` Transmission (UDP) · **`9118` Lampac** Выбор порта — `docker compose config` + `sudo ss -tlnp` перед деплоем. ## Интеграция с Lampa (ТВ) — ✅ СДЕЛАНО 2026-09-22 - Плагин: `http://192.168.1.14:9118/online.js` - TorrServer в Lampa: Настройки → TorrServer → «Использовать основную ссылку» → `http://192.168.1.14:9118` - Буфер плеера: 50–100 МБ - `/lg.ipk` отдаёт сам Lampac (проверено: HTTP **200**) ### Установка клиента на LG webOS — по SSH, без флешки 🔴 **`Media Station X` и `.ipk` с флешки — НЕ нужны.** ТВ имеет SSH-доступ (root), установка делается с Mac. **ТВ:** `root@192.168.1.70`, ключ `~/.ssh/konka_webos`, webOS **5.4.2** (ядро 4.4.84, image `starfish-dvb-secured`, build 2602, `webos_build_datetime 20230405092501`). Порты открыты: `22` (SSH), `3000`/`3001` (Luna). Из кастомного уже стоит: `org.webosbrew.hbchannel` 0.7.2, `org.webosbrew.inputhook`, `me.wouterdek.magic4pc`. **Порядок установки:** ```bash # 1. Скачать .ipk от Lampac прямо на ТВ ssh root@192.168.1.70 'curl -sS --max-time 60 -o /tmp/lampa.ipk "http://192.168.1.14:9118/lg.ipk"' # → 6 896 874 байт, формат ar (!), НЕ tar/gzip # 2. Установить (обязательна обёртка script — см. питфолл ниже) ssh root@192.168.1.70 'rm -f /tmp/inst.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/inst.txt >/dev/null 2>&1; cat /tmp/inst.txt' # → {"subscribed":true,"returnValue":true} # 3. Проверить, что установилось ssh root@192.168.1.70 'ls /media/developer/apps/usr/palm/applications/' # → com.lampac.tv ← имя приложения Lampa, НЕ org.lampa.tv # 4. Запустить 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' # 5. Убедиться, что открылось ssh root@192.168.1.70 'rm -f /tmp/f.txt; script -q -c \ "luna-send -n 1 -f luna://com.webos.applicationManager/getForegroundAppInfo {}" /tmp/f.txt; grep appId /tmp/f.txt' # → "appId": "com.lampac.tv" ``` **Фактический ID приложения — `com.lampac.tv`** (vendor Lampac, version 1.0.0, type web). ⚠️ В `luna-send ... dev/install` поле `"id"` — **произвольная метка**; реальный appId берётся из `appinfo.json` внутри ipk. Ошибиться здесь не страшно, но искать приложение надо по фактическому ID. ### 🔴 Питфолл: `luna-send` по SSH молчит **Симптом:** любой вызов `luna-send` через `ssh root@TV "luna-send ..."` печатает **хелп-экран**, а не результат. С `-t` (PTY) — тоже. С `-a '{"json"}'` — тоже. **Причина:** `luna-send` детектирует TTY и отказывается писать в pipe. **Решение:** обернуть в `script(1)`, который аллоцирует псевдо-TTY, и прочитать временный файл: ```bash ssh root@TV 'script -q -c "luna-send -n 1 -f luna://service/method {json}" /tmp/o.txt; cat /tmp/o.txt' ``` Готовый враппер: `~/Automation/tv-luna-send.sh` (`TV_HOST` переопределяет таргет). Доки: [[family/how-to/tv-luna-send]], [[family/how-to/htpc-webos-luna]]. ⚠️ **Установка идёт через `com.webos.appInstallService/dev/install`**, а НЕ через `org.webosbrew.hbchannel.service/install` (последний в образе есть, но `luna-send` его не дёрнул чисто). ⚠️ `luna-send -i` (subscribe, бесконечный) через враппер **не работает** — нужен polling. ### Первый просмотр — проверено 2026-09-22 Фильм запущен, **не дёргается**. Alex: «Вроде стабильно, не делается». | Факт | Значение | |---|---| | Соединения ТВ → Lampac | 3 × ESTABLISHED `192.168.1.70 → 192.168.1.14:9118` | | Нагрузка контейнера | `lampac` CPU 57%, NET 168 МБ ↓ / 132 МБ ↑ | | Битрейт на eth0 | **~3–4 Мбит/с** | ⚠️ **Почему всего 3–4 Мбит, а не 15:** выбран источник **«Смотреть онлайн (lampac 1.18…)»** — встроенный плагин `online.js`, HLS-поток. Lampac отдаёт **ссылку**, ТВ тянет видео напрямую из CDN (в `/proc/net/tcp` ТВ видны внешние адреса на `:443`/`:8443`). Тяжёлый remux с торрента не участвует — поэтому и не дёргается. 🔴 **Следствие:** этот просмотр **не проверяет**, держит ли сеть remux 60–80 Мбит. Тест функциональности, не полосы. Полосу проверять на торрент-источнике. **Как убрать выбор источника:** Lampa → Настройки → Плагины → выключить `online.js`. Останутся только торренты. ## 🔴 Выбор источника каталога в Lampa (проверено 2026-09-22) **В Lampa НЕТ пункта «Настройки → Источник».** Я его выдумал — Alex дважды указал на ошибку. Не повторять. Источник (Rezka / Kinobase / «Мой список» / …) переключается **из меню каталогов на главной**: 1. Открыть Lampa на главной 2. Встать на любой ряд каталога → нажать **влево** на пульте 3. Слева выедет **панель со списком источников** 4. Выбрать нужный → OK; каталог перестроится, в заголовке появится имя источника в верхнем регистре («Фильмы — МОЙ СПИСОК») **Плагин `catalog.js` не добавляет пункт меню — он подменяет существующие.** Механика: при старте приложения `Lampa.Utils.account(api_host + '/catalog', …)` получает список каталогов, регистрирует каждый как `Lampa.Params.values.source[key]` и подменяет `Lampa.Api.sources[key]`. Затем хук `Lampa.Listener.follow('menu', …)` перехватывает клики по `movie`/`tv`/`cartoon`/`anime`/`relise` и подставляет URL из `catalogs[key].menu`. ⚠️ **Следствие — каталоги регистрируются ТОЛЬКО при старте приложения.** Добавил плагин и не перезапустил Lampa → источника не будет, `/catalog` не запрашивается, соединений с `:9118` ноль. Нужен **полный перезапуск** (не сворачивание). ### ⚠️ Клиент на ТВ — это не «отдельная Lampa» `com.lampac.tv` (webOS) грузит UI **с сервера**: `loader.js` читает `lampac_url` из localStorage (дефолт `http://192.168.1.14:9118`) и подключает `app.min.js` + `lampainit.js`. Значит логика каталога на ТВ = **серверная**, и править её надо на Lampac, а не на ТВ. `/lampainit.js` содержит `var plugins_add = [...]` со строкой `{"url":".../catalog.js","name":"Альтернативные источники каталога","status":1}` — это **серверный список плагинов, которые Lampac сам подсовывает** в UI. Каталог watchlist работает через **модуль `Catalog`**, не через эту строку. Не искать причину поломки в `plugins_add`. ### Диагностика «каталога нет в UI» | Проверка | Команда | Норма | |---|---|---| | Плагин отдаётся | `curl -sI http://192.168.1.14:9118/catalog.js` | 200, ~32 КБ | | Каталоги зарегистрированы | `curl -s http://192.168.1.14:9118/catalog \| jq 'keys'` | 7 ключей, «Мой список» есть | | Данные отдаются | `curl -s "…/catalog/list?plugin=watchlist&cat=films" \| jq .total_pages` | 1 | | ТВ реально ходит | `ssh kraken 'sudo ss -tnp \| grep :9118'` | есть ESTABLISHED
**ноль = Lampa не запускалась заново** | Порядок разбора: сначала `ss` (ходит ли ТВ вообще), потом `/catalog` (что отдаёт сервер), потом UI. Если ноль соединений — проблема не в сервере. ⚠️ `docker logs lampac` **HTTP-запросы не пишет** — по логам факт обращения ТВ не проверить. Использовать `ss`, а не логи. ## Внутреннее устройство Lampac (разведка 2026-09-22) **33 модуля** в образе (`/lampac/module/`): `AdminPanel`, `Adult`, **`Catalog`**, `Community`, **`DLNA`**, `DatabaseEditor`, `ExternalBind`, `ForkPlayerXML`, `GStreamer`, `JacRed`, `Kit`, `LampaWeb`, `LampacApk`, `LogUserRequest-Lite`, `MsxNative`, `Music`, `NextHUB`, **`Online`**, `OnlineAnime`, `OnlineENG`, `OnlineGEO`, `OnlinePaid`, `OnlineRUS`, `OnlineUKR`, `PidTor`, `Potok`, `Proxy`, `SISI`, `Sync`, `Telemetry` (+ остальные). **Конфиг — `current.conf`** внутри образа (`/lampac/current.conf`, 157 КБ, генерируется из `base.conf` + `init.conf`). Рабочий каталог `/lampac`, файлы читаются **из корня**, не из `config/`. Выключение модуля — двумя механизмами: 1. **`SkipModules`** в `init.conf` / `current.conf` 2. **`manifest.json`** в каталоге модуля (`"enable": true|false`) ⚠️ **`init.conf` НЕ в образе по умолчанию** — его читают из `/lampac/init.conf`, файл перекрывает `base.conf`. Правка через `docker exec` **теряется при пересоздании контейнера**, поэтому смонтирован с HDD (`./config-module/init.conf:/lampac/init.conf:ro`). См. раздел docker-compose выше. ⚠️ `current.conf` в образе (157 КБ) — **сгенерированный** результат (`guid`, `listen`, полный конфиг). Это **не** входной файл, править его бессмысленно. ### Полезные роуты (проверены curl'ом) | Роут | Код | Что | |---|---|---| | `/` | 200 | LampaWeb (UI, ``) | | `/online.js` | 200 | плагин VOD — 70+ онлайн-источников | | `/lg.ipk` | 200 | установщик клиента для LG (6.9 МБ) | | `/sisi` | 200 | JSON-список платформ 18+ | | `/dlna` | 200 | DLNA-модуль | | `/ts/echo` | 200 | TorrServer (отдаёт версию, напр. `MatriX.135`) | | `/catalog.js` | **200** | плагин каталогов (включён 2026-09-22) — см. раздел Catalog | | `/catalog` | **200** | JSON каналов каталогов | | `/watchlist.json`, `/watchlist-.json` | **200** | наш JSON-каталог watchlist | | `/cub`, `/api`, `/lampac.js` | 404/500 | — | ⚠️ `wwwroot` отдаётся статикой: **любой** файл, положенный туда, доступен по HTTP от корня (`http://:9118/<файл>`). Проверено записью пробного файла. ## Что осталось 1. **Лимит кэша TorrServer** — сейчас дефолт. Задать ~20 ГБ, чтобы не сожрать 396 ГБ свободных. Единственный незакрытый шаг базового плана. Не критично — диск 396 ГБ. 2. **Шаг 7 плана — watchlist в UI Lampa** — ✅ **серверная часть сделана** 2026-09-22, см. [[personal/plans/lampac-watchlist-plugin]]. Осталось Alex добавить плагин на ТВ пультом. 3. **Проверка полосы на торрент-источнике** (remux 60–80 Мбит) — не сделана. Первый просмотр шёл через онлайн-источник (HLS ~3–4 Мбит), полосу не проверял. 4. **Постеры/карточка в каталоге** — не сделаны, `image` пустой.