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. 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 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 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".
  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.