Daily Meet Wiki / Environments

Environments

Two fully isolated Railway environments — testing and production — each with its own domain, database, and deploy trigger. Set up 2026-09-24.

Production is not fully live yet. The domain, database, and deploy pipeline are real and isolated, but Razorpay/Cashfree on production still hold testing's sandbox keys (copied when the environment was created). Real money does not move on production until live keys are set — see Third-party services.

URLs

TestingProduction
Backend API https://api-staging.dailymeet.in https://api.dailymeet.in
Admin Panel https://admin-staging.dailymeet.in https://admin.dailymeet.in
Railway fallback URLs backend-production-74c8.up.railway.app, admin-panel-production-64bd.up.railway.app backend-production-092e1.up.railway.app, admin-panel-production-b9f1.up.railway.app
Backend health check/health on either backend URL

Everything else, side by side

TestingProduction
Railway environment nametestingproduction
Deploys from git branchmain — every push auto-deploysproduction — only when that branch updates
Backend ENVIRONMENT valuestagingproduction
Databaseown Postgres, own volumeown Postgres, own volume — never shares data with testing
Razorpay / Cashfreesandbox / test keysstill sandbox (copied from testing)
Firebase, Agora, Cloudflare TURN, Stream, MSG91shared between both environments — see Third-party services

Why the apex domain (dailymeet.in) is untouched

The root domain already carries the account's Google Workspace mail records (MXsmtp.google.com, plus a google-site-verification TXT). A DNS CNAME at the root cannot coexist with those, so both environments live on subdomains only — the registrar (BigRock) refuses a root CNAME outright if other records already exist there.

DNS records (registrar: BigRock, zone dailymeet.in)

TypeHostPoints toEnvironment
CNAMEapi-stagingbjs7qxy4.up.railway.apptesting
CNAMEadmin-stagingmbe81k3e.up.railway.apptesting
CNAMEapit9pf24e9.up.railway.appproduction
CNAMEadminteeqzggt.up.railway.appproduction

Check current status any time: railway domain status <domain> --service <name> --environment <env> (expect Verified: yes, Certificate status: CERTIFICATE_STATUS_TYPE_VALID). Note: if a custom domain is ever deleted and re-created, Railway issues a new CNAME target — re-check before assuming the value above still applies.

Promoting testing → production

production deploys only from the production git branch, specifically so a routine push to main can never reach real users by accident. To release what's on main:

git checkout production
git merge main
git push origin production

Railway auto-deploys both backend and admin-panel in the production environment once that lands. There is no CI gate beyond this — the merge itself is the release action, so only merge what has actually been exercised on testing first.

Switching which environment you're looking at (Railway CLI)

railway environment testing      # or: railway environment production
railway status                   # confirms which one is linked
railway variables --service backend --environment production --kv

History

Until 2026-09-24 there was a single Railway environment, internally (and confusingly) named production even though it was being used for day-to-day testing. It was renamed to testing, moved onto the -staging subdomains, and a real production environment was created alongside it via railway environment new production --duplicate testing (which is also why production initially inherited testing's env values — each had to be corrected by hand afterward, including the security-relevant ENVIRONMENT flag). Full blow-by-blow is in daily-meet-platform/docs/KT_CHANGELOG.md under 2026-09-24.