- plugins/: скачаны все 30 плагинов store локально (sources.json - карта исходных URL);
патчи: showy.js (абсолютный хост подгрузки), pubtorr/td/torrentmanager - тела вместо лоадеров,
modss.js - local-patched копия (из каталога исключена, upstream мёртв)
- extensions.json: 32 позиции, все ссылки {localhost}/plugins/<файл>.js, удалены мёртвые
(Skaz TV x3, export.js, hotkeys/gold_theme/select_weapon/want/mult, MODS's, o.js, др.)
- compose: ./plugins:/lampac/wwwroot/plugins (один маунт вместо 30 file-mount)
- вычистка: удалены неиспользуемые mods (DatabaseEditor, ExternalBind, LogUserRequest-Lite,
Telemetry, Transcoding, WatchTogether) и дубль каталога modules/
- config/init.conf: секции Tracks/AdminPanel/Music, customPlugins без gst.js
- mods/Tracks: правки Controller.cs/plugin.js
- README.md / AGENT.md: mirror, кеш static, правила mount
149 lines
14 KiB
Markdown
149 lines
14 KiB
Markdown
# Lampac NextGen — локальный Docker-развёртывание
|
||
|
||
Локальное развёртывание [Lampac NextGen](https://github.com/lampac-nextgen/lampac) — самохостируемого бекенда для Lampa — в Docker. Официальная документация: [docs.lampac.dev](https://docs.lampac.dev).
|
||
|
||
## Быстрый старт
|
||
|
||
```bash
|
||
docker compose up -d # первый запуск
|
||
docker compose logs -f # логи (строки compilation / configure module / loaded module)
|
||
docker compose restart # после правки config/init.conf или манифестов в mods/
|
||
```
|
||
|
||
- Веб-клиент Lampa: **http://localhost:9118**
|
||
- Админ-панель: **http://localhost:9118/adminpanel** (root-пароль из `config/passwd`)
|
||
- TorrServer-прокси: `http://localhost:9118/ts/*` (порт TorrServer — 9085)
|
||
|
||
По умолчанию сервер слушает порт **9118**; если порт занят — меняй `listen.port` в `config/init.conf` до первого запуска.
|
||
|
||
## Структура проекта
|
||
|
||
| Путь | Назначение |
|
||
|---|---|
|
||
| `docker-compose.yaml` | Основной сервис (образ закреплён на `ghcr.io/lampac-nextgen/lampac:1.68.0`) |
|
||
| `config/init.conf` | Конфигурация сервера (JSON, монтируется в `/lampac/init.conf`) |
|
||
| `config/passwd` | Пароль root для `/adminpanel` и `/weblog` (не в git) |
|
||
| `cache/` | Кеш (`/lampac/cache`) |
|
||
| `database/` | SQLite-базы Sync, TimeCode, Music, tg-notify (`/lampac/database`) |
|
||
| `dlna/` | Локальные медиа для DLNA (`/lampac/data/dlna`) |
|
||
| `plugins/extensions.json` | Каталог плагинов для веб-клиента (раздел «Плагины»), отдаётся через `/extensions` |
|
||
| `mods/<Имя>/` | Пользовательские копии встроенных модулей с `enable: true` |
|
||
|
||
> `docker-compose.override.yml` (в .gitignore) — серверное override для Proxmox (том DLNA -> `/mnt/torrents`), живёт только на сервере.
|
||
|
||
## Включённые модули из `mods/`
|
||
|
||
Встроенные модули с `"enable": false` в `manifest.json` внутри образа **нельзя включать правкой файла в контейнере** — файлы пропадут при обновлении. Механика по официальной документации ([модули Lampac](https://docs.lampac.dev/modules/overview), [пользовательские модули](https://docs.lampac.dev/maintenance/custom-modules)):
|
||
|
||
1. Скопировать модуль из образа в `mods/<Имя>/` на хосте:
|
||
```bash
|
||
docker cp lampac:/lampac/module/<Имя> "mods/<Имя>"
|
||
```
|
||
2. В `mods/<Имя>/manifest.json` поставить `"enable": true`.
|
||
3. Добавить том в `docker-compose.yaml`:
|
||
```yaml
|
||
- ./mods/<Имя>:/lampac/mods/<Имя>
|
||
```
|
||
4. При необходимости добавить секцию модуля в `config/init.conf` (runtime-флаг).
|
||
5. `docker compose up -d` (при добавлении тома) или `restart` (при правке манифеста с `dynamic: true`).
|
||
|
||
### Сейчас подключены
|
||
|
||
| Модуль | Что даёт | Секция в init.conf |
|
||
|---|---|---|
|
||
| `Tracks` | `/tracks.js`, `/ffprobe` — субтитры и дорожки | `"Tracks": { "enable": true }` |
|
||
| `AdminPanel` | `/adminpanel` — редактор init.conf, current.conf, users.json | `"AdminPanel": { "enable": true }` |
|
||
| `Music` | `/music.js`, `/music/*` — музыкальный каталог, плейлисты, стримы | секция `"Music"` (базовые дефолты) |
|
||
| `Tg-notify.bot` | `/tg-notify.js`, `/api/tg/*` — уведомления о новых сериях в Telegram | секция `"TelegramBot"` |
|
||
|
||
Клиентские плагины `music.js` и `tg-notify.js` зарегистрированы в `LampaWeb.customPlugins`; `{localhost}` в URL автоматически подставляется сервером.
|
||
|
||
### Ещё можно включить тем же способом
|
||
|
||
В образе выключены также: `DatabaseEditor`, `ExternalBind`, `LogUserRequest-Lite`, `Transcoding`, `WatchTogether`, `TelegramAuth`, `TelegramAuthBot`.
|
||
|
||
## Конфигурация
|
||
|
||
- `config/init.conf` — JSON. После правки: `docker compose restart`. Следи за валидностью JSON (лишняя запятая ломает парсинг).
|
||
- `BaseModule.SkipModules` / `BaseModule.LoadModules` — фильтры загрузки модулей (имя, группа, regex). `SkipModules` имеет приоритет над `LoadModules`.
|
||
- `LampaWeb.initPlugins` — флаги встроенных плагинов веб-клиента; `LampaWeb.customPlugins` — дополнительные плагины (`status: 1`).
|
||
- `LampaWeb.autoupdate: true` — Lampa Web-клиент автообновляется из `yumata/lampa` (раз в 90 минут).
|
||
|
||
## Установка плагинов по ссылке через веб (AdminPanel)
|
||
|
||
Список плагинов, который сервер раздаёт всем клиентам через `/lampainit.js` и `/on.js`, собирается по `LampaWeb.initPlugins` + `LampaWeb.customPlugins`. Watcher перечитывает `init.conf` без перезапуска (интервал ~1 с, runtime-параметры применяются на лету).
|
||
|
||
1. Открой **http://localhost:9118/adminpanel**, введи root-пароль (содержимое `config/passwd`) — пароль сохраняется в cookie `accspasswd` (штатный механизм root-авторизации).
|
||
2. В редакторе `init.conf` открой секцию **`LampaWeb`** → **`customPlugins`** и добавь запись:
|
||
```json
|
||
{ "url": "https://example.com/plugin.js", "status": 1, "name": "ИмяПлагина" }
|
||
```
|
||
Поддерживается плейсхолдер `{localhost}` — сервер подставит свой адрес.
|
||
3. Сохрани — перезапуск не нужен. Проверка: `curl -s http://localhost:9118/lampainit.js | grep <имя>`.
|
||
|
||
Нюансы:
|
||
- `status: 1` — активная запись.
|
||
- Family-dedup: `name.js` и `name/js/{token}` считаются одним плагином; если в registry клиента уже есть один вариант, второй из серверного списка не добавляется.
|
||
- Внешние URL должны быть доступны из браузеров клиентов и отдавать CORS-заголовки.
|
||
- Альтернатива без сервера: вставить ссылку напрямую в веб-клиенте Lampa (настройки → «Плагины») — тогда плагин живёт только в localStorage этого браузера и грузится браузером напрямую.
|
||
|
||
API (для скриптов): `GET/POST /adminpanel/api/init`, `POST /adminpanel/api/init/section/{key}` с cookie `accspasswd=<root-пароль>`.
|
||
|
||
## Каталог плагинов (раздел «Плагины» в веб-клиенте)
|
||
|
||
В веб-клиенте Lampa раздел «Плагины» грузит каталог (store) с маршрута **`/extensions`** (включается при `LampaWeb.initPlugins.pirate_store: true`). Содержимое берётся из файла `LampaWeb/plugins/extensions.json` модуля — у нас он переопределён файловым mount из `./plugins/extensions.json` (см. `docker-compose.yaml`). Плейсхолдер `{localhost}` в ссылках сервер заменяет своим адресом.
|
||
|
||
**Все плагины каталога размещены локально** (mirror): `.js`-файлы лежат в `./plugins/`, каталог целиком смонтирован в `/lampac/wwwroot/plugins/` (одна строка в compose) и ссылки в каталоге ведут на `{localhost}/plugins/<имя>.js`. (Целиком в корень `wwwroot` монтировать нельзя — перекроется веб-клиент `lampa-main`.) Сами файлы плагинов всегда локальные; исключение — плагин-лоадеры, подгружающие основной код с внешнего хоста: «Клубничка 18+» (rc.bwa.ad) и Showy (showy.online/online.js — файл локально патчен под абсолютный URL, иначе он бы подгружал `/online.js` с нашего сервера). Остальные скачаны целиком (для pubtorr / torrentmanager / td скачано тело, а не лоадер).
|
||
|
||
- `plugins/sources.json` — карта «локальный файл → исходный URL». Для обновления плагина: скачать файл по исходному URL, перезаписать локальный, перезапуск не нужен.
|
||
- `plugins/modss.js` — локальная patched-копия MODS's (заменён вызов `Lampa.Utils.isPWA()`), раздаётся как `/plugins/modss.js`, но из каталога исключена (upstream мёртв: загрузчик отвечает stub-ошибкой «Используйте: lampa.mx»). Вернуть карточку можно, добавив запись с `link: "{localhost}/plugins/modss.js"`.
|
||
|
||
Удалены из каталога (мёртвы upstream, проверено по факту выдачи):
|
||
- «MODS's» (`lampa.stream/modss`) — загрузчик отвечает stub-ошибкой;
|
||
- «Отзывы и рецензии» (`lampaplugins.github.io/store/o.js`) — файл заменён автором на пустой stub;
|
||
- «Вторая кнопка Торренты», «Поиск локального TorrServer», «Горячие кнопки», «Золотая Тема», «Тип управления», «Старый стиль», «Мультфильмы» — публичных копий нет;
|
||
- «Телевидение by Skaz» / «ТВ by skaz» / «ТВ by skaz 2.0» — файлы заменены placeholder-заглушками;
|
||
- «Импорт/Экспорт закладок, истории» (`skaz.tv/export.js`) — 404.
|
||
|
||
Важный нюанс — **диск-кеш ответа**: маршруты LampaWeb кешируют ответы в `cache/static/<bucket>/<id>.json` (том `./cache`), кеш переживает рестарт контейнера. После правки `extensions.json` для мгновенного применения удалить закешированную запись:
|
||
|
||
```bash
|
||
rm -rf cache/static/59 # bucket /extensions; либо rm -rf cache/static
|
||
```
|
||
|
||
Перезапуск контейнера при этом **не требуется** (маршрут читает файл при каждом запросе, если нет кеш-записи).
|
||
|
||
## Tg-notify.bot: настройка бота
|
||
|
||
Секция `TelegramBot` в `config/init.conf`:
|
||
|
||
| Поле | Назначение |
|
||
|---|---|
|
||
| `bot_token` | Токен от [@BotFather](https://t.me/BotFather). **Обязателен** — без него long polling не стартует (в логе будет предупреждение, сервер продолжит работать) |
|
||
| `tmdb_api_key` | Ключ TMDB v3 для обложек и описаний эпизодов |
|
||
| `trakt_client_id` | Client ID Trakt (основной источник новых серий; если пуст — только TMDB) |
|
||
| `lampac_host` | Базовый URL Lampac, по умолчанию `http://127.0.0.1:9118` |
|
||
| `lampac_token` | Токен `accsdb`, нужен если включена защита |
|
||
| `check_interval_minutes` | Период фоновой проверки (дефолт 60, первый прогон через 2 минуты) |
|
||
| `data_dir` | Каталог подписок, дефолт `database/tgnotify` |
|
||
|
||
Привязка аккаунта: в Lampa во вкладке «TG Подписки» — deep-link `/start link_{uid}`. Команды бота: `/start`, `/list`, `/check`, `/help`, `/unlink`.
|
||
|
||
## Обновление Lampac
|
||
|
||
```bash
|
||
docker compose pull
|
||
docker compose up -d
|
||
```
|
||
|
||
Перед обновлением проверить, что в `docker-compose.yaml` раскомментированы нужные тома. Данные сохраняются в примонтированных томах: `config/`, `cache/`, `database/`, `dlna/`, `mods/`. Изображение закреплено на конкретном теге — при обновлении поменяй тег в `docker-compose.yaml`.
|
||
|
||
## Безопасность
|
||
|
||
По предупреждению официальной документации:
|
||
|
||
- Не публикуй в интернет без аутентификации, WAF и ограничения сети: `/adminpanel`, `/weblog`, `/database-editor`, `Tracks`, `Transcoding`, `Catalog`, `DLNA`, proxy-модули.
|
||
- Нигде не раскрывай `config/passwd`, cookie `accspasswd`, заголовок `lcrqpasswd`.
|
||
- Для публикации за reverse proxy: [deployment/reverse-proxy](https://docs.lampac.dev/deployment/reverse-proxy) (HTTPS в ответах, реальный IP клиента, WebSocket, SSE, streaming).
|
||
- `shm_size: 4096mb` — рекомендованный минимум для Playwright/Chromium.
|