npx skills add https://github.com/railwayapp/railway-skills --skill new使用正确的配置创建 Railway 项目、服务和数据库。
检查 CLI 是否已安装:
command -v railway
如果未安装:
安装 Railway CLI:
npm install -g @railway/cli或
brew install railway
检查是否已认证:
railway whoami --json
如果未认证:
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
运行 railway login 进行认证。
railway status --json (在当前目录)
│
┌────┴────┐
已链接 未链接
│ │
│ 检查父目录:cd .. && railway status --json
│ │
│ ┌────┴────┐
│ 父目录 任何地方都
│ 已链接 未链接
│ │ │
│ 添加服务 railway list
│ 设置 rootDir │
│ 部署 ┌───┴───┐
│ │ 匹配? 不匹配
│ │ │ │
│ │ 链接 初始化新项目
└───────┴────────┴────────┘
│
用户需要服务?
│
┌─────┴─────┐
是 否
│ │
搭建代码 完成
│
railway add --service
│
按需配置
│
准备部署
railway status --json
默认行为:“部署到 railway” = 向已链接的项目添加服务。
除非用户明确说明,否则不要创建新项目:
像“flappy-bird”或“my-api”这样的应用名称是服务名称,而不是项目名称。
用户:“创建一个名为 foo 的 vite 应用并部署到 railway”
项目:已链接到“my-project”
错误:railway init -n foo
正确:railway add --service foo
Railway CLI 会向上遍历目录树以查找已链接的项目。如果你在子目录中:
cd .. && railway status --json
如果父目录已链接,你不需要初始化/链接子目录。而是:
railway add --service <名称>rootDirectory 为子目录路径railway up如果没有任何父目录链接,则进行初始化或链接流程。
如果已链接则跳过此部分 - 只需添加服务即可。
仅当没有项目链接时(直接或通过父目录)才使用此部分。
输出可能很大。在子代理中运行并仅提取:
id 和 nameid 和 namerailway list --json
railway initrailway linkrailway initrailway init -n <名称>
选项:
-n, --name - 项目名称(在非交互模式下省略则自动生成)-w, --workspace - 工作区名称或 ID(如果存在多个工作区则必需)如果用户有多个工作区,railway init 需要 --workspace 标志。
从以下命令获取工作区 ID:
railway whoami --json
workspaces 数组包含每个工作区的 { id, name }。
从用户输入推断工作区: 如果用户说“部署到 xxx 工作区”或“在 my-team 中创建项目”,则将名称与工作区数组匹配并使用相应的 ID:
# 用户说:“在我的个人工作区中创建一个项目”
railway whoami --json | jq '.workspaces[] | select(.name | test("personal"; "i"))'
# 使用匹配的 ID:railway init -n myapp --workspace <匹配的id>
railway link -p <项目>
选项:
-p, --project - 项目名称或 ID-e, --environment - 环境(默认:production)-s, --service - 要链接的服务-t, --team - 团队/工作区项目链接后,创建服务:
railway add --service <名称>
对于 GitHub 仓库源:创建一个空服务,然后调用 environment 技能通过暂存更改 API 配置源。不要使用 railway add --repo - 它需要 GitHub 应用集成,这通常会失败。
流程:
railway add --service my-apienvironment 技能设置 source.repo 和 source.branch参考 railpack.md 获取构建配置。参考 monorepo.md 获取 monorepo 模式。
静态站点(Vite、CRA、Astro static):
environment 技能设置 RAILPACK_STATIC_FILE_ROOTrailway variables CLI - 始终使用环境技能Node.js SSR(Next.js、Nuxt、Express):
start 脚本environment 技能设置 startCommandPython(FastAPI、Django、Flask):
requirements.txt 或 pyproject.toml 存在Go:
go.mod 存在关键决策: 根目录与自定义命令。
隔离式 monorepo(应用不共享代码):
/frontend)共享式 monorepo(TypeScript 工作区、共享包):
pnpm --filter <包> buildnpm run build --workspace=packages/<包>yarn workspace <包> buildturbo run build --filter=<包>详细模式请参阅 monorepo.md。
分析代码库以确保与 Railway 兼容。
检查现有项目文件:
package.json → Node.js 项目requirements.txt、pyproject.toml → Python 项目go.mod → Go 项目Cargo.toml → Rust 项目index.html → 静态站点Monorepo 检测:
pnpm-workspace.yaml → pnpm 工作区(共享式 monorepo)workspaces 字段的 package.json → npm/yarn 工作区(共享式 monorepo)turbo.json → Turborepo(共享式 monorepo)package.json 但无工作区配置的子目录 → 隔离式 monorepo如果不存在代码,请从 railpack.md 建议最小模式:
静态站点:
在根目录创建一个
index.html文件。
Vite React:
npm create vite@latest . -- --template react
Astro:
npm create astro@latest
Python FastAPI:
创建包含 FastAPI 应用的
main.py和包含依赖项的requirements.txt。
Go:
创建包含监听
PORT环境变量的 HTTP 服务器的main.go。
对于添加数据库(Postgres、Redis、MySQL、MongoDB),请使用 database 技能。
database 技能处理:
deploy 技能推送代码environment 技能(buildCommand、startCommand)domain 技能status 技能service 技能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 站点并部署到 railway”
1. 检查状态 → 未链接
2. railway init -n my-site
3. 指导:创建 index.html
4. railway add --service my-site
5. 无需配置(根目录下的 index.html 自动检测)
6. 使用 deploy 技能:railway up
7. 使用 domain 技能获取公共 URL
用户:“创建一个 vite react 服务”
1. 检查状态 → 已链接(或先初始化/链接)
2. 搭建:npm create vite@latest frontend -- --template react
3. railway add --service frontend
4. 无需配置(Vite dist 输出自动检测)
5. 使用 deploy 技能:railway up
用户:“向我的项目添加一个 python api”
1. 检查状态 → 已链接
2. 指导:创建包含 FastAPI 的 main.py,requirements.txt
3. railway add --service api
4. 无需配置(FastAPI 自动检测)
5. 使用 deploy 技能
用户:“连接到我的后端项目并添加一个 worker 服务”
1. railway list --json → 找到“backend”
2. railway link -p backend
3. railway add --service worker
4. 基于 worker 类型指导设置
用户:“部署到 railway”
1. railway status → 未链接
2. railway list → 有项目
3. 目录是“my-app”,找到项目“my-app”
4. 询问:“找到现有项目‘my-app’。链接到它还是创建新项目?”
5. 用户:“链接”
6. railway link -p my-app
7. 询问:“为此代码创建服务吗?”
用户:“在 frontend 目录中创建一个静态站点”
1. 检查:/frontend 有自己的 package.json,无工作区配置
2. 这是隔离式 monorepo → 使用根目录
3. railway add --service frontend
4. 调用 environment 技能设置 rootDirectory:/frontend
5. 设置监视路径:/frontend/**
用户:“向这个 turborepo 添加一个新的 api 包”
1. 检查:存在 turbo.json,存在 pnpm-workspace.yaml
2. 这是共享式 monorepo → 使用自定义命令,**不要**设置根目录
3. 指导:创建包含 package.json 的 packages/api
4. railway add --service api
5. 调用 environment 技能设置 buildCommand 和 startCommand(**不要**设置 rootDirectory)
6. 设置监视路径:/packages/api/**,/packages/shared/**
用户:“将 backend 包部署到 railway”
1. 检查:存在 pnpm-workspace.yaml → 共享式 monorepo
2. railway add --service backend
3. 调用 environment 技能设置 buildCommand 和 startCommand
4. 为 backend 和任何共享依赖设置监视路径
用户:“在我的 my-app 目录中创建一个 vite 应用并部署到 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. 调用 environment 技能设置 rootDirectory:/my-app
8. 从根目录部署:railway up
每周安装
786
仓库
GitHub Stars
209
首次出现
2026年1月20日
安全审计
安装于
opencode662
codex651
gemini-cli615
github-copilot592
claude-code591
amp539
Create Railway projects, services, and databases with proper configuration.
Check CLI installed:
command -v railway
If not installed:
Install Railway CLI:
npm install -g @railway/clior
brew install railway
Check authenticated:
railway whoami --json
If not authenticated:
Run
railway loginto authenticate.
railway status --json (in current dir)
│
┌────┴────┐
Linked Not Linked
│ │
│ Check parent: cd .. && railway status --json
│ │
│ ┌────┴────┐
│ Parent Not linked
│ Linked anywhere
│ │ │
│ Add service railway list
│ Set rootDir │
│ Deploy ┌───┴───┐
│ │ Match? No match
│ │ │ │
│ │ Link Init new
└───────┴────────┴────────┘
│
User wants service?
│
┌─────┴─────┐
Yes No
│ │
Scaffold code Done
│
railway add --service
│
Configure if needed
│
Ready to deploy
railway status --json
Default behavior : "deploy to railway" = add a service to the linked project.
Do NOT create a new project unless user EXPLICITLY says:
App names like "flappy-bird" or "my-api" are SERVICE names, not project names.
User: "create a vite app called foo and deploy to railway"
Project: Already linked to "my-project"
WRONG: railway init -n foo
RIGHT: railway add --service foo
Railway CLI walks up the directory tree to find a linked project. If you're in a subdirectory:
cd .. && railway status --json
If parent is linked , you don't need to init/link the subdirectory. Instead:
railway add --service <name>rootDirectory to subdirectory path via environment skillrailway upIf no parent is linked , proceed with init or link flow.
Skip this section if already linked - just add a service instead.
Only use this section when NO project is linked (directly or via parent).
The output can be large. Run in a subagent and extract only:
Project id and name
Workspace id and name
railway list --json
railway initrailway linkrailway initrailway init -n <name>
Options:
-n, --name - Project name (auto-generated if omitted in non-interactive mode)-w, --workspace - Workspace name or ID (required if multiple workspaces exist)If the user has multiple workspaces, railway init requires the --workspace flag.
Get workspace IDs from:
railway whoami --json
The workspaces array contains { id, name } for each workspace.
Inferring workspace from user input: If user says "deploy into xxx workspace" or "create project in my-team", match the name against the workspaces array and use the corresponding ID:
# User says: "create a project in my personal workspace"
railway whoami --json | jq '.workspaces[] | select(.name | test("personal"; "i"))'
# Use the matched ID: railway init -n myapp --workspace <matched-id>
railway link -p <project>
Options:
-p, --project - Project name or ID-e, --environment - Environment (default: production)-s, --service - Service to link-t, --team - Team/workspaceAfter project is linked, create a service:
railway add --service <name>
For GitHub repo sources : Create an empty service, then invoke the environment skill to configure the source via staged changes API. Do NOT use railway add --repo - it requires GitHub app integration which often fails.
Flow:
railway add --service my-apienvironment skill to set source.repo and source.branchReference railpack.md for build configuration. Reference monorepo.md for monorepo patterns.
Static site (Vite, CRA, Astro static):
environment skill to set RAILPACK_STATIC_FILE_ROOTrailway variables CLI - always use the environment skillNode.js SSR (Next.js, Nuxt, Express):
start script exists in package.jsonenvironment skill to set startCommandPython (FastAPI, Django, Flask):
requirements.txt or pyproject.toml existsGo:
go.mod existsCritical decision: Root directory vs custom commands.
Isolated monorepo (apps don't share code):
/frontend)Shared monorepo (TypeScript workspaces, shared packages):
pnpm --filter <package> buildnpm run build --workspace=packages/<package>yarn workspace <package> buildturbo run build --filter=<package>See monorepo.md for detailed patterns.
Analyze the codebase to ensure Railway compatibility.
Check for existing project files:
package.json → Node.js projectrequirements.txt, pyproject.toml → Python projectgo.mod → Go projectCargo.toml → Rust projectindex.html → Static siteMonorepo detection:
pnpm-workspace.yaml → pnpm workspace (shared monorepo)package.json with workspaces field → npm/yarn workspace (shared monorepo)turbo.json → Turborepo (shared monorepo)package.json but no workspace config → isolated monorepoIf no code exists, suggest minimal patterns from railpack.md:
Static site:
Create an
index.htmlfile in the root directory.
Vite React:
npm create vite@latest . -- --template react
Astro:
npm create astro@latest
Python FastAPI:
Create
main.pywith FastAPI app andrequirements.txtwith dependencies.
Go:
Create
main.gowith HTTP server listening onPORTenv var.
For adding databases (Postgres, Redis, MySQL, MongoDB), use the database skill.
The database skill handles:
deploy skill to push codeenvironment skill (buildCommand, startCommand)domain skillstatus skillservice skillRailway CLI not installed. Install with:
npm install -g @railway/cli
or
brew install railway
Not logged in to Railway. Run: railway login
No workspaces found. Create one at railway.com or verify authentication.
Project name already exists. Either:
- Link to existing: railway link -p <name>
- Use different name: railway init -n <other-name>
Service name already exists in this project. Use a different name:
railway add --service <other-name>
User: "create a simple html site and deploy to railway"
1. Check status → not linked
2. railway init -n my-site
3. Guide: create index.html
4. railway add --service my-site
5. No config needed (index.html in root auto-detected)
6. Use deploy skill: railway up
7. Use domain skill for public URL
User: "create a vite react service"
1. Check status → linked (or init/link first)
2. Scaffold: npm create vite@latest frontend -- --template react
3. railway add --service frontend
4. No config needed (Vite dist output auto-detected)
5. Use deploy skill: railway up
User: "add a python api to my project"
1. Check status → linked
2. Guide: create main.py with FastAPI, requirements.txt
3. railway add --service api
4. No config needed (FastAPI auto-detected)
5. Use deploy skill
User: "connect to my backend project and add a worker service"
1. railway list --json → find "backend"
2. railway link -p backend
3. railway add --service worker
4. Guide setup based on worker type
User: "deploy to railway"
1. railway status → not linked
2. railway list → has projects
3. Directory is "my-app", found project "my-app"
4. Ask: "Found existing project 'my-app'. Link to it or create new?"
5. User: "link"
6. railway link -p my-app
7. Ask: "Create a service for this code?"
User: "create a static site in the frontend directory"
1. Check: /frontend has its own package.json, no workspace config
2. This is isolated monorepo → use root directory
3. railway add --service frontend
4. Invoke environment skill to set rootDirectory: /frontend
5. Set watch paths: /frontend/**
User: "add a new api package to this turborepo"
1. Check: turbo.json exists, pnpm-workspace.yaml exists
2. This is shared monorepo → use custom commands, NOT root directory
3. Guide: create packages/api with package.json
4. railway add --service api
5. Invoke environment skill to set buildCommand and startCommand (do NOT set rootDirectory)
6. Set watch paths: /packages/api/**, /packages/shared/**
User: "deploy the backend package to railway"
1. Check: pnpm-workspace.yaml exists → shared monorepo
2. railway add --service backend
3. Invoke environment skill to set buildCommand and startCommand
4. Set watch paths for backend + any shared deps
User: "create a vite app in my-app directory and deploy to railway"
CWD: ~/projects/my-project/my-app (parent already linked to "my-project")
1. Check status in my-app → not linked
2. Check parent: cd .. && railway status → IS linked to "my-project"
3. DON'T init/link the subdirectory
4. Scaffold: bun create vite my-app --template react-ts
5. cd my-app && bun install
6. railway add --service my-app
7. Invoke environment skill to set rootDirectory: /my-app
8. Deploy from root: railway up
Weekly Installs
786
Repository
GitHub Stars
209
First Seen
Jan 20, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
opencode662
codex651
gemini-cli615
github-copilot592
claude-code591
amp539