Документация: развёртывание на Proxmox LXC 121 (SMB mp0, override-том DLNA)

This commit is contained in:
2026-10-01 18:27:57 +03:00
parent 0073100ab3
commit 8dcbc6bc52
3 changed files with 45 additions and 1 deletions
+3
View File
@@ -10,3 +10,6 @@ dlna/
# Системное # Системное
.DS_Store .DS_Store
# Серверный override (Proxmox: том DLNA -> /mnt/torrents), живёт только на сервере
docker-compose.override.yml
+11 -1
View File
@@ -12,6 +12,16 @@
- Git: `ssh://git@gitea.prodik.ru:222/prodik/lampac.git`, ветка **main** (эта); ветка `synology` — тот же код с абсолютными путями томов Synology NAS; remote настроен как `origin` - 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`, `modules/`, доки, `.gitignore` - Коммиты: `git add -A && git commit && git push origin main` — секреты/данные отсекает `.gitignore`; в git идут только compose, `init.conf`, `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`: маппинг LXC `0→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`.
## Файлы ## Файлы
| Файл | Назначение | Правила | | Файл | Назначение | Правила |
@@ -47,7 +57,7 @@ curl -fsS -o /dev/null -w '%{http_code}\n' http://localhost:9118/online.js # о
2. После любых изменений в проекте — дополнять `README.md` и `AGENT.md`. 2. После любых изменений в проекте — дополнять `README.md` и `AGENT.md`.
3. Конфиг менять только в `config/init.conf`; валидность проверять: `python3 -m json.tool config/init.conf`. 3. Конфиг менять только в `config/init.conf`; валидность проверять: `python3 -m json.tool config/init.conf`.
4. Включение/выключение модулей — через `BaseModule.SkipModules` в `init.conf` (добавить имя = выключить; имя = имя папки в `/lampac/module/`, группы вроде `OnlineAnime` выключаются целиком). `SkipModules` **не hot-reload** — после правки нужен `docker compose restart lampac`. Модули, у которых в образе `manifest.json: enable: false` (`Tracks`, `Music`, `Tg-notify.bot`, `AdminPanel`), включаются только manifest-оверрайдом: копия манифеста с `enable: true` в `modules/<Name>/manifest.json` + монтирование в compose. Список модулей: https://docs.lampac.dev/modules/overview 4. Включение/выключение модулей — через `BaseModule.SkipModules` в `init.conf` (добавить имя = выключить; имя = имя папки в `/lampac/module/`, группы вроде `OnlineAnime` выключаются целиком). `SkipModules` **не hot-reload** — после правки нужен `docker compose restart lampac`. Модули, у которых в образе `manifest.json: enable: false` (`Tracks`, `Music`, `Tg-notify.bot`, `AdminPanel`), включаются только manifest-оверрайдом: копия манифеста с `enable: true` в `modules/<Name>/manifest.json` + монтирование в compose. Список модулей: https://docs.lampac.dev/modules/overview
- Текущее состояние: выключены `OnlineAnime`, `OnlineUKR`, `OnlinePaid`, `OnlineGEO`, `Transcoding`, `WebLog`; включены все остальные (TorrServer, Sync/TimeCode/Storage/SyncEvents, Catalog, JacRed, DLNA, SISI, Tracks, Music, Tg-notify.bot, AdminPanel). - Текущее состояние: выключены `OnlineAnime`, `OnlineUKR`, `OnlinePaid`, `OnlineGEO`, `Transcoding`; включены все остальные (TorrServer, Sync/TimeCode/Storage/SyncEvents, Catalog, JacRed, DLNA, SISI, Tracks, Music, Tg-notify.bot, AdminPanel, WebLog).
- Плагины Lampa: `/online.js`, `/sisi.js`, `/dlna.js` и т.д. Большинство Lampac сам подключает клиенту через `/lampainit.js` (см. ниже про `initPlugins`); при необходимости плагин можно добавить вручную по URL. - Плагины Lampa: `/online.js`, `/sisi.js`, `/dlna.js` и т.д. Большинство Lampac сам подключает клиенту через `/lampainit.js` (см. ниже про `initPlugins`); при необходимости плагин можно добавить вручную по URL.
- **Два уровня включения модуля:** (1) `SkipModules`/manifest — модуль скомпилирован и работает на сервере; (2) `LampaWeb.initPlugins.<name>` в `init.conf` — плагин попадает в список, который `/lampainit.js` добавляет клиенту Lampa (`Lampa.Plugins.add`). Без второго флага сервер отвечает, но пункт в Lampa не появится (так было с `dlna` — флаг `initPlugins.dlna` добавлен в init.conf). Дефолты флагов — в `current.conf` секция `LampaWeb.initPlugins`. - **Два уровня включения модуля:** (1) `SkipModules`/manifest — модуль скомпилирован и работает на сервере; (2) `LampaWeb.initPlugins.<name>` в `init.conf` — плагин попадает в список, который `/lampainit.js` добавляет клиенту Lampa (`Lampa.Plugins.add`). Без второго флага сервер отвечает, но пункт в Lampa не появится (так было с `dlna` — флаг `initPlugins.dlna` добавлен в init.conf). Дефолты флагов — в `current.conf` секция `LampaWeb.initPlugins`.
- **Магазин плагинов** в Lampa (Настройки → Плагины) читает `/extensions` → `LampaWeb/plugins/extensions.json` (каталог образа). Свои записи добавляются через override-файл в `modules/LampaWeb/plugins/extensions.json` (монтирован в compose). Ответ кешируется `Staticache` на диске: `cache/static/<bucket>/` — после правки удалить соответствующий файл (`grep -rl secuses cache/static/`) или весь каталог static, затем перезапросить. - **Магазин плагинов** в Lampa (Настройки → Плагины) читает `/extensions` → `LampaWeb/plugins/extensions.json` (каталог образа). Свои записи добавляются через override-файл в `modules/LampaWeb/plugins/extensions.json` (монтирован в compose). Ответ кешируется `Staticache` на диске: `cache/static/<bucket>/` — после правки удалить соответствующий файл (`grep -rl secuses cache/static/`) или весь каталог static, затем перезапросить.
+31
View File
@@ -185,6 +185,37 @@ dlna/ # медиа/превью DLNA
Порядок переноса: скопировать файлы → `docker compose up -d` → health-check: `curl "http://localhost:9118/version?type=hash"`. Порт 9118 и пути в compose относительные — правок не требуется. Порядок переноса: скопировать файлы → `docker compose up -d` → health-check: `curl "http://localhost:9118/version?type=hash"`. Порт 9118 и пути в compose относительные — правок не требуется.
## Развёртывание на Proxmox (LXC)
Постоянный продакшн: LXC-контейнер `121` (`lampac`) на Proxmox `192.168.88.254`, IP контейнера **192.168.88.23** (DHCP).
| Параметр | Значение |
| --- | --- |
| Шаблон | `local:vztmpl/debian-13-standard_13.6-1_amd64.tar.zst` |
| Тип | **unprivileged**, `features: nesting=1,keyctl=1` (нужно Docker), `onboot: 1` |
| Ресурсы | 2 cores / 4096 MB / 32 GB (`local-lvm`), swap 512 |
| Сеть | `vmbr0`, DHCP → `192.168.88.23` |
| Docker | `docker.io` + compose v2-плагин в `/usr/local/lib/docker/cli-plugins/docker-compose` |
| Проект | `/opt/lampac` (rsync с рабочей машины, `.git` не копируется) |
| Доступ | SSH по ключу `~/.ssh/id_rsa_prodik` (pubkey в `/root/.ssh/authorized_keys` контейнера) |
**SMB для DLNA** — `\\10.6.0.1\Torrents`:
- Монтируется **на хосте Proxmox** в `/mnt/torrents` (fstab, `credentials=/root/.smb_cred`, **umask 600** на креды) и пробрасывается в контейнер как `mp0: /mnt/torrents`.
- Причина: unprivileged LXC **не может монтировать cifs сам** — ядро требует `CAP_SYS_ADMIN` в init user namespace (`mount error: Operation not permitted`, не AppArmor).
- `uid=101000,gid=101000` в fstab: маппинг LXC `0→100000`, поэтому в контейнере файлы видны как `1000:1000` — приложение (`lampac`, uid 1000) может писать превью в `thumbs/`.
- Том подключён через **`docker-compose.override.yml`** (не в git): `services.lampac.volumes: [/mnt/torrents:/lampac/data/dlna]` — базовый `docker-compose.yaml` остаётся с `./dlna`, rsync-обновления его не ломают.
**Проверка после развёртывания:**
```bash
ssh root@192.168.88.23
cd /opt/lampac && docker compose up -d
docker ps --filter name=lampac # healthy
for u in "/version?type=hash" /online.js /ts/ /dlna /extensions; do
curl -s -o /dev/null -w "%{http_code} $u\n" "http://127.0.0.1:9118$u"; done # все 200
```
## Полезные команды ## Полезные команды
```bash ```bash