railway
Railway Deployment Skill
This skill provides workflows and knowledge for deploying and managing applications on Railway.
Overview
Railway is a modern cloud platform for deploying applications. This skill integrates with the Railway MCP tools to provide deployment, monitoring, and management capabilities.
Prerequisites
Before using Railway MCP tools:
- Install Railway CLI: https://docs.railway.com/guides/cli
- Authenticate: Run
railway loginin terminal - Link project: Run
railway linkin the project directory
Available MCP Tools
| Tool | Purpose |
|---|---|
check-railway-status |
Verify CLI is installed and authenticated |
list-projects |
List all Railway projects for the account |
list-services |
List services in the linked project |
list-deployments |
List deployments with status and metadata |
list-variables |
Show environment variables for a service |
set-variables |
Set environment variables |
get-logs |
Get build or deployment logs |
deploy |
Upload and deploy from local directory |
generate-domain |
Generate a Railway domain for the service |
link-service |
Link to a specific Railway service |
link-environment |
Link to a specific Railway environment |
create-environment |
Create a new Railway environment |
create-project-and-link |
Create and link a new Railway project |
deploy-template |
Search and deploy Railway templates |
Deployment Workflow
First-Time Setup
-
Verify CLI authentication:
Use check-railway-status to confirm Railway CLI is logged in -
Link project (if not linked):
- User runs
railway loginin terminal - User runs
railway linkin the project directory - Or use
create-project-and-linkfor new projects
- User runs
-
Configure root directory (for monorepos):
- If app is in a subdirectory (e.g.,
web/,app/,frontend/), configure in Railway Dashboard: - Service → Settings → Source → Root Directory
- If app is in a subdirectory (e.g.,
Deployment Process
-
Check current status:
list-deployments with json=true to see recent deployment statuses -
If deployment failed, check logs:
get-logs with logType="build" and the failed deploymentId -
Common build failures:
- Missing root directory configuration (monorepos)
- Syntax errors in code
- Missing dependencies
- Invalid environment variables
-
Deploy changes:
- Push to GitHub (auto-deploy if connected)
- Or use
deploytool for manual deployment
Environment Variables
-
View current variables:
list-variables with json=true -
Set new variables:
set-variables with variables array like ["KEY=value", "KEY2=value2"] -
Common patterns:
NEXT_PUBLIC_*- Next.js client-safe public variablesDATABASE_URL- Database connection string*_API_KEY- API keys (server-side only)
Domain Configuration
-
Generate Railway domain:
generate-domain to get a *.up.railway.app domain -
Custom domains:
- Configure in Railway Dashboard: Service → Settings → Public Networking
- Add CNAME record at DNS provider pointing to Railway domain
Framework-Specific Configuration
Next.js
railway.toml (place in app root):
[build]
builder = "nixpacks"
[deploy]
startCommand = "npm run start"
healthcheckPath = "/"
healthcheckTimeout = 300
restartPolicyType = "ON_FAILURE"
restartPolicyMaxRetries = 10
NestJS + Prisma
railway.toml:
[build]
builder = "nixpacks"
buildCommand = "npx prisma generate && npx prisma migrate deploy && npm run build"
[deploy]
startCommand = "node dist/main.js"
healthcheckPath = "/health"
healthcheckTimeout = 300
restartPolicyType = "ON_FAILURE"
restartPolicyMaxRetries = 10
Node.js/Express
railway.toml:
[build]
builder = "nixpacks"
[deploy]
startCommand = "node server.js"
healthcheckPath = "/health"
Python/FastAPI
railway.toml:
[build]
builder = "nixpacks"
[deploy]
startCommand = "uvicorn main:app --host 0.0.0.0 --port $PORT"
healthcheckPath = "/health"
Python/Django
railway.toml:
[build]
builder = "nixpacks"
buildCommand = "python manage.py collectstatic --noinput"
[deploy]
startCommand = "gunicorn myproject.wsgi --bind 0.0.0.0:$PORT"
healthcheckPath = "/health"
Troubleshooting
"Railpack could not determine how to build"
Cause: Root directory not set for monorepo structures.
Fix: Set Root Directory in Railway Dashboard → Service → Settings → Source.
Build Syntax Errors
Cause: Code pushed with syntax errors.
Fix:
- Check build logs:
get-logswithlogType="build" - Fix the error locally
- Push the fix to trigger new deployment
Missing Environment Variables
Cause: Required environment variables not set.
Fix:
- Check current vars:
list-variables - Set missing vars:
set-variables
Domain Not Working
Cause: DNS not configured or not propagated.
Fix:
- Verify CNAME record points to Railway domain
- Wait for DNS propagation (up to 72 hours)
- Check Railway Dashboard for verification status
Port Configuration
Railway automatically provides a PORT environment variable. Ensure your application listens on 0.0.0.0:$PORT.
Node.js:
const port = process.env.PORT || 3000;
app.listen(port, '0.0.0.0', () => console.log(`Listening on ${port}`));
Python:
import os
port = int(os.environ.get("PORT", 8000))
Custom Domain Setup by Provider
Cloudflare (Recommended)
- Add CNAME record:
@→ Railway domain - Enable Cloudflare proxy (orange cloud)
- Set SSL/TLS to "Full" (not Full Strict)
- Enable Universal SSL
GoDaddy / Providers Without CNAME Flattening
GoDaddy and some providers don't support CNAME flattening for root domains. Options:
- Use subdomain:
www.domain.comorapp.domain.comwith CNAME record - Migrate DNS to Cloudflare: Change nameservers in registrar
- Use forwarding: Forward root to www subdomain
Standard CNAME Setup
For subdomains on any provider:
- In Railway: Add custom domain (e.g.,
app.yourdomain.com) - Copy the CNAME target (e.g.,
abc123.up.railway.app) - In DNS: Add CNAME record pointing subdomain to Railway target
- Wait for verification in Railway Dashboard
Multi-Service Projects (Full Stack)
For projects with frontend + backend + database:
Architecture
Railway Project
├── Frontend Service (Next.js) → goteammate/nextjs-template
├── Backend Service (NestJS) → goteammate/nestjs-template
└── PostgreSQL Database → Railway Postgres template
Setup via MCP Tools
create-project-and-link— Create the Railway projectdeploy-templatewith "PostgreSQL" — Add database- Connect GitHub repos for frontend and backend services
set-variables— WireDATABASE_URL,NEXT_PUBLIC_API_URL,FRONTEND_URLgenerate-domain— Create domains for each service
Auto-Wired Variables
| Variable | Service | Source |
|---|---|---|
DATABASE_URL |
Backend | Railway Postgres reference |
PORT |
Both | Railway auto-provides |
FRONTEND_URL |
Backend | Frontend Railway domain |
NEXT_PUBLIC_API_URL |
Frontend | Backend Railway domain |
NEXT_PUBLIC_APP_URL |
Frontend | Frontend Railway domain |
Bootstrap Shortcut
Use the new-project skill in teammate-ops to automate the entire multi-service setup from a single conversation.
Project Configuration Template
After importing this skill, add project-specific details to your local skill copy:
## Project Configuration
- **Project Name:** [Your Project]
- **Project ID:** [from Railway Dashboard]
- **Environment ID:** [from Railway Dashboard]
- **Service ID:** [from Railway Dashboard]
- **Root Directory:** [e.g., web/, app/, or /]
- **Custom Domain:** [if configured]
- **Dashboard URL:** https://railway.com/project/[project-id]
### Required Environment Variables
| Variable | Description |
|----------|-------------|
| ... | ... |