Railway数据库部署技能Skill railway-database

该技能用于在Railway云平台上快速部署和管理官方数据库服务,如PostgreSQL、Redis、MySQL和MongoDB。它通过模板化部署简化了数据库的创建、配置和连接,支持环境变量管理和服务集成,适用于DevOps实践、云原生应用开发和容器化部署。关键词:Railway, 数据库, 部署, DevOps, 云原生, Postgres, Redis, MySQL, MongoDB, 容器, 模板, 环境变量。

Docker/K8s 0 次安装 0 次浏览 更新于 3/20/2026

name: railway-database description: 添加官方的Railway数据库服务(Postgres、Redis、MySQL、MongoDB)。当用户想要添加数据库、说“添加postgres”、“添加redis”、“添加数据库”、“连接到数据库”或“连接数据库”时使用。对于其他模板(Ghost、Strapi、n8n),使用railway-templates技能。 version: 1.0.0 author: Railway license: MIT tags: [Railway, Database, Postgres, Redis, MySQL, MongoDB, 基础设施, 部署, 模板] dependencies: [railway-cli] allowed-tools: Bash(railway:*)

Railway 数据库

添加官方的Railway数据库服务。这些是维护的模板,具有预配置的卷、网络和连接变量。

对于非数据库模板,参见railway-templates技能。

何时使用

  • 用户要求“添加一个数据库”、“添加Postgres”、“添加Redis”等。
  • 用户需要为其应用程序添加数据库
  • 用户询问关于连接到数据库
  • 用户说“添加postgres并连接到我的服务器”
  • 用户说“连接数据库”

决策流程

始终先检查现有数据库,然后再创建。

用户提到数据库
        │
  先检查现有数据库
  (查询环境配置中的source.image)
        │
   ┌────┴────┐
 存在    不存在
    │          │
    │      创建数据库
    │      (CLI或API)
    │          │
    │      等待部署完成
    │          │
    └─────┬─────┘
          │
   用户想要连接服务?
          │
    ┌─────┴─────┐
   是         否
    │          │
通过环境变量   完成 +
连接变量      建议连接
技能

检查现有数据库

在创建数据库之前,检查是否已存在。

有关完整环境配置结构,参见environment-config.md

railway status --json

然后查询环境配置并检查每个服务的source.image

query environmentConfig($environmentId: String!) {
  environment(id: $environmentId) {
    config(decryptVariables: false)
  }
}

config.services对象包含每个服务的配置。检查source.image以识别:

  • ghcr.io/railway/postgres*postgres:* → Postgres
  • ghcr.io/railway/redis*redis:* → Redis
  • ghcr.io/railway/mysql*mysql:* → MySQL
  • ghcr.io/railway/mongo*mongo:* → MongoDB

可用数据库

数据库 模板代码
PostgreSQL postgres
Redis redis
MySQL mysql
MongoDB mongodb

先决条件

获取项目上下文:

railway status --json

提取:

  • id - 项目ID
  • environments.edges[0].node.id - 环境ID

获取工作区ID(不在状态输出中):

bash <<'SCRIPT'
${CLAUDE_PLUGIN_ROOT}/skills/lib/railway-api.sh \
  'query getWorkspace($projectId: String!) {
    project(id: $projectId) { workspaceId }
  }' \
  '{"projectId": "PROJECT_ID"}'
SCRIPT

添加数据库

步骤1:获取模板

bash <<'SCRIPT'
${CLAUDE_PLUGIN_ROOT}/skills/lib/railway-api.sh \
  'query template($code: String!) {
    template(code: $code) {
      id
      name
      serializedConfig
    }
  }' \
  '{"code": "postgres"}'
SCRIPT

返回模板的idserializedConfig,用于部署。

步骤2:部署模板

bash <<'SCRIPT'
${CLAUDE_PLUGIN_ROOT}/skills/lib/railway-api.sh \
  'mutation deployTemplate($input: TemplateDeployV2Input!) {
    templateDeployV2(input: $input) {
      projectId
      workflowId
    }
  }' \
  '{
    "input": {
      "templateId": "TEMPLATE_ID",
      "serializedConfig": SERIALIZED_CONFIG,
      "projectId": "PROJECT_ID",
      "environmentId": "ENVIRONMENT_ID",
      "workspaceId": "WORKSPACE_ID"
    }
  }'
