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:*→ Postgresghcr.io/railway/redis*或redis:*→ Redisghcr.io/railway/mysql*或mysql:*→ MySQLghcr.io/railway/mongo*或mongo:*→ MongoDB
可用数据库
| 数据库 | 模板代码 |
|---|---|
| PostgreSQL | postgres |
| Redis | redis |
| MySQL | mysql |
| MongoDB | mongodb |
先决条件
获取项目上下文:
railway status --json
提取:
id- 项目IDenvironments.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
返回模板的id和serializedConfig,用于部署。
步骤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代理用于外部访问(如适用)
错误处理
| 错误 | 原因 | 解决方案 |
|---|---|---|
| 模板未找到 | 无效模板代码 | 使用:postgres、redis、mysql、mongodb |
| 权限被拒绝 | 用户缺乏访问权限 | 需要开发者角色或更高 |
| 项目未找到 | 无效项目ID | 运行railway status --json获取正确ID |
示例工作流程
“添加postgres并连接到服务器”
- 通过环境配置查询检查现有数据库
- 如果postgres存在:跳到步骤5
- 如果不存在:部署postgres模板(获取模板 → 部署)
- 等待部署完成
- 识别目标服务(如有多个则询问,或使用链接服务)
- 使用
railway-environment技能暂存:DATABASE_URL: { "value": "${{Postgres.DATABASE_URL}}" } - 应用更改
“添加postgres”
- 通过环境配置查询检查现有数据库
- 如果存在:“此项目中已存在Postgres”
- 如果不存在:部署postgres模板
- 通知用户:“Postgres已创建。使用
DATABASE_URL=${{Postgres.DATABASE_URL}}连接服务。”
“将服务器连接到redis”
- 通过环境配置查询检查现有数据库
- 如果redis存在:通过环境技能连接REDIS_URL → 应用
- 如果没有redis:询问“未找到Redis。创建一个?”
- 部署redis模板
- 连接REDIS_URL → 应用
可组合性
- 连接服务:使用
railway-environment技能添加变量引用 - 查看数据库服务:使用
railway-service技能 - 检查日志:使用
railway-deployment技能