在本机 Docker 部署 Claude Relay Service(CRS)——把 runbook 写成给 AI 的 prompt
date
Jul 3, 2026
slug
crs-docker-deploy-ai-runbook
status
Published
summary
自托管 Claude API 中转 CRS 的 Docker 部署——runbook 直接写成给 AI 部署助手的 prompt
tags
claude
docker
self-hosted
ai-ops
runbook
type
Post
URL
结论:CRS(Claude Relay Service)是一个自托管的 Claude API 中转服务。这篇的部署文档有个特别之处——**整篇 runbook 直接写成给 AI 部署助手(Codex/Claude Code)的 prompt**,丢给 AI 逐步执行,人只在关键节点确认。这是"AI 时代运维文档"的一种新写法:文档即提示词。
为什么这么写
传统 runbook 给人看,AI 时代的 runbook 可以直接给 AI 执行。写法上的几个讲究:
- 开头声明角色和纪律:"每一步做完把输出贴给我,遇到异常停下等我确认,不要自作主张跳过安全检查"
- 安全检查写成硬门槛("如果版本低于 X,停下告诉我"),AI 不会像人一样嫌麻烦跳过
- 明确分界:哪些步骤 AI 做,哪些人手动做(浏览器 OAuth 交互 AI 不碰)
背景
- CRS = Claude Relay Service,自托管 Claude API 中转
- 官方仓库:https://github.com/Wei-Shaw/claude-relay-service
- 官方镜像:`weishaw/claude-relay-service:latest`
- 部署走 Docker 路线(不是源码 npm 路线)
给 AI 的部署 prompt(可直接复制使用)
你是我的部署助手。请按下面步骤在本机用 Docker 部署 CRS。每一步做完把输出贴给我,遇到异常停下等我确认,不要自作主张跳过安全检查。
## Step 1:创建工作目录
mkdir -p ~/crs && cd ~/crs
## Step 2:下载官方部署脚本,生成带随机密钥的 docker-compose.yml
curl -fsSL https://pincc.ai/crs-compose.sh -o crs-compose.sh
chmod +x crs-compose.sh
./crs-compose.sh
crs-compose.sh 会自动:
- 生成随机的 JWT_SECRET 和 ENCRYPTION_KEY(32 字符)
- 生成 docker-compose.yml
执行后请向我确认生成的 docker-compose.yml 里以下内容:
- JWT_SECRET 和 ENCRYPTION_KEY 确实是随机值(不是占位符或空值)
- 数据挂载用的是本地目录(./logs:/app/logs、./data:/app/data、./redis_data:/data),不是匿名 Docker volume
## Step 3:验证镜像版本(安全要求)
⚠️ 安全公告:CRS v1.1.248 及以下存在管理员认证绕过漏洞。部署后必须确认版本 ≥ v1.1.249。
docker compose pull
docker image inspect weishaw/claude-relay-service:latest --format '{{json .Config.Labels}}' | grep -o '"version":"[^"]*"'
如果版本低于 1.1.249,停下告诉我,不要继续部署。
## Step 4:启动服务
docker compose up -d
## Step 5:等待健康检查通过
docker compose ps
两个核心容器(claude-relay 和 redis)都应为 healthy,最多等 60 秒。
未 healthy 则贴日志:docker compose logs --tail=50 claude-relay
## Step 6:验证服务可访问
curl -f http://localhost:3000/health
## Step 7:获取自动生成的管理员账号
cat ./data/init.json
把这个文件内容贴给我,然后停下。部署完成后的手动配置(浏览器交互,AI 不执行)
- **登录管理后台**:浏览器打开 `http://localhost:3000/web`(注意是 `/web` 路径),用 `data/init.json` 里的账号密码登录
- **添加 Claude 账号(OAuth 授权)**:「Claude 账户」→「添加账户」→「生成授权链接」→ 新页面完成 Claude 登录授权(国内网络这步可能需要科学上网)→ 复制 Authorization Code 粘回 CRS 完成绑定
- **生成 API Key**:「API Keys」→「创建新 Key」,记下 `cr_` 开头的 Key
- **配置工具走 CRS relay**,以 Claude Code 为例:
export ANTHROPIC_BASE_URL="http://127.0.0.1:3000/api/"
export ANTHROPIC_AUTH_TOKEN="<你的 cr_ 开头的 Key>"⚠️ 建议只对特定项目/session 设置,**不要写进 ~/.zshrc 全局生效**——否则会劫持所有 Claude Code 走 CRS 而非你的订阅。
已知注意事项(排坑清单)
- **密钥安全**:JWT_SECRET 和 ENCRYPTION_KEY 必须本机随机生成(crs-compose.sh 自动处理)。绝不要照抄网上教程或别人 compose 文件里的密钥值
- **models 列表硬编码**:CRS 的 `/api/v1/models` 返回镜像内硬编码的静态列表。Anthropic 新模型可能不在列表里,Claude Code 会报 "model not found"——已知限制,不影响列表内模型
- **环境变量劫持**:`~/.zshrc` 全局 export 会让所有 session 走 CRS。推荐项目级 `.env` 或 direnv
- **数据持久化**:`data/`(账号绑定、API key)、`logs/`、`redis_data/` 都是本地目录挂载。删目录 = 丢配置;`docker compose down + up` 不丢数据
- **更新方式**:`docker compose pull && docker compose up -d`,更新前备份 `data/`
最小操作顺序
- 建目录,跑官方 crs-compose.sh 生成随机密钥的 compose 文件
- 拉镜像,确认版本 ≥ v1.1.249(认证绕过漏洞门槛)
- `docker compose up -d`,等 healthy
- `curl /health` 验证
- 读 `data/init.json` 拿管理员账号
- Web 后台绑 Claude 账号(OAuth)、发 API Key
- 客户端按项目级配置 `ANTHROPIC_BASE_URL` + `AUTH_TOKEN`