15 KiB
15 KiB
AGENT.md — инструкции для AI-агента
О проекте
Это deployment-репозиторий для локального развёртывания Lampac NextGen (активный форк заброшенного Lampac) в Docker на этой машине. Исходники форка сюда не клонируются — используется официальный образ ghcr.io/lampac-nextgen/lampac.
- Форк: https://github.com/lampac-nextgen/lampac (347+ звёзд, ежедневные коммиты, релизы)
- Документация: https://docs.lampac.dev
- Образ:
ghcr.io/lampac-nextgen/lampac:latest(multi-arch: amd64/arm64) - Порт: 9118, рабочая директория в контейнере:
/lampac - Последняя задеплоенная версия:
1.61.2(при установке 01.10.2026) - Git:
ssh://git@gitea.prodik.ru:222/prodik/lampac.git, ветка main (эта); веткаsynology— тот же код с абсолютными путями томов Synology NAS; remote настроен какorigin - Коммиты:
git add -A && git commit && git push origin main— секреты/данные отсекает.gitignore; в git идут только compose,init.conf,mods/(включённые модули),modules/(резерв, не монтируется), доки,.gitignore
Продакшн: Proxmox LXC
Постоянное развёртывание — LXC 121 (lampac) на Proxmox root@192.168.88.254, контейнер root@192.168.88.23 (DHCP на vmbr0), SSH по ключу ~/.ssh/id_rsa_prodik. Проект лежит в /opt/lampac (rsync с рабочей машины, без .git).
- Unprivileged LXC +
features: nesting=1,keyctl=1(без этого Docker не стартует),onboot: 1, 2 core / 4 GB / 32 GB. - SMB
\\10.6.0.1\Torrentsдля DLNA: монтируется на хосте Proxmox в/mnt/torrents(fstab + креды/root/.smb_cred, chmod 600) и пробрасывается в контейнерmp0. Unprivileged LXC монтировать cifs не может (нетCAP_SYS_ADMINв init userns —mount error: Operation not permitted, и это не AppArmor). В fstab обязателенuid=101000,gid=101000: маппинг LXC0→100000, иначе в контейнере файлы видны как root и приложение (uid 1000) не пишет превью (Access to the path '/lampac/data/dlna/thumbs/' is denied). - Том заменён через
docker-compose.override.yml(в контейнере, не в git):services.lampac.volumes: - /mnt/torrents:/lampac/data/dlna. Базовый compose хранит./dlna— rsync-обновления его не трогают. - Обновление на сервере: rsync проекта →
cd /opt/lampac && docker compose up -d. - Проверки:
docker ps→healthy; эндпоинты/version?type=hash,/online.js,/ts/,/dlna,/extensions→ 200; в логах нетdenied|SqliteException.
Файлы
| Файл | Назначение | Правила |
|---|---|---|
docker-compose.yaml |
Единственный compose-файл | тома обязательны; фиксированной сети/subnet нет (дефолтная сеть compose). Том ./mods:/lampac/mods ОБЯЗАТЕЛЕН — без него 10 модулей не загружаются (см. п.4) |
config/init.conf |
Конфиг сервера (JSON) | hot-reload для большинства ключей (кроме BaseModule.SkipModules — нужен рестарт); строго валидный JSON |
config/passwd |
Пароль root, секрет | не выводить в чат/логи/коммиты, в .gitignore |
modules/* |
Старые override-копии (manifest.json ×4, extensions.json) |
не монтируются (убраны 01.10.2026): docs https://docs.lampac.dev/installation описывают только 6 томов (passwd, init.conf, lampainit.js, cache, database, mods/); одиночные json-тома — нештатный способ |
mods/ |
Копии 10 модулей с enable: true (AdminPanel, DatabaseEditor, ExternalBind, LogUserRequest-Lite, Music, Telemetry, Tg-notify.bot, Tracks, Transcoding, WatchTogether) |
монтируется одним томом ./mods:/lampac/mods — единственный способ включить модули с enable: false в образе; при обновлении образа копии пересоздавать вручную (см. п.4) |
cache/ |
Кеш | монтируется в /lampac/cache |
database/ |
SQLite-БД (Sync, TimeCode, SISI) | монтируется в /lampac/database, не удалять |
dlna/ |
Медиа/превью DLNA | монтируется в /lampac/data/dlna, не удалять |
.gitignore |
Игнорируемые пути | в игноре: config/passwd (секрет), cache/, database/, dlna/, .DS_Store; остальное (init.conf, modules/, compose, доки) — переносимое |
README.md / AGENT.md |
Документация | обновлять при любых изменениях развёртывания |
Основные команды
docker compose up -d # запуск
docker compose pull && docker compose up -d # обновление
docker compose restart lampac # рестарт (нужен только для passwd)
docker compose logs -f --tail 100 lampac # логи
docker compose ps # статус
curl -fsS "http://localhost:9118/version?type=hash" # health-check (ожидается 200 + hash)
curl -fsS -o /dev/null -w '%{http_code}\n' http://localhost:9118/online.js # ожидается 200
Проверка работоспособности после любых изменений: health-check выше + контейнер в статусе healthy.
Правила работы
- Отвечать по-русски.
- После любых изменений в проекте — дополнять
README.mdиAGENT.md. - Конфиг менять только в
config/init.conf; валидность проверять:python3 -m json.tool config/init.conf. - Включение/выключение модулей — через
BaseModule.SkipModulesвinit.conf(добавить имя = выключить; имя = имя папки в/lampac/module/, группы вродеOnlineAnimeвыключаются целиком).SkipModulesне hot-reload — после правки нуженdocker compose restart lampac. Модули сmanifest.json: enable: falseв образе (Tracks,Music,Tg-notify.bot,AdminPanel,ExternalBindи др.) включаются только штатно: копия всего каталога модуля сenable: true, смонтированная в/lampac/module/<Name>/, либо каталог вmods/<Name>/. Одиночные томаmanifest.json/extensions.jsonне использовать — docs не описывают таких томов (https://docs.lampac.dev/installation, https://docs.lampac.dev/modules/overview). Список модулей: https://docs.lampac.dev/modules/overview- Текущее состояние (проверка:
docker logs lampac | grep -c "loaded module"→ 117):SkipModulesпуст — включены ВСЕ модули, включая группыOnlineAnime/OnlineUKR/OnlinePaid/OnlineGEOиTranscoding. 10 модулей сenable: falseв образе подняты через копии вmods/(таблица «Файлы»). Если после обновления образа какой-то модуль изmods/перестал компилироваться — пересоздать копию:docker cp lampac:/lampac/module/<Name> ./mods/<Name>и выставитьenable: trueв её manifest.json, затемdocker compose up -d. - Плагины Lampa:
/online.js,/sisi.js,/dlna.js,/ts.jsи т.д. Большинство Lampac сам подключает клиенту через/lampainit.js(см. ниже проinitPlugins); при необходимости плагин можно добавить вручную по URL. - Два уровня включения модуля: (1)
SkipModules/manifest — модуль скомпилирован и работает на сервере; (2)LampaWeb.initPlugins.<name>вinit.conf— плагин попадает в список{initiale}, который/lampainit.jsдобавляет клиенту Lampa (Lampa.Plugins.add). Без второго флага сервер отвечает, но пункт в Lampa не появится (так было сdlna— флагinitPlugins.dlnaдобавлен в init.conf). Сейчас подключены:dlna: true(вinit.conf), изbase.conf:online,sisi,torrserver,jacred,cubProxy,tmdbProxy,timecode,pirate_store. Особый случайjacred: модуль/jacred.jsне регистрирует — флаг подставляет{jachost}= хост Lampac в шаблон, клиент пишет его вjackett_url(проверка:curl /api/v1.0/conf→ 200). - Override
plugins/override/lampainit.js(том./plugins/lampainit.js) модули НЕ подключает:{initiale}сервер собирает изLampaWeb.initPluginsи подставляет в шаблон после чтения (ApiController.cs:695), т.е. и при override тоже. Override — только для правки шаблона настроек клиента (window.lampa_settings); в проекте не используется. - Магазин плагинов в Lampa (Настройки → Плагины) читает
/extensions→ образныйLampaWeb/plugins/extensions.json(override-монтирование отключено). Дефект образа: 15 записей каталога ссылаются на127.0.0.1:9118/plugins/*.js(pubtorr, checker, hotkeys, torrents...) — HTTP-роута/plugins/в коде нет, все эти ссылки битые, устанавливать из магазина такие записи нельзя. Рабочий путь — прямой внешний URL (ручной установкой в Лампе или черезLampaWeb.customPlugins; так подключён PubTorr:https://lampame.github.io/main/pubtorr.js). Если плагин уже установился с битым URL — удалить его в Лампе (Настройки → Плагины), иначе дедуп не даст добавить правильный (семействоpubtorr.js). Ответ кешируетсяStaticacheна диске:cache/static/<bucket>/— после правки удалить соответствующий файл (grep -rl secuses cache/static/) или весь каталог static, затем перезапросить. - Плагины модулей для ручной установки в Лампе (Настройки → Плагины → по URL):
/tracks.js,/music.js,/tg-notify.js,/watchtogether.js(проверяютсяcurl -o /dev/null -w '%{http_code}' http://localhost:9118/<name>.js→ 200).
- Текущее состояние (проверка:
- Новые пользовательские модули и копии включаемых — класть в
mods/<Name>/(один том./mods:/lampac/mods), переопределения шаблона настроек клиента —plugins/lampainit.js→/lampac/plugins/override/lampainit.js(модули через это НЕ подключаются — см. п.4). - Не раскрывать пароль из
passwd, не коммитить его, не выводить в логи. - Не открывать порт 9118 в интернет без файрвола/reverse proxy; модули
DLNA,Tracks,Transcoding,GStreamer,Catalogне предназначены для публичного доступа. - Образ пиннить по тегу при необходимости воспроизводимости (в compose сейчас
:latest).
Структура контейнера (важные пути)
/lampac/
├── init.conf # конфиг (смонтирован с хоста)
├── passwd # пароль root (смонтирован с хоста)
├── cache/ # кеш (смонтирован)
├── database/ # SQLite и бэкапы конфига (смонтирован)
├── mods/ # пользовательские модули (Roslyn компилирует .cs на лету)
├── module/ # встроенные модули образа
├── plugins/override/ # переопределения JS-плагинов
└── wwwroot/ # статика Lampa UI
Горячая перезагрузка: init.conf watcher каждую секунду; mods/*.cs перекомпилируются при изменении.
Troubleshooting
- Контейнер нестабилен / Chromium падает — проверить
shm_size: 1024mbв compose (обязательно для Playwright). - Не стартует после правки init.conf — проверить JSON:
python3 -m json.tool config/init.conf; бэкапы в/lampac/database/backup/init/. - Модуль не загрузился — смотреть
docker compose logs lampac | grep -E "skip compilation|loaded module"; для модулей сenable: falseв образе — копия вmods/сenable: true(см. п.4), монтирование одиночных manifest не используется. - Tg-notify молчит — нужен
bot_tokenв секцииTelegramBotinit.conf (без него long polling не стартует, в логе предупреждение). - Занят порт 9118 —
lsof -i :9118или сменить порт вinit.conf(listen.port) и вportscompose-файла одновременно. - Сеть — в compose нет фиксированной сети/subnet; используется дефолтная сеть проекта (
lampac_default). - Обновление сломало конфиг — свериться с https://github.com/lampac-nextgen/lampac/blob/main/config/example.init.conf (новые ключи добавляются в стартовый конфиг).