name: railway-new description: 使用正确的配置创建Railway项目、服务和数据库。当用户说"setup"、“deploy to railway”、“initialize”、“create project”、"create service"或想从GitHub部署时使用。处理初始设置和向现有项目添加服务。对于数据库,请使用railway-railway-database技能。 version: 1.0.0 author: Railway license: MIT tags: [Railway, Project, Service, Setup, Initialize, Deploy, Infrastructure, Scaffolding] dependencies: [railway-cli] allowed-tools: Bash(railway:), Bash(which:), Bash(command:), Bash(npm:), Bash(npx:*)
新项目 / 服务 / 数据库
使用正确的配置创建Railway项目、服务和数据库。
何时使用
- 用户说"deploy to railway"(如果已链接则添加服务,否则初始化)
- 用户说"create a railway project"、“init”、“new project”(明确新项目)
- 用户说"link to railway"、“connect to railway”
- 用户说"create a service"、“add a backend”、“new api service”
- 用户说"create a vite app"、“create a react website”、“make a python api”
- 用户说"deploy from github.com/user/repo"、"create service from this repo"
- 用户说"add postgres"、“add a database”、“add redis”、“add mysql”、“add mongo”
- 用户说"connect to postgres"、“wire up the database”、“connect my api to redis”
- 用户说"add postgres and connect to the server"
- 设置代码 + Railway服务一起
前提条件
检查CLI是否安装:
command -v railway
如果未安装:
安装Railway CLI:
npm install -g @railway/cli或
brew install railway
检查是否认证:
railway whoami --json
如果未认证:
运行
railway login进行认证。
决策流程
railway status --json(在当前目录)
│
┌────┴────┐
已链接 未链接
│ │
│ 检查父目录:cd .. && railway status --json
│ │
│ ┌────┴────┐
│ 父目录 在任何地方
│ 已链接 都未链接
│ │ │
│ 添加服务 railway list
│ 设置rootDir │
│ 部署 ┌───┴───┐
│ │ 匹配? 不匹配
│ │ │ │
│ │ 链接 初始化新项目
└───────┴────────┴────────┘
│
用户需要服务吗?
│
┌─────┴─────┐
是 否
│ │
生成代码 完成
│
railway add --service
│
如果需要则配置
│
准备部署
检查当前状态
railway status --json
- 如果已链接:向现有项目添加服务(见下文)
- 如果未链接:检查父目录是否已链接(见下文)
当已链接时
默认行为:“deploy to railway” = 向链接的项目添加服务。
除非用户明确说,否则不要创建新项目:
- “new project”、“create a project”、“init a project”
- “separate project”、“different project”
应用名称如"flappy-bird"或"my-api"是服务名称,不是项目名称。
用户:"create a vite app called foo and deploy to railway"
项目:已链接到"my-project"
错误:railway init -n foo
正确:railway add --service foo
父目录链接
Railway CLI会向上遍历目录树以找到链接的项目。如果你在子目录中:
cd .. && railway status --json
如果父目录已链接,你不需要初始化/链接子目录。相反:
- 创建服务:
railway add --service <名称> - 通过环境技能设置
rootDirectory为子目录路径 - 从根目录部署:
railway up
如果没有父目录链接,继续初始化或链接流程。
初始化与链接决策
如果已链接则跳过此部分 – 只需添加服务。
仅当没有项目链接时使用此部分(直接或通过父目录)。
检查用户项目
输出可能很大。在子代理中运行并仅提取:
- 项目
id和name - 工作空间
id和name
railway list --json
决策逻辑
- 用户明确说"new project" → 使用
railway init - 用户命名现有项目 → 使用
railway link - 目录名称匹配现有项目 → 询问:链接现有或创建新?
- 没有匹配项目 → 使用
railway init - 模糊 → 询问用户
创建新项目
railway init -n <名称>
选项:
-n, --name– 项目名称(在非交互模式下省略则自动生成)-w, --workspace– 工作空间名称或ID(如果存在多个工作空间则必需)
多个工作空间
如果用户有多个工作空间,railway init需要--workspace标志。
从以下获取工作空间ID:
railway whoami --json
workspaces数组包含每个工作空间的{ id, name }。
从用户输入推断工作空间: 如果用户说"deploy into xxx workspace"或"create project in my-team",将名称与工作空间数组匹配并使用相应ID:
# 用户说:"create a project in my personal workspace"
railway whoami --json | jq '.workspaces[] | select(.name | test("personal"; "i"))'
# 使用匹配的ID:railway init -n myapp --workspace <matched-id>
链接现有项目
railway link -p <项目>
选项:
-p, --project– 项目名称或ID-e, --environment– 环境(默认:production)-s, --service– 要链接的服务-t, --team– 团队/工作空间
创建服务
项目链接后,创建服务:
railway add --service <名称>
对于GitHub仓库源:创建空服务,然后调用railway-environment技能通过暂存更改API配置源。不要使用railway add --repo – 它需要GitHub应用集成,通常失败。
流程:
railway add --service my-api- 调用railway-environment技能设置
source.repo和source.branch - 应用更改以触发部署
基于项目类型配置
参考railpack.md获取构建配置。 参考monorepo.md获取单仓库模式。
静态站点(Vite、CRA、Astro static):
- Railpack自动检测常见输出目录(dist、build)
- 如果非标准输出目录:调用railway-environment技能设置
RAILPACK_STATIC_FILE_ROOT - 不要使用
railway variablesCLI – 始终使用环境技能
Node.js SSR(Next.js、Nuxt、Express):
- 验证
start脚本存在于package.json中 - 如果需要自定义启动:调用railway-environment技能设置
startCommand
Python(FastAPI、Django、Flask):
- 验证
requirements.txt或pyproject.toml存在 - Railpack自动检测,通常无需配置
Go:
- 验证
go.mod存在 - 自动检测,无需配置
单仓库配置
关键决策:根目录与自定义命令。
隔离单仓库(应用不共享代码):
- 设置根目录为应用的子目录(例如,
/frontend) - 构建期间仅该目录的代码可用
共享单仓库(TypeScript工作空间、共享包):
- 不要设置根目录
- 设置自定义构建/启动命令以过滤包:
- pnpm:
pnpm --filter <包> build - npm:
npm run build --workspace=packages/<包> - yarn:
yarn workspace <包> build - Turborepo:
turbo run build --filter=<包>
- pnpm:
- 设置监视路径以防止不必要的重建
详见monorepo.md获取详细模式。
项目设置指导
分析代码库以确保Railway兼容性。
分析代码库
检查现有项目文件:
package.json→ Node.js项目requirements.txt、pyproject.toml→ Python项目go.mod→ Go项目Cargo.toml→ Rust项目index.html→ 静态站点- 无 → 指导生成
单仓库检测:
pnpm-workspace.yaml→ pnpm工作空间(共享单仓库)package.json带有workspaces字段 → npm/yarn工作空间(共享单仓库)turbo.json→ Turborepo(共享单仓库)- 多个子目录带有单独的
package.json但无工作空间配置 → 隔离单仓库
生成提示
如果无代码存在,从railpack.md建议最小模式:
静态站点:
在根目录创建
index.html文件。
Vite React:
npm create vite@latest . -- --template react
Astro:
npm create astro@latest
Python FastAPI:
创建
main.py带FastAPI应用和requirements.txt带依赖。
Go:
创建
main.go带HTTP服务器监听PORT环境变量。
数据库
对于添加数据库(Postgres、Redis、MySQL、MongoDB),使用railway-railway-database技能。
railway-railway-database技能处理:
- 创建数据库服务
- 连接变量引用
- 将服务连接到数据库
组合性
- 服务创建后:使用railway-deploy技能推送代码
- 高级配置:使用railway-environment技能(buildCommand、startCommand)
- 域名:使用railway-domain技能
- 状态检查:使用railway-status技能
- 服务操作(重命名、删除、状态):使用railway-service技能
错误处理
CLI未安装
Railway CLI未安装。安装方法:
npm install -g @railway/cli
或
brew install railway
未认证
未登录Railway。运行:railway login
无工作空间
未找到工作空间。在railway.com创建或验证认证。
项目名称已存在
项目名称已存在。选择:
- 链接现有:railway link -p <名称>
- 使用不同名称:railway init -n <其他名称>
服务名称已存在
服务名称已在此项目中存在。使用不同名称:
railway add --service <其他名称>
示例
创建HTML静态站点
用户:"create a simple html site and deploy to railway"
1. 检查状态 → 未链接
2. railway init -n my-site
3. 指导:创建index.html
4. railway add --service my-site
5. 无需配置(index.html在根目录自动检测)
6. 使用部署技能:railway up
7. 使用域名技能获取公共URL
创建Vite React服务
用户:"create a vite react service"
1. 检查状态 → 已链接(或先初始化/链接)
2. 生成:npm create vite@latest frontend -- --template react
3. railway add --service frontend
4. 无需配置(Vite dist输出自动检测)
5. 使用部署技能:railway up
向项目添加Python API
用户:"add a python api to my project"
1. 检查状态 → 已链接
2. 指导:创建main.py带FastAPI,requirements.txt
3. railway add --service api
4. 无需配置(FastAPI自动检测)
5. 使用部署技能
链接并添加服务
用户:"connect to my backend project and add a worker service"
1. railway list --json → 找到"backend"
2. railway link -p backend
3. railway add --service worker
4. 基于工作类型指导设置
部署到Railway(模糊)
用户:"deploy to railway"
1. railway status → 未链接
2. railway list → 有项目
3. 目录是"my-app",找到项目"my-app"
4. 询问:"找到现有项目'my-app'。链接到它还是创建新?"
5. 用户:"link"
6. railway link -p my-app
7. 询问:"为此代码创建服务吗?"
向隔离单仓库添加服务
用户:"create a static site in the frontend directory"
1. 检查:/frontend有自己的package.json,无工作空间配置
2. 这是隔离单仓库 → 使用根目录
3. railway add --service frontend
4. 调用环境技能设置rootDirectory:/frontend
5. 设置监视路径:/frontend/**
向TypeScript单仓库添加服务
用户:"add a new api package to this turborepo"
1. 检查:turbo.json存在,pnpm-workspace.yaml存在
2. 这是共享单仓库 → 使用自定义命令,不是根目录
3. 指导:创建packages/api带package.json
4. railway add --service api
5. 调用环境技能设置buildCommand和startCommand(不要设置rootDirectory)
6. 设置监视路径:/packages/api/**、/packages/shared/**
部署现有pnpm工作空间包
用户:"deploy the backend package to railway"
1. 检查:pnpm-workspace.yaml存在 → 共享单仓库
2. railway add --service backend
3. 调用环境技能设置buildCommand和startCommand
4. 设置后端和任何共享依赖的监视路径
部署链接项目的子目录
用户:"create a vite app in my-app directory and deploy to railway"
CWD:~/projects/my-project/my-app(父目录已链接到"my-project")
1. 在my-app检查状态 → 未链接
2. 检查父目录:cd .. && railway status → 已链接到"my-project"
3. 不要初始化/链接子目录
4. 生成:bun create vite my-app --template react-ts
5. cd my-app && bun install
6. railway add --service my-app
7. 调用环境技能设置rootDirectory:/my-app
8. 从根目录部署:railway up