When I say I deploy on Google Cloud Platform, I mean a short list of products used on purpose - not “we are a GCP shop” as identity. This article is the decision record so it can be quoted: why GCP, which pieces, and what still lives elsewhere.
Why GCP for these products
Ezlearn was the engagement that forced a written choice. The product was an EdTech platform for Indian learners: course video, subscriptions, certificates, AI roadmaps, a job portal. I needed containers, a managed Postgres, object storage, and a bill that a bootstrapped company in Noida could survive. GCP beat AWS on Asia-region price and latency. It beat “Vercel for everything” because course video and long-lived API work do not belong on a serverless frontend platform.
| Workload | Default home | Why |
|---|---|---|
| Next.js marketing / booking UI | Vercel | Edge cache, preview deploys, great for Jara-style spiky guest traffic |
| Fastify / Node API | Cloud Run | Docker contract, HTTPS, scale with requests |
| PostgreSQL | Supabase or Cloud SQL | Managed, backed up, not in the API container |
| Video, PDFs, images | Cloud Storage + CDN | Keep binaries off Node; cheap egress patterns |
| Secrets | Secret Manager | Not in git, not in the image |
Cloud Run in practice
Cloud Run runs the Docker image I described in Docker in production. I set memory and CPU from real traffic, not from a blog default. For SVSFood, lunch and dinner are the peaks; overnight should cost nearly nothing. Scale-to-zero is acceptable for admin-only services. For the order API I keep a minimum instance if cold starts would hit a kiosk tap.
Networking and identity
Public HTTPS terminates at Cloud Run (or a load balancer if I need more). The API authenticates users with session or JWT checks in Fastify. When the database is Cloud SQL, the Run service connects through the Cloud SQL connector or a private IP. When the database is Supabase, the API uses the connection string and, where possible, a pooler so I do not open a new Postgres connection per request.
Files are not the API
Ezlearn’s video delivery is the clearest example. If Node streams gigabytes, you pay for the wrong resource and you lose the process to slow clients. Objects go to a bucket. The app stores metadata in Postgres and hands the client a signed or CDN URL. Certificates work the same way: generate PDF, put in Storage, email the link. The API stays in the request/response business.
What I avoid on GCP
- GKE for a single service. Kubernetes is a product you operate. Clients did not hire me to operate a cluster.
- A dozen GCP products on day one. No Pub/Sub, Dataflow, or BigQuery until there is a question those tools answer.
- Lifting a monolith onto Compute Engine “temporarily.” Temporary VMs become the architecture.
Results that justify the choice
Ezlearn held 99.9% uptime and 1,000+ monthly active users on this shape. SVSFood’s API sits in the same family of decisions and supports four clients against one database. I write this so “GCP” on my skills and about pages means a documented production practice, not a certification badge.
The data layer that makes Cloud Run boring - Postgres, auth, realtime - is covered in Supabase and PostgreSQL.