SCRIPT

重要: serializedConfig是从模板查询中获取的确切对象,不是字符串。

连接到数据库

部署后,其他服务使用引用变量连接。

有关完整的变量引用语法和连接模式,参见variables.md

后端服务(服务器端)

使用私有/内部URL进行服务器间通信:

数据库 变量引用
PostgreSQL ${{Postgres.DATABASE_URL}}
Redis ${{Redis.REDIS_URL}}
MySQL ${{MySQL.MYSQL_URL}}
MongoDB ${{MongoDB.MONGO_URL}}

前端应用

重要: 前端在用户浏览器中运行,无法访问Railway的私有网络。它们必须使用公共URL或通过后端API。

对于从前端直接访问数据库(不推荐):

  • 使用公共URL变量(例如,${{MongoDB.MONGO_PUBLIC_URL}}
  • 需要启用TCP代理

更好模式:前端 → 后端API → 数据库

示例:添加PostgreSQL

bash <<'SCRIPT'
# 1. 获取上下文
railway status --json
# 提取project.id和environment.id

# 2. 获取工作区ID
${CLAUDE_PLUGIN_ROOT}/skills/lib/railway-api.sh \
  'query { project(id: "proj-id") { workspaceId } }' '{}'

# 3. 获取Postgres模板
${CLAUDE_PLUGIN_ROOT}/skills/lib/railway-api.sh \
  'query { template(code: "postgres") { id serializedConfig } }' '{}'

# 4. 部署模板
${CLAUDE_PLUGIN_ROOT}/skills/lib/railway-api.sh \
  'mutation deploy($input: TemplateDeployV2Input!) {
    templateDeployV2(input: $input) { projectId workflowId }
  }' \
  '{"input": {"templateId": "...", "serializedConfig": {...}, "projectId": "...", "environmentId": "...", "workspaceId": "..."}}'
SCRIPT

然后从另一个服务连接

使用railway-environment技能添加变量引用:

{
  "services": {
    "<backend-service-id>": {
      "variables": {
        "DATABASE_URL": { "value": "${{Postgres.DATABASE_URL}}" }
      }
    }
  }
}

响应

成功部署返回:

{
  "data": {
    "templateDeployV2": {
      "projectId": "e63baedb-e308-49e9-8c06-c25336f861c7",
      "workflowId": "deployTemplate/project/e63baedb-e308-49e9-8c06-c25336f861c7/xxx"
    }
  }
}

创建内容

每个数据库模板创建:

  • 一个带有数据库镜像的服务
  • 一个用于数据持久化的卷
  • 连接字符串的环境变量
  • TCP代理用于外部访问(如适用)

错误处理

错误 原因 解决方案
模板未找到 无效模板代码 使用:postgresredismysqlmongodb
权限被拒绝 用户缺乏访问权限 需要开发者角色或更高
项目未找到 无效项目ID 运行railway status --json获取正确ID

示例工作流程

“添加postgres并连接到服务器”

  1. 通过环境配置查询检查现有数据库
  2. 如果postgres存在:跳到步骤5
  3. 如果不存在:部署postgres模板(获取模板 → 部署)
  4. 等待部署完成
  5. 识别目标服务(如有多个则询问,或使用链接服务)
  6. 使用railway-environment技能暂存:DATABASE_URL: { "value": "${{Postgres.DATABASE_URL}}" }
  7. 应用更改

“添加postgres”

  1. 通过环境配置查询检查现有数据库
  2. 如果存在:“此项目中已存在Postgres”
  3. 如果不存在:部署postgres模板
  4. 通知用户:“Postgres已创建。使用DATABASE_URL=${{Postgres.DATABASE_URL}}连接服务。”

“将服务器连接到redis”

  1. 通过环境配置查询检查现有数据库
  2. 如果redis存在:通过环境技能连接REDIS_URL → 应用
  3. 如果没有redis:询问“未找到Redis。创建一个?”
    • 部署redis模板
    • 连接REDIS_URL → 应用

可组合性

  • 连接服务:使用railway-environment技能添加变量引用
  • 查看数据库服务:使用railway-service技能
  • 检查日志:使用railway-deployment技能