Skip to content

Deploy to Railway

Deploy a Pondoknusa app to Railway using a Dockerfile or Nixpacks with managed Postgres.

Prerequisites

  • Railway account and CLI (optional)
  • Pondoknusa app with Postgres: pondoknusa new my-app --db=postgres
  • @pondoknusa/database-pg installed
  1. Copy deploy files from examples/hello-world/deploy/
  2. Connect your GitHub repo in Railway
  3. Railway detects Dockerfile and builds automatically

Service variables

Set in the Railway dashboard (Variables tab):

VariableValue
NODE_ENVproduction
APP_ENVproduction
APP_DEBUGfalse
APP_URLhttps://${{RAILWAY_PUBLIC_DOMAIN}}
PONDOKNUSA_HOST0.0.0.0
PONDOKNUSA_PORT${{PORT}}
DB_CONNECTIONpostgres
DB_HOST${{Postgres.PGHOST}}
DB_PORT${{Postgres.PGPORT}}
DB_DATABASE${{Postgres.PGDATABASE}}
DB_USERNAME${{Postgres.PGUSER}}
DB_PASSWORD${{Postgres.PGPASSWORD}}
QUEUE_CONNECTIONdatabase

Add a Postgres plugin; Railway exposes PG* variables you reference above.

Pre-deploy command

In Settings → Deploy → Pre-deploy command:

bash
npx pondoknusa migrate \
  && npx pondoknusa route:cache \
  && npx pondoknusa view:cache

Start command

Leave empty to use Dockerfile CMD, or set explicitly:

bash
./deploy/docker-entrypoint.sh

Option B — railway.toml

toml
[build]
builder = "DOCKERFILE"
dockerfilePath = "Dockerfile"

[deploy]
preDeployCommand = "npx pondoknusa migrate"
startCommand = "./deploy/docker-entrypoint.sh"
healthcheckPath = "/health/ready"
healthcheckTimeout = 30
restartPolicyType = "ON_FAILURE"

Queue worker (second service)

  1. Duplicate the service in Railway
  2. Name it worker
  3. Start command:
bash
npx pondoknusa queue:work
  1. Share the same Postgres variables; disable public networking on the worker.

Redis + broadcasting (optional)

  1. Add Railway Redis plugin (or Upstash Redis)
  2. Set REDIS_URL / REDIS_HOST variables
  3. Scaffold with --redis and BROADCAST_CONNECTION=websocket
  4. Add @pondoknusa/broadcasting-websocket provider in src/main.ts

Custom domain

  1. Settings → Networking → Custom domain
  2. Update APP_URL to https://your-domain.com
  3. Redeploy so signed URLs and mail links resolve correctly

Local parity

bash
railway link
railway run npx pondoknusa start

Uses linked service variables against your local process.

Troubleshooting

SymptomFix
Port binding errorSet PONDOKNUSA_PORT to Railway's PORT variable — Railway injects PORT at runtime
View cache missAdd view:cache to pre-deploy command
DB connection refusedConfirm Postgres plugin is linked to the same service
Worker not processingDeploy worker service; check jobs table

Next

Released under the MIT License.