Railway Deployment
Deploy and manage applications on Railway's platform.
Quick Start
bash
# Install Railway CLI npm i -g @railway/cli # Login railway login # Initialize project railway init # Deploy railway up
railway.toml Configuration
toml
[build] builder = "nixpacks" buildCommand = "npm run build" [deploy] startCommand = "npm start" healthcheckPath = "/health" healthcheckTimeout = 300 restartPolicyType = "on_failure" restartPolicyMaxRetries = 3 [service] internalPort = 3000
Nixpacks Configuration
toml
# nixpacks.toml [phases.setup] nixPkgs = ["nodejs-18_x", "python311"] [phases.install] cmds = ["npm ci"] [phases.build] cmds = ["npm run build"] [start] cmd = "npm start"
Environment Variables
bash
# Set variable railway variables set DATABASE_URL="postgres://..." # Set from file railway variables set < .env # Link to service railway service railway variables set API_KEY="secret"
Database Services
PostgreSQL
bash
# Add PostgreSQL railway add -d postgres # Get connection string railway variables get DATABASE_URL
Redis
bash
railway add -d redis # Access via REDIS_URL
MySQL
bash
railway add -d mysql # Access via MYSQL_URL
Private Networking
yaml
# Services can communicate via internal DNS
# Format: ${{service-name}}.railway.internal
# Example: API calling database service
DATABASE_HOST: ${{postgres.railway.internal}}
DATABASE_PORT: 5432
Volumes (Persistent Storage)
bash
# Create volume railway volume create my-data # Mount in service railway volume attach my-data:/app/data
In code:
javascript
// Data persists across deploys
const dataPath = '/app/data';
fs.writeFileSync(`${dataPath}/file.json`, JSON.stringify(data));
Cron Jobs
toml
# railway.toml [deploy] startCommand = "node cron.js" cronSchedule = "0 */6 * * *" # Every 6 hours
Multi-Service Setup
code
my-project/
├── api/
│ ├── railway.toml
│ └── ...
├── worker/
│ ├── railway.toml
│ └── ...
└── frontend/
├── railway.toml
└── ...
Deploy each:
bash
cd api && railway up cd ../worker && railway up cd ../frontend && railway up
Dockerfile Deploy
dockerfile
FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY . . EXPOSE 3000 CMD ["npm", "start"]
toml
# railway.toml [build] builder = "dockerfile" dockerfilePath = "./Dockerfile"
Health Checks
typescript
// Express health endpoint
app.get('/health', (req, res) => {
res.status(200).json({
status: 'healthy',
timestamp: new Date().toISOString()
});
});
toml
# railway.toml [deploy] healthcheckPath = "/health" healthcheckTimeout = 100
Resources
- •Railway Docs: https://docs.railway.app
- •Railway CLI: https://docs.railway.app/develop/cli