# AGENT.md — инструкции для ИИ-агентов Работа с проектом: локальный Docker-развёртывание [Lampac NextGen](https://github.com/lampac-nextgen/lampac). Человек читает ответы **только на русском**. ## Источники правды (порядок приоритета) 1. **Официальная документация** — [docs.lampac.dev](https://docs.lampac.dev) (полный текст страниц: `https://docs.lampac.dev/llms-full.txt`, индекс: `llms.txt`). Не гадать по памяти — проверять в доках. 2. **Живой контейнер** — состояние модулей, манифестов и конфигов брать из контейнера: ```bash docker exec lampac sh -c 'cat /lampac/module/<Имя>/manifest.json' docker exec lampac cat /lampac/current.conf # merged-конфиг: base + init ``` 3. **Логи контейнера** — `docker logs lampac`. 4. Локальные файлы проекта: `docker-compose.yaml`, `config/init.conf`, `mods/`. ## Ключевые правила ### 1. Никогда не правь файлы внутри контейнера/образа Файлы в `/lampac/module/` (и любые другие в образе) **сгорают при обновлении** (`docker compose pull && up -d`). Включение встроенного модуля делается только пользовательской копией: ```bash docker cp lampac:/lampac/module/<Имя> "mods/<Имя>" # в mods/<Имя>/manifest.json -> "enable": true # в docker-compose.yaml -> "- ./mods/<Имя>:/lampac/mods/<Имя>" # docker compose up -d ``` См. также официальные шаги: [Включить модуль](https://docs.lampac.dev/modules/overview), [Пользовательские модули](https://docs.lampac.dev/maintenance/custom-modules). ### 2. Механика загрузки модуля (4 независимых фильтра) Модуль грузится, только если выполнены **все**: | Фильтр | Где | |---|---| | `"enable": true` | `manifest.json` модуля (копия в `mods/` для встроенных) | | Имя **не** в `BaseModule.SkipModules` | `base.conf` (в образе) + `config/init.conf` | | Имя попадает в `BaseModule.LoadModules` | если allowlist задан (у нас не задан — грузится всё остальное) | | Runtime-флаг | секция модуля в `config/init.conf`, например `"gst": { "enable": true }` | `SkipModules` имеет приоритет над `LoadModules` — модуль из обоих списков **не** грузится. Паттерны: точное имя, группа (`OnlineUKR`), regex (`LME.*`), `.*`. ### 3. `config/init.conf` — валидный JSON JSON **без** trailing comma. Перед применением правок проверять: ```bash python3 -m json.tool config/init.conf > /dev/null && echo OK ``` После правки конфига: `docker compose restart` (том смонтирован, `up -d` не нужен). После правки `manifest.json` в `mods/` с `dynamic: true` — тоже `restart` (или ждать hot-rebuild). После изменения томов в compose — `docker compose up -d`. ### 4. Клиентские плагины Lampa - Встроенные плагины: флаги `LampaWeb.initPlugins` (`tracks`, `dlna`, `catalog`, `sync`, `backup`, ...). - Дополнительные: `LampaWeb.customPlugins` — записи со `status: 1` добавляются как есть; поддерживается плейсхолдер `{localhost}` (подставляется реальный адрес сервера). - Если плагин «не виден» в веб-клиенте — сначала проверить HTTP-статус его URL на сервере (`curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:9118/<плагин>.js`), а не лезть в клиент. ### 4.1 Каталог плагинов (store) `/extensions` - Раздел «Плагины» веб-клиента грузит каталог с `/extensions` (при `LampaWeb.initPlugins.pirate_store: true`). - Источник: `/lampac/module/LampaWeb/plugins/extensions.json` — переопределён mount из `./plugins/extensions.json`. Править хост-файл, в контейнер не залезать. - `{localhost}` в ссылках store сервер заменяет своим адресом при выдаче. - Статика: `/lampac/plugins/` **не раздаётся** (проверено: файл → 404), корень `wwwroot` — раздаётся. Все плагины каталога — **локальный mirror** в `./plugins/`, смонтирован **одним directory-mount** в `/lampac/wwwroot/plugins/` → ссылки store `{localhost}/plugins/<имя>.js`. Не монтировать каталог целиком в корень `wwwroot` — скроется веб-клиент `lampa-main`. - Обновление плагина: исходный URL — в `plugins/sources.json`; скачать, перезаписать файл, перезапуск не нужен (статика). - При проверке скачанного плагина отличать: (а) реальный код, (б) лоадер `putScriptAsync` (абсолютные URL — безопасен локально; host от currentScript — **требуется патч**, см. showy.js), (в) пустой stub/placeholder (мёртвый плагин, из каталога удалять). - **Кеш-ловушка**: ответ `/extensions` (и других LampaWeb-маршрутов) кешируется на диск в `cache/static//.json`; кеш переживает `docker compose restart`. После правки store: `rm -rf cache/static/59` (bucket `/extensions`), перезапуск не нужен. Заголовок `X-StatiCache-Status: HIT/MISS` показывает состояние. ### 5. AdminPanel API из скриптов (root-авторизация) - Root-пароль = содержимое `config/passwd`. Механизм: cookie `accspasswd=<пароль>` (таков штатный сценарий: страница входа `auth.html` сама кладёт пароль в эту cookie). Заголовок `lcrqpasswd` — для внутренних вызовов, на `/adminpanel/api/*` с ним уходит 302 на `/adminpanel/auth`. - Не передавать root-пароль в query string (предупреждение доков). - Сервер может отвечать 404 вместо 401/403, чтобы не раскрывать админский endpoint. - Основные маршруты: `GET /adminpanel/api/init` (чтение), `POST /adminpanel/api/init` (полная запись), `POST /adminpanel/api/init/section/{key}` (секция), `GET /adminpanel/api/current` (merged-конфиг), `GET /adminpanel/api/users-json`. - Правка секций через API пишется в `init.conf` — watcher подхватит без рестарта (runtime-параметры). `customPlugins` — runtime-параметр: плагин появляется в `/lampainit.js` через ~1 с. ### 6. Диагностика «модуль не найден» Чек-лист (в этом порядке): 1. `curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:9118/<маршрут>` — 404 подтверждает, что модуль не загружен. 2. `docker logs lampac | grep -E "compilation|loaded module" | grep <Имя>` — скомпилирован ли и загружен ли. 3. Манифест: `enable: true`? (в `mods/` для встроенных) 4. Фильтры `SkipModules`/`LoadModules` в `config/init.conf`. 5. Runtime-секция модуля в `config/init.conf`. 6. В логе после старта ожидаются строки `compilation <Имя>`, `configure module: <Имя>` (если есть конфиг-секция), `loaded module: <Имя>`. ### 7. Команды эксплуатации ```bash docker compose up -d # запуск / пересоздание (при изменении compose) docker compose restart # после правки init.conf / mods docker compose logs -f # логи docker compose pull && docker compose up -d # обновление (сначала поменять тег в compose) docker exec lampac sh -c '...' # осмотр состояния в контейнере ``` `container_name: lampac` — контейнер один; одновременный запуск нескольких compose-файлов с одним именем невозможен. `docker-compose.override.yml` (gitignore) живёт только на сервере Proxmox и не коммитится. ### 8. Чего не трогать - `config/passwd`, `cache/`, `database/`, `dlna/` — в .gitignore, не коммитить и не «чинить» содержимое. Исключение: `cache/static/` — одноразовый диск-кеш ответов LampaWeb; очистка (`rm -rf cache/static/`) — штатное действие после правки store/статических маршрутов (см. 4.1). - Тег образа в `docker-compose.yaml` закреплён — при обновлении менять осознанно и проверить доки по новой версии. - `LampaWeb.autoupdate` — веб-клиент Lampa сам обновляется из git (`yumata/lampa`), `wwwroot/lampa-main` в контейнере перезаписывается — туда не править. ### 9. После изменений в проекте Обновлять `README.md` и `AGENT.md` в той же ревизии: структура, включённые модули, секции конфига, новые правила. ### 10. Безопасность (не публиковать) `config/passwd`, cookie `accspasswd`, заголовок `lcrqpasswd`, `bot_token` в `TelegramBot`. Маршруты `/adminpanel`, `/weblog`, `Tracks`, `Catalog`, `DLNA`, proxy-модули — только для доверенной сети без WAF не открывать.