Files
pump-game-ops/tools/proxmox-nginx/README.md
T
Porfiry f105c1adff 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
2026-09-15 17:07:30 +03:00

3.6 KiB

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).

Публикация сборки

# 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.

Проверка

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 — домен снова пойдёт целиком в куб.