Sister Brawl — Deployment Guide

Pure ops/deployment. Architecture → Architecture. Systems → Systems.


Build Pipeline

Frontend Build (Atomic)

cd /home/usr/funday
bash scripts/build-atomic.sh

What it does:

  1. npx vite buildbuild/client/ + build/server/
  2. Atomic swap: mv build /var/www/sisterbrawl-build-new
  3. Symlink: ln -sfn build-new public
  4. Restart: systemctl restart funday-frontend

Nakama Module Build

cd /home/usr/funday/nakama-modules
npm run build

Output: dist/index.js → copied to /var/lib/nakama/modules/

K8s Deploy (Optional)

sudo kubectl apply -f games/sisterbrawl/deploy/k3s-deployment.yaml
sudo kubectl apply -f games/sisterbrawl/deploy/k3s-metrics-deployment.yaml
sudo kubectl rollout status -n funday-platform deployment/sisterbrawl

Health Checks

Frontend

# Local
curl -sf http://127.0.0.1:3000/health
 
# Remote
curl -sf https://funday.gg/play/sisterbrawl | head -3

Expected: 200 OK with HTML containing <canvas> and data-game-id="sisterbrawl"

Nakama

curl -sf https://funday.gg/v2/healthcheck

Expected: 200 OK with {"status":"healthy","services":{"nakama":"ok"}}

Metrics Sidecar

curl -sf http://localhost:9101/metrics | grep sisterbrawl

Expected: Prometheus metrics:

sisterbrawl_active_matches 2
sisterbrawl_tick_latency_ms 15
sisterbrawl_avg_players 4.5

Solo Mode (Headless Chrome)

cd /home/usr/funday
node scripts/verify-solo-headless.js

Expected output:

✅ Canvas: 896x493
✅ Coverage: 12.3%
✅ Solo mode: true
✅ Entities: 2

Deployment Commands (Quick Reference)

StepCommand
Deploy Nakamacd nakama-modules && npm run build && sudo kubectl rollout restart deployment/nakama -n funday-platform
Deploy Frontendbash scripts/build-atomic.sh
Check Frontendsystemctl is-active funday-frontend && curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/play/sisterbrawl
Check Nakama logssudo kubectl logs -n funday-platform deployment/nakama --tail=50
Check Frontend logssudo journalctl -u funday-frontend -f
Rollback frontendln -sfn build-prev public && systemctl restart funday-frontend

Rollback Procedure

Frontend Rollback

# Previous build stored at /var/www/sisterbrawl-build-prev
sudo ln -sfn /var/www/sisterbrawl-build-prev /var/www/sisterbrawl-public
sudo systemctl restart funday-frontend
sudo systemctl is-active funday-frontend
curl -sf http://127.0.0.1:3000/health

Nakama Rollback

# Roll back to previous image
sudo kubectl rollout undo deployment/nakama -n funday-platform
sudo kubectl rollout status deployment/nakama -n funday-platform

Verification Checklists

Pre-Deploy

CheckCommandExpected
Build successls -la build/server/index.jsFile exists
TypeScript cleantsc --noEmit0 errors
Lint cleaneslint src/0 warnings
Vite buildnpx vite build --mode productionSuccess
Health check (local)curl -sf http://localhost:3000/health200 OK
Game loads (prod)curl -sf https://funday.gg/play/sisterbrawl | grep canvasContains canvas

Post-Deploy

CheckToolExpected
Canvas alivebrowser_consolecanvas.width > 0 && non_black_pixels > 1%
No JS errorsbrowser_consoleconsole.errors.length === 0
Feature rendersbrowser_visionVision confirms expected UI
60fps sustainedbrowser_consolerequestAnimationFrame delta < 18ms
WebSocket connectsbrowser_consolesocket.onopen logged, STATE_UPDATE received
Solo mode worksbrowser_play2s timeout → bot spawns

Monitoring & Alerts

Prometheus Alerts

AlertConditionSeverity
SisterBrawlHighTickLatencyp95 > 20ms for 1mwarning
SisterBrawlVeryHighTickLatencyp99 > 50ms for 30scritical
SisterBrawlNoActivePlayers0 players for 10minfo

Grafana Dashboard

URL: https://funday.gg:9119/d/sisterbrawl-dashboard

Key panels:

  • Active matches (gauge)
  • Tick latency (p95/p99)
  • Players online
  • Match duration histogram
  • Top characters played

Scaling & Performance

Fleet Autoscaler (Agones)

Uses Packed scheduling for cost efficiency.

apiVersion: autoscaling.agones.dev/v1
kind: FleetAutoscaler
metadata:
  name: sisterbrawl-autoscaler
spec:
  replicas: 3
  scaleUp:
    delayAfterActions: 5m
  scaleDown:
    delayAfterActions: 10m

Resource Limits

ContainerCPUMemory
Nakama500m512Mi
Metrics100m128Mi
FrontendN/A (systemd)256Mi

Common Issues & Fixes

IssueSymptomFix
Black screenCanvas exists but no drawCheck isSoloMode in console
No bot spawnSolo mode doesn’t startVerify matchId === null in store
WebSocket failsocket.onopen never firesCheck Nakama logs for errors
Build failsTypeScript errorRun tsc --noEmit locally
Metrics missingNo Prometheus dataCheck metrics sidecar logs

File References

FilePurpose
scripts/build-atomic.shAtomic frontend deployment
games/sisterbrawl/deploy/k3s-deployment.yamlK8s manifests
nakama-modules/server/metrics.tsPrometheus metrics
devops/monitoring/prometheus/rules/sisterbrawl.ymlAlert rules


Ask Docs

AI assistant to help answer questions about the documentation. Answers are read-only and cite docs/source.

Hi! How can I help you with the documentation today? Answers are read-only and cite docs/source.

Ctrl+Enter to send