Production Launch¶
How to bring up the prod tenant when you are ready to go live. The app runs against dev during beta, so prod stays undeployed until you work through this page. Nothing here happens automatically. Argo CD does not sync the prod tier until you apply it (step 2).
Prod launches lean: the curated catalog only (prestige lists, cities, notable places), which fits on the normal spot nodes. The 60M-row Overture set is not loaded, so there is no dedicated node pool and no big DB until you decide you need planet-scale coverage (see Scaling to Overture).
Already done (prerequisites)¶
- AWS prod applied (account
373544523193,us-east-2). Migration open items:_temp-docs/aws-migration-todo.md(repo root). - Secrets present in GCP SM for prod (
*-prod). See Secrets management. - GKE cluster + GCP infra applied.
1. Verify the stateful node pool + prod Postgres¶
The DB runs on the on-demand data pool (pool=data) so it is never spot-preempted.
The pool is always provisioned by Terraform (infrastructure/gcp/gke.tf); no flag needed.
k8s/envs/prod/postgres/manifests/cluster.yaml is sized for the curated catalog
(instances: 1, 30Gi, 4Gi, GCS point-in-time backups) and pins to this pool via
nodeSelector: {pool: data} + a workload=stateful toleration. No manual DB sizing,
and no PgBouncer at this scale. Backend connects via the postgres-prod-postgresql alias.
2. Bring up the prod Argo tier¶
kubectl apply -f k8s/envs/bootstrap.yaml # if platform+dev only were bootstrapped earlier
kubectl get applications -n argocd # confirm the prod Application syncs
See Bootstrap step 6.
3. Load the curated catalog¶
Publish the curated seed set and run the on-demand load Job in tomoda-prod.
See Location seed load — Load prod. Skip the
Overture collection in the published set for now.
4. Confirm the assets custom domain¶
enable_custom_domain defaults to true (infrastructure/aws/variables.tf),
so applying the prod workspace creates the ACM cert, Cloudflare CNAME, and
attaches the alias automatically. Confirm https://assets.tomoda.life resolves
through CloudFront after apply.
Verification¶
kubectl get applications -n argocd— prod appsSynced/Healthy.kubectl get cluster -n data postgres-prod— 1 instance Ready.- Seed load Job completed; row counts match the manifest.
https://api.tomoda.life/healthreturns OK through the prod ingress.
Scaling to Overture (later)¶
Only when you need full global POI coverage. This is where the cost jumps (~+$400/mo, mostly the on-demand node pool):
- Bump the data pool to high-mem: in
infrastructure/gcp/gke.tf, changevar.data_machine_typetoe2-highmem-4andterraform apply. - Resize prod Postgres in
cluster.yaml:storage: 250Gi, memory16Gi,shared_buffers 4GB,effective_cache_size 12GB,maintenance_work_mem 2GB,work_mem 64MB. It already pins to the stateful pool. Add a CNPGPooler(PgBouncer) and repoint thepostgres-prod-postgresqlalias at it. - Load the seed set including the Overture collection.
Related¶
- Bootstrap · Deploy · Location seed load
- GKE · Postgres (CNPG)
- AWS migration open items:
_temp-docs/aws-migration-todo.md(repo root)