Deployment
Approved Lee Kong Si production and staging hosts, data placement and cutover controls.
The approved production topology has six purpose hosts; production cutover is still pending. Keep these names exact in DNS, provider settings,
@vigor/env, CORS, Better Auth trusted origins and acceptance checks.
Approved hosts
| Role | Production | Staging |
|---|---|---|
| Marketing | https://www.lee-kong-si.cenvora.dev | https://www.lee-kong-si-test.cenvora.dev |
| App | https://app.lee-kong-si.cenvora.dev | https://app.lee-kong-si-test.cenvora.dev |
| Platform | https://platform.lee-kong-si.cenvora.dev | https://platform.lee-kong-si-test.cenvora.dev |
| Partner | https://partner.lee-kong-si.cenvora.dev | https://partner.lee-kong-si-test.cenvora.dev |
| API | https://api.lee-kong-si.cenvora.dev | https://api.lee-kong-si-test.cenvora.dev |
| Docs | https://docs.lee-kong-si.cenvora.dev | https://docs.lee-kong-si-test.cenvora.dev |
Production uses APP_ENV=production and PROJECT_NAME=lee-kong-si. Staging uses
APP_ENV=staging and PROJECT_NAME=lee-kong-si-test; staging is project-scoped under
cenvora.dev. Do not introduce an apex or admin host into this topology.
The production API origin is exactly https://api.lee-kong-si.cenvora.dev. The production
session cookie domain is .lee-kong-si.cenvora.dev; staging uses
.lee-kong-si-test.cenvora.dev. The API origin, trusted origins, frontend environment values
and cookie domain must be changed together during a cutover. A stale BETTER_AUTH_URL keeps
authentication on the old API host.
Singapore placement
Vercel functions and Vercel Blob stores use sin1. Railway API and database resources use the
Singapore region asia-southeast1-eqsg3a. Staging and production have separate databases,
Blob stores, authentication secrets and provider credentials. The staging Blob store is private.
Provider routing and CDN edges can be global even when compute and primary data are in Singapore. Verify each resource's effective region after provisioning rather than inferring it from a project default.
Railway configuration
Setting railwayConfigFile is rejected by the current Railway API, which reports the old
Config as Code format as deprecated. Configure the API service directly in Railway: Singapore region, the approved
replica setting, health check, start command and environment variables. Treat direct Railway
settings as the source of truth and verify them after every redeploy.
Required API values include DATABASE_URL, a staging-only BETTER_AUTH_SECRET,
APP_ENV=staging, PROJECT_NAME=lee-kong-si-test, ROOT_DOMAIN=cenvora.dev, and the exact
staging BETTER_AUTH_URL when an override is needed. Do not reuse production data or secrets.
Cutover and recovery
Before a cutover, take and verify a database backup, rehearse the migration and restore path, record the deployed commit, and confirm the API health/version endpoints. Apply reviewed database migrations manually through the migration runner; do not rely on an automatic deploy hook to mutate a live database. Repeat parity checks for Better Auth IDs, association member IDs, relationships and photo metadata after restore.
After DNS and TLS are configured for all enabled exact hosts (marketing remains deferred), verify CORS, the cookie domain, fresh
email sign-in, pending application status, approval, session revocation, private photo access
and the Resend webhook route. Production promotion requires the completed cutover evidence in
docs/migration/CUTOVER.md; the rehearsal record is docs/migration/REHEARSAL.md.
The docs site does not provision providers, change DNS or run live migrations. The deployment operator owns those actions and must keep staging and production resources separate.