本地 Claude Code + CCR + GLM 部署工作流
> v1.0 · 2026-04-26 · 基于实战复盘(cnbnn/claude-code 本地化)
> 覆盖:从零部署 → 验证 → systemd 保活 → OpenClaw 集成
一、架构
用户/OpenClaw → claude-code-glm (wrapper)
→ claude CLI (Anthropic 官方)
→ CCR (claude-code-router, localhost:3456)
→ GLM API (open.bigmodel.cn)
- Claude Code CLI:Anthropic 官方编码 Agent,支持文件读写、命令执行、PR 操作
- CCR:协议转换代理,将 Anthropic Messages API 转为 OpenAI Chat Completions
- 自有大模型:GLM-5.1 或任何 OpenAI 兼容 API
二、前置条件
| 条件 | 说明 |
|---|---|
| Node.js ≥ 22 | Claude Code CLI 依赖 |
| OpenAI 兼容 API | 需要 base_url + api_key |
| 内存 ≥ 4GB | Claude CLI 运行时约 200-500MB |
| 非必需:CNB NPC 仓库 | 可 fork 已有 NPC 作为 prompt 模板 |
三、安装步骤
Step 1: 安装 Claude Code CLI + CCR
sudo npm install -g @anthropic-ai/claude-code@latest
sudo npm install -g @musistudio/claude-code-router@latest
claude --version # 确认 ≥ 2.1
ccr -v # 确认 ≥ 2.0
Step 2: 配置 CCR
mkdir -p ~/.claude-code-router
cat > ~/.claude-code-router/config.json << 'EOF'
{
"APIKEY": "ccr-local",
"LOG": true,
"LOG_LEVEL": "info",
"API_TIMEOUT_MS": 600000,
"NON_INTERACTIVE_MODE": true,
"Providers": [{
"name": "glm",
"api_base_url": "https://open.bigmodel.cn/api/coding/paas/v4/chat/completions",
"api_key": "<你的API_KEY>",
"models": ["glm-5.1"]
}],
"Router": {
"default": "glm,glm-5.1",
"background": "glm,glm-5.1",
"think": "glm,glm-5.1"
}
}
EOF
配置要点:
- api_base_url 必须包含 /chat/completions 后缀
- 智谱 coding 专用端点:https://open.bigmodel.cn/api/coding/paas/v4/chat/completions
- 通用端点:https://open.bigmodel.cn/api/paas/v4/chat/completions
- APIKEY 是 CCR 本地认证 token,任意非空字符串即可
Step 3: 创建 wrapper 脚本
sudo tee /usr/local/bin/claude-code-glm > /dev/null << 'WRAPPER'
#!/bin/bash
set -e
export ANTHROPIC_AUTH_TOKEN=ccr-local
export ANTHROPIC_BASE_URL=http://127.0.0.1:3456
export NO_PROXY=127.0.0.1
# 确保 CCR 运行中
if ! ss -tlnp | grep -q ':3456'; then
ccr start &
sleep 3
fi
exec claude --dangerously-skip-permissions "$@"
WRAPPER
sudo chmod +x /usr/local/bin/claude-code-glm
Step 4: 验证
# 确保 CCR 启动
ccr start &
sleep 3
ss -tlnp | grep 3456 # 确认端口监听
# 测试调用(需后台运行,约 15-20 秒返回)
cd /tmp && claude-code-glm -p "1+1=?" --output-format text --max-turns 1 > /tmp/test.txt 2>&1 &
sleep 20 && cat /tmp/test.txt
# 预期输出:2
Step 5: systemd 保活
sudo tee /etc/systemd/system/ccr.service > /dev/null << 'EOF'
[Unit]
Description=Claude Code Router (CCR) - GLM proxy
After=network.target
[Service]
Type=simple
User=ubuntu
Environment=HOME=/home/ubuntu
ExecStart=/usr/bin/ccr start
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable ccr
sudo systemctl start ccr
四、OpenClaw 集成(exec 调用)
ACP 模式(acpx)需要 Claude 官方认证,CCR 代理无法绕过。使用 exec 直接调用 wrapper:
# 基本调用
cd <项目目录> && claude-code-glm -p "<任务描述>" \
--output-format text --max-turns <轮次> \
--append-system-prompt "<角色设定>" \
> /tmp/result.txt 2>&1 &
sleep 30 && cat /tmp/result.txt
# 带古法编程风格
cd <项目目录> && claude-code-glm -p "实现 XXX 功能" \
--output-format text --max-turns 5 \
--append-system-prompt "你是古法编程大师,代码注释用文言文书写。" \
> /tmp/result.txt 2>&1 &
注意:
- 必须后台运行(&),claude CLI 约 15-20 秒返回
- --max-turns 控制最大工具调用轮次,建议 3-10
- 工作目录必须是实际项目目录(claude 需要读代码)
五、从 CNB NPC Fork(可选)
如果有现成的 CNB NPC 仓库(如 npc/claude-code),可提取 prompt:
# 克隆 NPC 仓库
git clone https://cnb.cool/npc/claude-code.git /tmp/npc-ref
# 提取 prompt(.cnb/settings.yml 中的 roles[].prompt)
# 适配到 --append-system-prompt 或写入 CLAUDE.md
Fork 到自己组织:
git clone https://cnb.cool/<NPC仓库>.git /tmp/<npc-name>
cd /tmp/<npc-name>
git checkout -b main
git remote remove origin
git remote add origin https://cnb.cool/<组织>/<npc-name>.git
# 修改配置后推送
git push -u origin main
六、踩坑记录
| # | 坑 | 解法 |
|---|---|---|
| 1 | CCR 目录被创建为 uid 999 (claude) | sudo chown -R ubuntu:ubuntu ~/.claude-code-router/ |
| 2 | CCR 修改 config 后不生效 | 必须 kill 旧 CCR 进程再重启(它缓存了旧配置) |
| 3 | claude CLI 需要 Anthropic API key | 通过 CCR 代理,设置 ANTHROPIC_AUTH_TOKEN=ccr-local |
| 4 | acpx ACP 模式不工作 | acpx 的 claude 子命令需要真实 Anthropic 认证,CCR 无法绕过,用 exec 调用替代 |
| 5 | exec timeout 杀 claude 进程 | 必须后台运行 &,不要让 exec 直接等待 |
| 6 | ccr code 子命令超时 |
ccr code 会在内部启动临时 CCR 实例,容易超时;直接用 claude CLI + 环境变量更可靠 |
| 7 | 智谱 API 401 | 确认 key 有效且端点正确(coding 专用端点 vs 通用端点) |
| 8 | claude 禁止 root | 非 root 用户运行,或用 --dangerously-skip-permissions(仅受信环境) |