Overview
Production runs as a Docker container on a GCE VM, fronted by nginx, deployed via .github/workflows/{staging,production,partyvest}-deployment.yaml — SSH onto the instance and docker run the built image. There's no App Engine, Cloud Run, or GKE involved, despite some older internal notes exploring those as possibilities before the real architecture was confirmed.
What's here
- Environment Configuration — the environment variables the app depends on, grouped by concern, and how they reach each environment.
- Observability — Sentry and GCP-native Error Reporting/Profiler run side by side (not a migration from one to the other, despite an older note claiming so), plus how to get a caught error correctly reported and the Cloud Monitoring → Slack alerting setup.
- Background Jobs Infrastructure — Cloud Tasks vs. Pub/Sub, when each applies, and how to set up and verify both.
- WebSocket Routing in Production — why a new WebSocket endpoint needs an nginx change, not just backend code, and the checklist that came out of the one time this was missed.
- Database Migrations — the Knex migration/seed conventions, the socket-vs-TCP connection difference between local and staging/production, and why seeds are looser than migrations.
- Testing Bank Transfers Locally — reproducing the PartyBank/PVB webhook flow in dev.