ADR-011: статика игры вынесена из куба на nginx (LXC 152 game-web), версии каталогами
- корень smart-updown.binom.pw -> nginx на Proxmox (LXC 152, 192.168.76.152) - /api,/ws -> куб (router PathPrefix на внешнем Traefik VDS), куб не менялся - версионирование: /opt/game/releases/<N>/, активная = симлинк /opt/game/current - tools/proxmox-nginx: unpack-release.sh, publish-release.sh, game.nginx.conf, smart-updown.traefik.yaml, README - приёмка живьём: корень 200 nginx/1.24.0 (Ubuntu), /27/ /28/ 200, /api/state 200 JSON, /api/ws цена, autoclose-check 9/9 - питфоллы: OCI-manifest в skopeo dir-дампе, слэш в конце версии, /solana-rpc мимо PathPrefix /api
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
# nginx на Proxmox — раздача статики игры (LXC 152)
|
||||
|
||||
Боевой веб-слой игры «Бинарная ракета»: **корень `smart-updown.binom.pw` раздаётся nginx'ом
|
||||
на LXC 152 с версионированием по каталогам**. Бэк (API/WS) остаётся в кубе — см. ADR-011.
|
||||
|
||||
## Что где живёт
|
||||
|
||||
| Что | Где |
|
||||
|---|---|
|
||||
| LXC | **152 `game-web`**, 192.168.76.152 (Server3, `pct exec 152` через `root@192.168.76.66`) |
|
||||
| nginx-конфиг | `/etc/nginx/sites-available/game` (симлинк в `sites-enabled/`) |
|
||||
| Сборки | `/opt/game/releases/<N>/` — `Build/`, `TemplateData/`, `index.html`, `ServiceWorker.js` |
|
||||
| Активная сборка | `/opt/game/current` → симлинк на `releases/<N>` |
|
||||
| Инструменты | `/opt/game/tools/` (`unpack-release.sh`, `publish-release.sh`) |
|
||||
| Логи | `/var/log/nginx/game-access.log`, `game-error.log` |
|
||||
|
||||
## Адреса
|
||||
|
||||
- `https://smart-updown.binom.pw/` — активная сборка;
|
||||
- `https://smart-updown.binom.pw/<N>/` — конкретная сборка (**обязательно со слэшем**);
|
||||
- `https://smart-updown.binom.pw/<N>/Build/WebGL.data` — ассет конкретной сборки;
|
||||
- `/api`, `/ws` — **не nginx**: их забирает внешний Traefik (VDS) → куб (ingress `smart-updown-api`).
|
||||
|
||||
## Публикация сборки
|
||||
|
||||
```bash
|
||||
# CI fun-game-front2 пушит образ images.binom.pw/fun/game-front2:<N>
|
||||
# затем на хосте Proxmox:
|
||||
ssh root@192.168.76.66 "pct exec 152 -- /opt/game/tools/publish-release.sh <N> --activate"
|
||||
```
|
||||
|
||||
Без `--activate` сборка ляжет в `/opt/game/releases/<N>/` и будет доступна по `/<N>/`,
|
||||
но корень останется прежним. Откат = `publish-release.sh <старый N> --activate`.
|
||||
|
||||
## Проверка
|
||||
|
||||
```bash
|
||||
curl -sI https://smart-updown.binom.pw/ | grep -iE 'server|last-modified' # nginx/1.24.0 (Ubuntu)
|
||||
curl -s -o /dev/null -w '%{http_code}\n' https://smart-updown.binom.pw/<N>/
|
||||
curl -s https://smart-updown.binom.pw/api/state | head -c 80 # JSON от шлюза в кубе
|
||||
# сквозная живая приёмка (ставит реальную ставку):
|
||||
cd ~/WORK/games/pump-game-ops && BASE=https://smart-updown.binom.pw/api \
|
||||
WS_URL=wss://smart-updown.binom.pw/api/ws node tools/autoclose-check.cjs # ждём 9/9
|
||||
```
|
||||
|
||||
## Питфоллы
|
||||
|
||||
- **Слэш в конце обязателен** для версии: `/28` → 301 (редирект на `/28/`). Unity грузит ассеты
|
||||
относительным путём (`Build/WebGL.loader.js`), поэтому без слэша `Build/...` уедет в корень → 404.
|
||||
- **`skopeo ... dir:` пишет OCI-манифест**, где `layers` — словари. `unpack-release.sh` берёт
|
||||
`digest` каждого слоя и распаковывает по имени файла `<hex>` (не `sha256:...`).
|
||||
- **Кэш больше не прилипает между релизами**: URL содержит номер сборки → `immutable` корректен.
|
||||
Внутри версии каталог не перезаписывается, поэтому ассеты действительно неизменяемы.
|
||||
- **Сборки копятся** (~68 МБ на версию) — ретеншен пока ручной, см. `TASKS.md`.
|
||||
- **Откат схемы целиком**: вернуть `/opt/traefik/static/smart-updown.yaml` из
|
||||
`/root/bak-smart-updown-nginx-2026-09-15/` на VDS — домен снова пойдёт целиком в куб.
|
||||
Reference in New Issue
Block a user