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:
codeUse 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:
codelist-deployments with json=true to see recent deployment statuses
- •
If deployment failed, check logs:
codeget-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:
codelist-variables with json=true
- •
Set new variables:
codeset-variables with variables array like ["KEY=value", "KEY2=value2"]
- •
Common patterns:
- •
NEXT_PUBLIC_*- Next.js client-safe public variables - •
DATABASE_URL- Database connection string - •
*_API_KEY- API keys (server-side only)
- •
Domain Configuration
- •
Generate Railway domain:
codegenerate-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
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
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 | |----------|-------------| | ... | ... |