Skip to content

GKE Deployment

Quizzz runs on Google Kubernetes Engine (GKE) using ArgoCD for GitOps deployment.

Infrastructure

ComponentDevProd
Webdev-quizzz-webprod-quizzz-web
Workerdev-quizzz-workerprod-quizzz-worker
PostgRESTdev-quizzz-postgrestprod-quizzz-postgrest
Redisredis-cluster-master.sandboxredis-cluster-master.prod
PostgreSQLpostgresql-dev.storage-devpostgresql-prod.storage-prod

All components run in the quizzz namespace.

Docker Image

A single Docker image serves both web and worker:

dockerfile
# Web mode (default)
CMD ["pnpm", "start"]

# Worker mode
CMD ["node", "dist/worker/index.js"]

The QUIZZZ_MODE=worker env var switches the runtime behavior.

CI/CD Pipeline

  1. Push to main triggers GitHub Actions
  2. Verify: lint + type-check + unit tests
  3. Build: Docker image pushed to GAR with sha-{hash} and latest tags
  4. Deploy dev: kubectl set image on dev deployment
  5. E2E gate: Playwright tests against dev environment
  6. Deploy prod: Manual trigger or version tag

ArgoCD

The application repo manages all Kustomize configs:

application/
  base/quizzz-web/          # Base deployment, service, ingress
  base/quizzz-worker/       # Base worker deployment
  dev/quizzz-web/           # Dev overlay (env, secrets, ingress)
  dev/quizzz-worker/        # Dev worker overlay
  prod/quizzz-web/          # Prod overlay
  prod/quizzz-worker/       # Prod worker overlay

ArgoCD image updater watches the latest tag and auto-deploys on digest change.

Manual Deploy

bash
# Build and push via Cloud Build
gcloud builds submit \
  --tag asia-east1-docker.pkg.dev/wise-sandbox-300013/gar/quizzz/web:latest \
  --region asia-east1 \
  --machine-type=e2-highcpu-8

# Update ArgoCD image
argocd app set quizzz-dev-web \
  --kustomize-image "...=...@sha256:NEW_DIGEST"
argocd app sync quizzz-dev-web

TechTrans Lab