Railway CLI Skill
Fast reference for Railway CLI operations. See REFERENCE.md for comprehensive documentation.
Overview
What is Railway: Modern PaaS for instant deployments with zero configuration. Supports any language/framework via Nixpacks or Dockerfile. Includes managed databases, private networking, and automatic SSL.
When to Use: Deploying apps, managing services/databases, debugging (logs, SSH), configuring domains, managing environment variables, CI/CD integration.
Auto-Detection: railway.json, railway.toml, RAILWAY_TOKEN in .env, or user mentions Railway.
Table of Contents
- Overview
- Critical: Avoiding Interactive Mode
- Prerequisites
- Authentication
- CLI Decision Tree
- Command Quick Reference
- Static Reference Data
- Common Workflows
- Private Networking
- Error Handling
- Framework Quick Start
- JSON Output Mode
- Quick Reference Card
Critical: Avoiding Interactive Mode
Railway CLI can enter interactive mode which will hang Claude Code. Always use flags:
| Command | WRONG | CORRECT |
|---------|-------|---------|
| Link project | railway link | railway link -p <project> -e <env> |
| Create project | railway init | railway init -n <name> |
| Switch env | railway environment | railway environment <name> |
| Remove deploy | railway down | railway down -y |
| Redeploy | railway redeploy | railway redeploy -y |
| Deploy | railway up | railway up --detach |
| SSH | railway ssh | railway ssh -- <command> |
Required flags: -y (skip prompts), --detach (background), explicit names, --json (parsing), -- <cmd> (SSH).
Never use: railway login, railway connect (without service), railway shell, commands without explicit params.
Prerequisites
# Verify installation
railway --version # Expects: 3.x.x+
# Install options
npm i -g @railway/cli # npm
brew install railway # Homebrew
bash <(curl -fsSL cli.new) # Shell script
Authentication
Token Types
| Token Type | Env Variable | Scope |
|------------|--------------|-------|
| Project Token | RAILWAY_TOKEN | Single environment (for logs, up) |
| Account Token | RAILWAY_API_TOKEN | All projects (for init, link) |
Critical: railway logs requires a Project Token, not an account token.
Quick Setup
# Set token for session
export RAILWAY_TOKEN="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
# Or inline from .env
RAILWAY_TOKEN=$(grep RAILWAY_TOKEN .env | cut -d= -f2) railway logs
# Verify authentication
railway whoami
Discovering Tokens
grep -i railway .env
grep -E '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}' .env
See REFERENCE.md for token creation and storage best practices.
CLI Decision Tree
Project Operations
├── Create project → railway init -n <name>
├── Link to project → railway link -p <project> -e <env>
├── List projects → railway list
├── View status → railway status
└── Open dashboard → railway open
Deployment
├── Deploy (background) → railway up --detach
├── Redeploy → railway redeploy -y
├── Remove deployment → railway down -y
└── Deploy template → railway deploy -t <template>
Services & Databases
├── Add PostgreSQL → railway add -d postgres
├── Add Redis → railway add -d redis
├── Add from repo → railway add -r owner/repo
├── Run with vars → railway run <command>
└── Link to service → railway service <name>
Debugging
├── View logs → railway logs
├── Build logs → railway logs -b
├── SSH command → railway ssh -- <command>
└── Check status → railway status
Environment & Variables
├── Switch environment → railway environment <name>
├── Create environment → railway environment new -d <source>
├── Delete environment → railway environment delete <name> -y
├── View variables → railway variables
└── Set variable → railway variables --set KEY=value
See REFERENCE.md for all commands with full flag details.
Command Quick Reference
Project Management
| Command | Example |
|---------|---------|
| railway init | railway init -n myapp |
| railway link | railway link -p myproject -e production |
| railway list | railway list |
| railway status | railway status |
| railway unlink | railway unlink |
Deployment
| Command | Example |
|---------|---------|
| railway up | railway up --detach |
| railway redeploy | railway redeploy -y |
| railway down | railway down -y |
| railway logs | railway logs -d <id> |
Services
| Command | Example |
|---------|---------|
| railway add | railway add -d postgres |
| railway service | railway service api |
| railway run | railway run npm start |
Debugging
| Command | Example |
|---------|---------|
| railway logs | railway logs |
| railway logs -b | railway logs -b |
| railway ssh -- cmd | railway ssh -- ls -la |
Static Reference Data
Regions
| Code | Location |
|------|----------|
| us-west2 | California, USA |
| us-east4-eqdc4a | Virginia, USA |
| europe-west4-drams3a | Amsterdam, Netherlands |
| asia-southeast1-eqsg3a | Singapore |
Database Types
| Type | Flag | Shell |
|------|------|-------|
| PostgreSQL | -d postgres | psql |
| MySQL | -d mysql | mysql |
| Redis | -d redis | redis-cli |
| MongoDB | -d mongo | mongosh |
Railway-Provided Variables
| Variable | Description |
|----------|-------------|
| RAILWAY_PUBLIC_DOMAIN | Public domain |
| RAILWAY_PRIVATE_DOMAIN | Private domain (.railway.internal) |
| PORT | Port to listen on |
| RAILWAY_ENVIRONMENT | Environment name |
Common Workflows
1. Deploy Application
railway init -n myapp # Create project
railway up --detach # Deploy (background)
railway logs # Check logs
2. Add Database
railway add -d postgres # Add PostgreSQL
railway run npm run migrate # Run migrations
3. Configure Domain
railway domain # Generate Railway domain
railway domain api.myapp.com -p 3000 # Custom domain
4. Debug Failing Deployment
railway status # Check status
railway logs # View runtime logs
railway logs -b # View build logs
railway ssh -- ps aux # SSH command
5. CI/CD Deployment
export RAILWAY_TOKEN=${{ secrets.RAILWAY_TOKEN }}
railway up --detach -s api
See REFERENCE.md for GitHub Actions, GitLab CI, and CircleCI examples.
Private Networking
Services communicate via: <service-name>.railway.internal
Example: http://api.railway.internal:3000
Port Binding (Required)
Apps must listen on :: for IPv4/IPv6:
// Node.js
app.listen(process.env.PORT, '::', () => console.log('Running'));
# Python
gunicorn --bind "[::]:${PORT:-8000}" app:app
See REFERENCE.md for library configurations and TCP proxy.
Error Handling
Common Errors
| Error | Resolution |
|-------|------------|
| command not found: railway | Install via npm/brew |
| Not logged in | Set RAILWAY_TOKEN |
| No project linked | Run railway link |
| Unauthorized | Check token, re-authenticate |
| Deployment failed | Check railway logs -b |
502 Error Debugging
# 1. Get PROJECT token (not account token)
grep -i railway .env
# 2. Set token and verify
export RAILWAY_TOKEN="<uuid>"
railway whoami
# 3. Check logs
railway logs
Common 502 causes: Missing dependencies, port binding issues, startup crashes.
See REFERENCE.md for comprehensive troubleshooting.
Framework Quick Start
Node.js
app.listen(process.env.PORT, '::', () => console.log('Running'));
Python
# Procfile
web: gunicorn --bind "[::]:${PORT:-8000}" app:app
Rails
// railway.json
{
"deploy": {
"startCommand": "bundle exec rails server -b :: -p $PORT"
}
}
See REFERENCE.md for complete configuration options.
JSON Output Mode
railway status --json | jq '.services[].name'
railway logs --json | jq -r 'select(.level == "error") | .message'
Quick Reference Card
# Authentication
export RAILWAY_TOKEN="xxx"
# Project
railway init -n myapp
railway link -p myproject -e production
railway status
# Deploy
railway up --detach
railway redeploy -y
railway down -y
# Services
railway add -d postgres
railway run npm run migrate
# Debug
railway logs
railway logs -b
railway ssh -- ps aux
# Environment
railway environment staging
railway variables --set KEY=value
# Domain
railway domain api.example.com -p 3000
See REFERENCE.md for: Complete command documentation, advanced deployment patterns, volume management, environment variable strategies, networking deep dive, CI/CD integration, security best practices, troubleshooting, and config-as-code.
Scan to join WeChat group