在本机 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_SECRETENCRYPTION_KEY(32 字符)
- 生成 docker-compose.yml

执行后请向我确认生成的 docker-compose.yml 里以下内容:
- JWT_SECRETENCRYPTION_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 不执行)

  1. **登录管理后台**:浏览器打开 `http://localhost:3000/web`(注意是 `/web` 路径),用 `data/init.json` 里的账号密码登录
  1. **添加 Claude 账号(OAuth 授权)**:「Claude 账户」→「添加账户」→「生成授权链接」→ 新页面完成 Claude 登录授权(国内网络这步可能需要科学上网)→ 复制 Authorization Code 粘回 CRS 完成绑定
  1. **生成 API Key**:「API Keys」→「创建新 Key」,记下 `cr_` 开头的 Key
  1. **配置工具走 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 而非你的订阅。

已知注意事项(排坑清单)

  1. **密钥安全**:JWT_SECRET 和 ENCRYPTION_KEY 必须本机随机生成(crs-compose.sh 自动处理)。绝不要照抄网上教程或别人 compose 文件里的密钥值
  1. **models 列表硬编码**:CRS 的 `/api/v1/models` 返回镜像内硬编码的静态列表。Anthropic 新模型可能不在列表里,Claude Code 会报 "model not found"——已知限制,不影响列表内模型
  1. **环境变量劫持**:`~/.zshrc` 全局 export 会让所有 session 走 CRS。推荐项目级 `.env` 或 direnv
  1. **数据持久化**:`data/`(账号绑定、API key)、`logs/`、`redis_data/` 都是本地目录挂载。删目录 = 丢配置;`docker compose down + up` 不丢数据
  1. **更新方式**:`docker compose pull && docker compose up -d`,更新前备份 `data/`

最小操作顺序

  1. 建目录,跑官方 crs-compose.sh 生成随机密钥的 compose 文件
  1. 拉镜像,确认版本 ≥ v1.1.249(认证绕过漏洞门槛)
  1. `docker compose up -d`,等 healthy
  1. `curl /health` 验证
  1. 读 `data/init.json` 拿管理员账号
  1. Web 后台绑 Claude 账号(OAuth)、发 API Key
  1. 客户端按项目级配置 `ANTHROPIC_BASE_URL` + `AUTH_TOKEN`

© Ying Bun 2021 - 2026