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:
Porfiry
2026-09-15 17:07:30 +03:00
parent 21a3a37a66
commit f105c1adff
8 changed files with 405 additions and 2 deletions
+43
View File
@@ -0,0 +1,43 @@
#!/bin/bash
# Распаковка образа игры из dir-дампа skopeo в версионированный каталог nginx.
# Использование: unpack-release.sh <тег> <dir-дамп образа>
set -euo pipefail
TAG="$1"
IMG="$2"
DEST="/opt/game/releases/${TAG}"
[ -d "$IMG" ] || { echo "нет дампа $IMG"; exit 1; }
rm -rf /tmp/rootfs-${TAG}
mkdir -p /tmp/rootfs-${TAG}
cd "$IMG"
# слои из manifest.json в правильном порядке
/usr/bin/python3 - <<'PY' > /tmp/layers-${TAG}.txt
import json
m = json.load(open('manifest.json'))
for l in m['layers']:
print(l['digest'].split(':', 1)[1])
PY
while read -r layer; do
[ -z "$layer" ] && continue
case "$layer" in
*tar.gz|*tgz) tar -xzf "$layer" -C /tmp/rootfs-${TAG} ;;
*tar.zst) tar --zstd -xf "$layer" -C /tmp/rootfs-${TAG} ;;
*) tar -xf "$layer" -C /tmp/rootfs-${TAG} ;;
esac
done < /tmp/layers-${TAG}.txt
SRC="/tmp/rootfs-${TAG}/usr/share/nginx/html"
[ -d "$SRC" ] || { echo "нет $SRC в образе"; ls /tmp/rootfs-${TAG}/usr/share/nginx 2>/dev/null; exit 1; }
mkdir -p "$DEST"
cp -a "$SRC/." "$DEST/"
chmod -R a+rX /opt/game/releases
rm -rf /tmp/rootfs-${TAG} /tmp/layers-${TAG}.txt
echo "=== релиз ${TAG} разложен в ${DEST} ==="
ls -la "$DEST"
du -sh "$DEST"