Railway is an infrastructure platform with instant deployments from GitHub, automatic SSL, and built-in database provisioning. It auto-detects Bun projects and requires zero configuration for most apps.
Prerequisites:
- A Bun application ready for deployment
- A Railway account
- A GitHub account (for dashboard deployments) or the Railway CLI
Method 1: Deploy via CLI
Install the Railway CLI
bun install -g @railway/cli
Initialize a new project
Run this from your project directory: Add a database (optional)
If your app uses PostgreSQL, add it before deploying:# Add PostgreSQL — do this before adding the app service
railway add --database postgres
# Add the app service and wire up the database URL
railway add --service my-bun-app --variables DATABASE_URL=\${{Postgres.DATABASE_URL}}
Skip this step if your application does not need a database.
Deploy and expose a public domain
# Deploy the application
railway up
# Generate a public HTTPS domain
railway domain
Your app is now live. Railway auto-deploys on every push to your connected branch.
Method 2: Deploy via Dashboard
Create a new project
- Go to the Railway Dashboard.
- Click + New → GitHub repo.
- Authorize Railway and select your repository.
Add a database (optional)
- In the project canvas, click + New → Database → Add PostgreSQL.
- Select your app service (not the database).
- Go to the Variables tab.
- Click + New Variable → Add Reference and select
DATABASE_URL from the Postgres service.
Skip this step if your application does not need a database.
Generate a public domain
- Select your app service.
- Go to the Settings tab.
- Under Networking, click Generate Domain.
Your app is now live. Railway re-deploys automatically on every GitHub push.
Configuration
By default, Railway uses Nixpacks to auto-detect and build your Bun project with zero configuration.
For better Bun support and guaranteed compatibility with the latest Bun versions, use Railpack instead. Create a railway.json in your project root:
{
"$schema": "https://railway.com/railway.schema.json",
"build": {
"builder": "RAILPACK"
}
}
Custom start command
To override the default start command, set it in the Railway dashboard under Settings → Deploy → Start command, or add it to railway.json:
{
"$schema": "https://railway.com/railway.schema.json",
"build": {
"builder": "RAILPACK"
},
"deploy": {
"startCommand": "bun run src/index.ts"
}
}
Environment variables
Set environment variables in the Railway dashboard under your service’s Variables tab. They are injected into process.env at runtime:
const port = parseInt(process.env.PORT ?? "3000");
const dbUrl = process.env.DATABASE_URL;
Railway automatically injects a PORT environment variable. Always use process.env.PORT rather than a hard-coded port number.