- FastAPI backend: admin bootstrap with forced credential change, admin-created users with one-time generated passwords, roles as permission sets - Games and versions with content-addressed blob storage; forks copy only the manifest, so mods share assets with the original - Worker: archive/RPA extraction, unrpyc for .rpyc, own .rpy parser, Python subset translated via ast, media converted to WebP/Opus/WebM - React panel (library search, game page, upload, users, roles) and a framework-free web player with saves, history, skip/auto, transitions - docker compose: postgres, backend, worker, nginx on a single HTTP port Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
73 lines
3.9 KiB
Markdown
73 lines
3.9 KiB
Markdown
# PGames — локальная библиотека визуальных новелл
|
||
|
||
Загружаете архив с игрой на Ren'Py — сервер распаковывает его, переводит
|
||
скрипты и ассеты в собственный формат **PGVN** (JSON-скрипты, WebP, Opus, WebM)
|
||
и удаляет исходники. Играете в браузере во встроенном плеере. У каждой игры
|
||
может быть несколько версий (форков) от разных пользователей; версии делят
|
||
общие ассеты, поэтому форк почти не занимает места.
|
||
|
||
Подробности устройства — в [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).
|
||
|
||
## Установка на VM
|
||
|
||
```bash
|
||
git clone <repo> pgames && cd pgames
|
||
cp .env.example .env
|
||
# обязательно поменяйте SECRET_KEY (openssl rand -hex 32) и пароли
|
||
docker compose up -d --build
|
||
```
|
||
|
||
Приложение слушает `http://<IP VM>:8080` (порт — `HTTP_PORT` в `.env`).
|
||
Caddy на хосте Proxmox:
|
||
|
||
```
|
||
games.example.lan {
|
||
reverse_proxy 192.168.1.50:8080
|
||
}
|
||
```
|
||
|
||
Если в браузере сайт открывается по HTTPS через Caddy, оставьте
|
||
`COOKIE_SECURE=true`; при доступе напрямую по HTTP поставьте `false`, иначе
|
||
браузер не сохранит сессию.
|
||
|
||
## Первый вход
|
||
|
||
Логин `admin` / пароль из `ADMIN_PASSWORD` (по умолчанию `admin`). Сразу после
|
||
входа нужно задать свой логин и пароль.
|
||
|
||
Регистрации нет: пользователей создаёт админ в разделе «Пользователи».
|
||
Сервер генерирует пароль и показывает его один раз — передайте его человеку,
|
||
при первом входе он задаст свой. Права настраиваются через роли
|
||
(«Роли»): `admin`, `moderator`, `player` плюс свои.
|
||
|
||
## Данные и бэкап
|
||
|
||
* `./data/blobs` — сконвертированные игры (неизменяемые файлы по sha256);
|
||
* том `db` — PostgreSQL (пользователи, игры, версии, сохранения).
|
||
|
||
Для бэкапа достаточно `pg_dump` и копии `data/blobs`.
|
||
|
||
## Разработка
|
||
|
||
```bash
|
||
cd backend && pip install -r requirements.txt pytest && python -m pytest
|
||
cd frontend && npm install && npm run dev # проксирует /api на :8000
|
||
python -m tests.make_sample sample.zip # тестовая игра (из backend/)
|
||
```
|
||
|
||
## Что поддерживает конвертер Ren'Py
|
||
|
||
`label`, реплики (в т.ч. атрибуты, `extend`, `centered`, NVL), `scene/show/hide`
|
||
с `at`/`as`/`behind`/`zorder`/`with`, переходы (`dissolve`, `fade`,
|
||
`Fade(...)`, `vpunch`, wipe/slide…), `menu` с условиями и `set`, `if/elif/else`,
|
||
`while`, `jump/call/return` (включая `expression`), `$`/`python:`/`init python:`
|
||
(подмножество Python: переменные, выражения, списки/словари, циклы),
|
||
`define/default`, `Character(...)`, `image` (файлы, цвета, `Transform`, `im.*`,
|
||
`Composite`, `ConditionSwitch`, простые ATL), `transform` со статическими
|
||
свойствами, `play/queue/stop/voice`, `pause`, `.rpa`, `.rpyc` (через unrpyc),
|
||
автоопределение картинок из `images/`, GUI-текстбокс и шрифты игры.
|
||
|
||
Пока **не** поддерживается: `screen`-язык (кастомные экраны и мини-игры),
|
||
анимации ATL, `layeredimage`, функции/классы в `python` — такие места
|
||
перечислены в отчёте конвертации у версии.
|