Deployment
Build and start commands, required services, secrets, the Stripe webhook and the hold sweeper.
The Railway template deploys the app from GitHub with PostgreSQL and a private bucket named Storage. It generates SESSION_SECRET and CRON_SECRET and points the app URLs at the service's public domain. Stripe and SMTP variables are left blank.
Processes
| Process | Command | Purpose |
|---|---|---|
| Build | keystone build --no-ui && next build | Generates the schema and builds Next.js |
| Web | npm run migrate && next start | Applies migrations, then serves the storefront, dashboard and GraphQL |
| Hold sweeper | POST /api/cron/expire-holds every minute | Releases expired holds and settles pending payments |
railway.toml in the repository sets the build and start commands. Migrations run at start, not at build, because the database is usually reachable only from the running service.
Checklist
- Provision PostgreSQL. Set
DATABASE_URLand aSESSION_SECRETof 48 or more characters. - Set
NODE_ENV=production,PUBLIC_SIGNUPS_ALLOWED=false, andSTOREFRONT_URLto the public origin. - Add Stripe keys. In the Stripe dashboard, create a webhook endpoint at
https://your-host/api/integrations/payment/pp_stripe/webhookforpayment_intent.succeeded,payment_intent.payment_failed,payment_intent.canceled,charge.refundedandrefund.updated. Put its signing secret inSTRIPE_WEBHOOK_SECRET. - Set
CRON_SECRETand schedule the hold sweeper. - Deploy, open
/dashboard/init, create the first admin, and run setup. - Buy a ticket with a test card and refund it before switching to live keys.