名称: Railway CLI 管理 描述: 部署、管理服务、查看日志和配置 Railway 基础设施。在部署到 Railway、管理环境变量、查看部署日志、扩展服务或管理卷时使用。
Railway CLI 管理
掌握 Railway CLI 进行部署、服务管理、日志查看和基础设施操作。
快速参考
部署
# 部署当前目录到链接的服务
railway up
# 部署时不附加日志
railway up --detach
# 部署到特定服务
railway up --service api
# 部署到特定环境
railway up --environment production
# 重新部署最新部署
railway redeploy
# 重新部署特定服务
railway redeploy --service worker
# 跳过确认
railway redeploy --yes
# 移除最近一次部署
railway down
# 移除特定服务的部署
railway down --service api
服务和项目管理
# 列出所有项目
railway list
# 链接到现有项目(交互式)
railway link
# 按 ID 链接到特定项目
railway link <project-id>
# 显示当前项目状态
railway status
# 以 JSON 格式获取状态(包含部署 ID!)
railway status --json
# 在浏览器中打开项目仪表板
railway open
# 取消当前目录与项目的链接
railway unlink
# 链接到特定服务
railway service <service-name-or-id>
# 向项目添加新服务
railway add
获取部署 ID
最佳方法:
# 获取包括部署 ID 的完整项目状态
railway status --json
# 使用 jq 提取特定部署 ID
railway status --json | jq -r '.services.edges[0].node.serviceInstances.edges[0].node.latestDeployment.id'
# 获取特定服务的部署 ID
railway status --json | jq -r '.services.edges[] | select(.node.name=="api") | .node.serviceInstances.edges[0].node.latestDeployment.id'
输出结构:
.services.edges[].node- 服务信息.node.serviceInstances.edges[].node.latestDeployment.id- 最新部署 UUID.node.serviceInstances.edges[].node.latestDeployment.meta- 提交信息、构建配置等
日志
查看日志
# 流式传输最新部署日志
railway logs
# 查看特定服务日志
railway logs --service api
# 查看特定环境日志
railway logs --environment production
# 查看部署日志(启动/运行时)
railway logs --deployment
# 查看构建日志
railway logs --build
# 按 ID 查看特定部署日志
railway logs <deployment-id>
# 获取特定服务的部署日志
railway logs --service worker --deployment
# 以 JSON 格式输出
railway logs --json
# 组合选项
railway logs --service api --deployment --json
日志提示:
- 默认:显示最新部署日志
- 部署日志:应用程序启动和运行时输出
- 构建日志:编译、依赖、Nixpacks 输出
- 使用
--json和jq进行过滤
环境变量
# 列出活动环境的所有变量
railway variables
# 列出特定服务变量
railway variables --service api
# 列出特定环境变量
railway variables --environment production
# 以 key=value 格式显示
railway variables --kv
# 以 JSON 格式输出
railway variables --json
# 设置变量
railway variables --set "DATABASE_URL=postgres://..."
# 设置多个变量
railway variables --set "NODE_ENV=production" --set "LOG_LEVEL=debug"
# 使用 Railway 变量运行本地命令
railway run npm start
# 打开加载了 Railway 变量的子shell
railway shell
环境
# 链接到环境(交互式)
railway environment
# 链接到特定环境
railway environment production
# 创建新环境
railway environment new
# 删除环境
railway environment delete <environment-name>
扩展
# 在链接环境中扩展服务
railway scale --us-west1 3
# 扩展特定服务
railway scale --service api --us-west1 2
# 跨多个区域扩展
railway scale --us-west1 2 --europe-west4 1
# 可用区域:
# --us-west1, --us-west2, --us-east4
# --europe-west4, --asia-southeast1
卷
# 列出卷
railway volume list
# 列出特定服务卷
railway volume list --service api
# 添加新卷
railway volume add
# 删除卷
railway volume delete <volume-id>
# 更新卷
railway volume update <volume-id>
# 从服务分离卷
railway volume detach <volume-id>
# 将卷附加到服务
railway volume attach <volume-id>
数据库连接
# 连接到数据库 shell
railway connect
# 示例:
# - PostgreSQL:打开 psql
# - MongoDB:打开 mongosh
# - MySQL:打开 mysql
# - Redis:打开 redis-cli
认证
# 登录到 Railway 账户
railway login
# 注销
railway logout
# 检查当前用户
railway whoami
常见工作流程
初始项目设置
# 登录
railway login
# 链接到现有项目
railway link
# 或创建新项目
railway init
# 链接到服务
railway service api
# 链接到环境
railway environment production
# 检查状态
railway status
使用环境变量部署
# 设置变量
railway variables --set "NODE_ENV=production" --set "API_KEY=secret"
# 部署
railway up
# 监控日志
railway logs --deployment
调试失败的部署
# 获取部署 ID
DEPLOY_ID=$(railway status --json | jq -r '.services.edges[0].node.serviceInstances.edges[0].node.latestDeployment.id')
# 查看构建日志
railway logs $DEPLOY_ID --build
# 查看部署日志
railway logs $DEPLOY_ID --deployment
# 检查完整状态
railway status --json | jq '.services.edges[].node.serviceInstances.edges[].node.latestDeployment'
监控多个服务
# 终端 1:API 日志
railway logs --service api --deployment
# 终端 2:工作进程日志
railway logs --service worker --deployment
# 或使用 JSON + jq 过滤
railway logs --service api --json | jq 'select(.level == "error")'
提取部署信息
# 获取所有部署 ID
railway status --json | jq -r '.services.edges[].node | {service: .name, deployment: .serviceInstances.edges[0].node.latestDeployment.id}'
# 获取部署提交信息
railway status --json | jq -r '.services.edges[].node.serviceInstances.edges[].node.latestDeployment.meta | {commit: .commitHash, message: .commitMessage}'
# 获取服务 URL
railway status --json | jq -r '.services.edges[].node | select(.serviceInstances.edges[0].node.latestDeployment.canRedeploy == true)'
配置更改后重新部署
# 修改变量
railway variables --set "NEW_VAR=value"
# 重新部署以应用更改
railway redeploy --yes
# 或全新部署
railway up
使用 Railway 环境运行命令
# 运行迁移
railway run npm run migrate
# 运行种子脚本
railway run node scripts/seed.js
# 使用生产变量启动本地开发
railway run npm run dev
# 打开包含所有变量的 shell
railway shell
重要说明
部署目标
- 生产:链接到生产环境
- 预览:基于分支的部署(在 Railway 仪表板中配置)
- 开发:本地使用
railway run或railway shell
JSON 输出
railway status --json是最全面的命令- 包含:服务、部署 ID、提交信息、构建配置、服务实例
- 使用
jq进行解析和过滤
环境链接
- 项目、服务和环境都单独链接
- 使用
railway status验证链接对象 - 使用
railway service、railway environment、railway link更改
日志行为
- 默认:最新部署日志(5 分钟窗口)
- 部署日志:应用程序输出(stdout/stderr)
- 构建日志:Nixpacks、依赖、编译
- JSON 输出:结构化日志便于解析
Railway.json 配置
- 存储在项目根目录
- 定义每个服务的构建/部署配置
- 示例:
{
"$schema": "https://railway.app/railway.schema.json",
"build": {
"builder": "NIXPACKS",
"buildCommand": "pnpm install && pnpm run build"
},
"deploy": {
"startCommand": "node dist/index.js",
"healthcheckPath": "/health",
"healthcheckTimeout": 100,
"restartPolicyType": "ON_FAILURE",
"restartPolicyMaxRetries": 10
}
}
常见问题
- 无 TTY 错误:命令需要交互输入(使用 JSON 输出或标志)
- 服务未链接:先运行
railway service <service-name> - 环境未链接:先运行
railway environment <env-name> - 部署未找到:使用
railway status --json验证部署 ID 存在
真实项目示例
Saturn 后端(API + 工作进程)
# 检查两个服务状态
railway status --json | jq '.services.edges[] | {
service: .node.name,
deployment: .node.serviceInstances.edges[0].node.latestDeployment.id,
commit: .node.serviceInstances.edges[0].node.latestDeployment.meta.commitHash
}'
# 获取 API 部署日志
railway logs --service api --deployment
# 获取工作进程部署日志
railway logs --service worker --deployment
# 配置更改后重新部署两者
railway redeploy --service api --yes
railway redeploy --service worker --yes
调试生产问题
# 流式传输实时日志并错误过滤
railway logs --service api --deployment --json | jq 'select(.level == "error" or .level == "fatal")'
# 获取最近部署元数据
railway status --json | jq '.services.edges[] | select(.node.name == "api") | .node.serviceInstances.edges[0].node.latestDeployment.meta'
# 检查健康检查配置
railway status --json | jq '.services.edges[].node.serviceInstances.edges[].node.latestDeployment.meta.fileServiceManifest.deploy'