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. Create the stateful node pool + prod Postgres¶
The DB runs on a small on-demand pool so it is never spot-preempted. The pool
is defined in infrastructure/gcp/gke.tf, gated off by default. Create it:
cd infrastructure/gcp
terraform apply -var="enable_stateful_pool=true" # 1x e2-standard-2 on-demand, ~$49/mo
k8s/envs/prod/postgres/manifests/cluster.yaml is already sized for the curated
catalog (instances: 1, 30Gi, 4Gi, on-demand so no preemption; GCS point-in-time backups for recovery) and pins to this pool via
nodeSelector: workload=stateful. 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. Enable the assets custom domain¶
enable_custom_domain stays false while assets.tomoda.life is held by the old
account's distribution. Once the CNAME frees (old account permanent deletion
~2026-10, or manual reopen + delete), set enable_custom_domain = true in the
prod workspace and terraform apply. See item #1 in _temp-docs/aws-migration-todo.md (repo root).
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 node pool to high-mem (the pool already exists from launch):
terraform apply -var="enable_stateful_pool=true" -var="stateful_machine_type=e2-highmem-4". - 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)