diff --git a/.gitignore b/.gitignore index 7a86136..1fdd3a0 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,6 @@ dlna/ # Системное .DS_Store + +# Серверный override (Proxmox: том DLNA -> /mnt/torrents), живёт только на сервере +docker-compose.override.yml diff --git a/AGENT.md b/AGENT.md index 38fd07e..b110aea 100644 --- a/AGENT.md +++ b/AGENT.md @@ -12,6 +12,16 @@ - 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` +## Продакшн: 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`. 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//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. - **Два уровня включения модуля:** (1) `SkipModules`/manifest — модуль скомпилирован и работает на сервере; (2) `LampaWeb.initPlugins.` в `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//` — после правки удалить соответствующий файл (`grep -rl secuses cache/static/`) или весь каталог static, затем перезапросить. diff --git a/README.md b/README.md index 9fc5ac5..bdccdc9 100644 --- a/README.md +++ b/README.md @@ -185,6 +185,37 @@ dlna/ # медиа/превью DLNA Порядок переноса: скопировать файлы → `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