真诚友善团结专业,共建你我引以为荣之社区。《常见问题解答》
17 / 17
8月 8 日

CCR 是个不错的项目, 不过官方教程是在本地的, 使用 docker-compose 搭建了一个服务器部署的server,

  • Dockerfile
FROM node:lts WORKDIR /app RUN npm install -g @musistudio/claude-code-router CMD ["ccr","start"]
  • docker-compose.yml
version: "3.8" services: ccr: build: . container_name: ccr-new ports: - "3456:3456" volumes: - ./:/root/.claude-code-router restart: unless-stopped
  • config.json
{ "LOG": true, "APIKEY": "xxxxxx", // 必须要有 "HOST": "0.0.0.0", // 以及这里 "OPENAI_API_KEY": "", "OPENAI_BASE_URL": "", "OPENAI_MODEL": "", "Providers": [ { "name": "gemini", "api_base_url": "https://generativelanguage.googleapis.com/v1beta/models/", "api_key": "xxxxx", "models": [ "gemini-2.5-flash", "gemini-2.5-pro" ], "transformer": { "use": ["gemini"] } } ], "Router": { "default": "gemini,gemini-2.5-pro", "background": "gemini,gemini-2.5-flash" } }
  • 最后就是在本地的配置了
    ~/.claude/settings.json
{ "env": { "ANTHROPIC_BASE_URL": "https://xxxxxxx", "ANTHROPIC_AUTH_TOKEN": "123" } }

对了, 踩了一个坑,
需要用到 cc 版本在 1.0.60, 我一开始的版本应该是 1.0.58 是不支持这个 setting 配置的, 但是没关系, 你可以使用环境变量写进入, 当然肯定不如写全局配置文件舒服

➜ .claude claude --version 1.0.60 (Claude Code)

其实有较为高效的方法,直接拉取git仓库。进行编译然后再运行。
可以参考

  1. Dockerfile

    2.compose.yml

    3.目录结构

我还对应写了一个一键部署的脚本,实现代码拉取 镜像构建和容器运行

#!/bin/bash # 脚本:更新claude-code-router并重新启动Docker容器 # 设置: set -euo pipefail CURRENT_DIR="$(pwd)" CCR_PATH="$CURRENT_DIR/claude-code-router" NEEDS_REBUILD=false # 标志,指示是否需要重构镜像,默认为假 echo "✨ 开始更新claude-code-router..." # --- 1. 更新claude-code-router仓库 --- echo "➡️ 1. 更新 $CCR_PATH 仓库..." if [ -d "$CCR_PATH" ]; then # 如果目录存在,进入目录并执行更新 cd "$CCR_PATH" echo " - 正在拉取远程最新代码..." # 记录 git pull 之前的 HEAD 提交 ID PRE_PULL_HEAD=$(git rev-parse HEAD) echo " - 拉取前 HEAD: $PRE_PULL_HEAD" git fetch origin --prune # --prune 清理已不存在的远程分支引用 # 检查本地是否有未提交的更改,如果有则警告并退出(可选,但更安全) if ! git diff-index --quiet HEAD --; then echo "⚠️ 警告:$CCR_PATH 目录存在未提交的更改。请先提交或暂存这些更改,然后重试。" exit 1 fi # 尝试拉取最新代码,并检查其输出 PULL_OUTPUT=$(git pull origin main 2>&1) echo "$PULL_OUTPUT" # 打印 git pull 的输出 # 获取 git pull 之后的 HEAD 提交 ID POST_PULL_HEAD=$(git rev-parse HEAD) echo " - 拉取后 HEAD: $POST_PULL_HEAD" # 判断是否需要重构: # 1. 检查 git pull 的输出是否包含 "forced update" # 2. 检查 git pull 前后的 HEAD 提交 ID 是否不同 if [[ "$PULL_OUTPUT" == *"forced update"* || "$PRE_PULL_HEAD" != "$POST_PULL_HEAD" ]]; then echo "🚀 代码库已更新(或发生强制更新),需要重构镜像。" NEEDS_REBUILD=true else echo "✅ 代码库已是最新,无需重构镜像。" NEEDS_REBUILD=false fi else # 如果目录不存在,则克隆仓库 echo " - 仓库不存在,正在克隆 claude-code-router 仓库..." git clone https://github.com/musistudio/claude-code-router.git "$CCR_PATH" echo "✅ 仓库克隆完成。" NEEDS_REBUILD=true # 新克隆的仓库肯定需要构建 fi # --- 2. 返回当前目录并停止现有容器 --- echo "➡️ 2. 停止现有Docker容器..." cd "$CURRENT_DIR" if [ -f "docker-compose.yml" ]; then docker compose down --remove-orphans echo "✅ 现有Docker容器已停止。" else echo "ℹ️ 未找到 docker-compose.yml 文件,跳过停止容器操作。" fi # --- 3. 根据是否需要重构来执行不同的操作 --- if [ "$NEEDS_REBUILD" = true ]; then echo "➡️ 3. 代码库已更新,正在重新构建并启动Docker容器..." docker compose build --no-cache docker compose up -d --build echo "✅ Docker容器已重新构建并启动。" else echo "➡️ 3. 代码库未更新,跳过重构,直接启动Docker容器..." # 这里是关键修改 docker compose up -d # 使用 up -d 代替 restart,以确保容器被启动 echo "✅ Docker容器已启动。" fi # --- 4. 检查容器状态 & 完成提示 --- echo "➡️ 4. 检查容器状态..." docker compose ps echo "---" echo "🎉 更新完成!" echo "📁 当前目录: $CURRENT_DIR" echo "👁️ 容器状态可通过 'docker compose logs -f' 查看。" echo "---"

是的,不过这个就不用编译了,直接拉到的就是js文件:zany_face:用就完了