Skip to content

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 apps Synced / Healthy.
  • kubectl get cluster -n data postgres-prod — 1 instance Ready.
  • Seed load Job completed; row counts match the manifest.
  • https://api.tomoda.life/health returns 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):

  1. Bump the data pool to high-mem: in infrastructure/gcp/gke.tf, change var.data_machine_type to e2-highmem-4 and terraform apply.
  2. Resize prod Postgres in cluster.yaml: storage: 250Gi, memory 16Gi, shared_buffers 4GB, effective_cache_size 12GB, maintenance_work_mem 2GB, work_mem 64MB. It already pins to the stateful pool. Add a CNPG Pooler (PgBouncer) and repoint the postgres-prod-postgresql alias at it.
  3. Load the seed set including the Overture collection.