Skip to content

Docker 部署 copilot2api:把 GitHub Copilot 转成兼容 API

whtsky/copilot2api 是一个本地代理,可把 GitHub Copilot 暴露为 OpenAI、OpenAI Responses、Anthropic、Gemini 和 AmpCode 兼容接口。本文固定使用 v0.6.1,正式部署采用 Docker Compose;预编译二进制作为不使用 Docker 时的备选方案。

项目没有实现 API Key 校验。本文只监听 127.0.0.1,适用于同一台机器上的 Codex、Claude Code、Gemini CLI 或其他客户端,不适合作为公网 API 服务。

部署结论

项目本文采用的值
GitHub 地址whtsky/copilot2api
官方镜像ghcr.io/whtsky/copilot2api:0.6.1
项目版本v0.6.1,发布于 2026-08-21
正式部署Docker Compose,单容器
快速体验不提供临时单命令体验:首次运行必须完成 OAuth,且凭据需要持久化
主机架构Linux amd64arm64;二进制另支持 macOS 和 Windows
对外端口127.0.0.1:7777:7777
持久化copilot2api-data -> /root/.config/copilot2api
依赖服务无数据库、缓存或队列
验证范围官方资料核对 + Compose 静态校验;未拉取镜像、未执行 OAuth 或运行容器
资料核对日期2026-08-26

准备条件

  • 一个有效的 GitHub Copilot 订阅;个人、Business 或 Enterprise 的可用模型由账号实际返回的模型目录决定。
  • 已安装 Docker Engine 或 Docker Desktop,并支持 Compose v2。
  • 本机 7777 端口未被占用。
bash
docker --version
docker compose version

本文使用的镜像同时发布了 Linux amd64arm64 版本。项目未给出最低 CPU、内存或磁盘要求,因此不在这里虚构资源下限。

Docker Compose 正式部署

1. 创建目录

bash
mkdir -p "$HOME/apps/copilot2api"
cd "$HOME/apps/copilot2api"

创建 compose.yaml

yaml
services:
  copilot2api:
    image: ghcr.io/whtsky/copilot2api:0.6.1
    container_name: copilot2api
    restart: unless-stopped
    stdin_open: true
    tty: true
    ports:
      - "127.0.0.1:7777:7777"
    volumes:
      - copilot2api-data:/root/.config/copilot2api

volumes:
  copilot2api-data:
    name: copilot2api-data

stdin_opentty 对应官方首次运行示例中的 -it。固定卷名便于备份和恢复;端口左侧限定为 127.0.0.1,避免局域网中的其他设备直接消耗你的 Copilot 配额。

2. 首次启动并授权 GitHub

先以前台方式启动,这样能直接看到设备授权码:

bash
docker compose pull
docker compose up

终端会显示类似下面的信息:

text
GitHub Authentication Required
Please visit: https://github.com/login/device
Enter code: XXXX-XXXX
Waiting for authorization...

在浏览器中打开 GitHub Device Activation,登录拥有 Copilot 订阅的账号,输入终端显示的设备码。授权成功后,终端应显示 Authentication successful,随后服务监听容器内的 0.0.0.0:7777

Ctrl+C 停止前台实例,再切换为后台运行:

bash
docker compose up -d
docker compose ps
docker compose logs --tail=100 copilot2api

OAuth 凭据保存在命名卷中,重建容器后仍会保留。不要把该卷的备份发给其他人。

验证部署结果

容器和模型目录

bash
docker compose ps
curl -fsS http://127.0.0.1:7777/v1/models
curl -fsS http://127.0.0.1:7777/usage

/v1/models 应返回包含 data 数组的模型列表;/usage 用于查看 Copilot 用量。模型列表由账号、订阅类型及 GitHub 当前目录决定,不要假设所有示例模型都一定可用。

发起一次 OpenAI Chat Completions 请求

下面使用项目 README 中出现的 gpt-5.3-codex。如果返回模型不存在,先从 /v1/models 复制一个实际的 id 再替换。

bash
curl -fsS http://127.0.0.1:7777/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gpt-5.3-codex",
    "messages": [{"role": "user", "content": "只回复 OK"}],
    "stream": false
  }'

成功时响应包含 choices;401/403 通常指向 GitHub/Copilot 授权问题,404 或模型错误则先重新查看 /v1/models

验证凭据持久化

bash
docker compose restart copilot2api
docker compose logs --tail=50 copilot2api
curl -fsS http://127.0.0.1:7777/v1/models

重启后不应再次要求 Device Flow 授权,并且模型列表仍能返回。

接入常用客户端

Claude Code

在目标项目的 .claude/settings.json 中写入:

json
{
  "env": {
    "ANTHROPIC_BASE_URL": "http://127.0.0.1:7777",
    "ANTHROPIC_API_KEY": "dummy",
    "ANTHROPIC_MODEL": "claude-opus-4.6",
    "ANTHROPIC_SMALL_FAST_MODEL": "claude-haiku-4.5",
    "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1"
  },
  "permissions": {
    "deny": ["WebSearch"]
  }
}

dummy 只是满足客户端字段要求,copilot2api 本身不会校验它。启动 Claude Code 前确认两个模型 ID 都存在于 /v1/models;不存在时使用账号实际返回的 Claude 模型替换。

Codex

~/.codex/config.toml 中加入:

toml
model = "gpt-5.3-codex"
model_provider = "copilot2api"
model_reasoning_effort = "high"
web_search = "disabled"

[model_providers.copilot2api]
name = "copilot2api"
base_url = "http://127.0.0.1:7777/v1"
wire_api = "responses"
api_key = "dummy"

项目内置了 codex-auto-reviewgpt-5.6-luna 的兼容路由。如果 Copilot 模型目录没有 gpt-5.3-codex,把顶层 model 改为 /v1/models 返回的可用 GPT/Codex 模型。

Gemini CLI

~/.gemini/.env 中写入:

dotenv
GOOGLE_GEMINI_BASE_URL=http://127.0.0.1:7777
GEMINI_API_KEY=dummy
GEMINI_MODEL=claude-opus-4.6-1m

同样需要先确认示例模型存在。代理提供 /v1beta/modelsgenerateContentstreamGenerateContentcountTokens 兼容路由。

OpenAI SDK

Python 客户端可以直接把 base_url 指向本地代理:

python
from openai import OpenAI

client = OpenAI(base_url="http://127.0.0.1:7777/v1", api_key="dummy")
model = client.models.list().data[0].id
response = client.chat.completions.create(
    model=model,
    messages=[{"role": "user", "content": "只回复 OK"}],
)
print(response.choices[0].message.content)

不使用 Docker:安装预编译二进制

预编译文件来自 v0.6.1 Release。二进制默认监听 127.0.0.1:7777,凭据写入 ~/.config/copilot2api/credentials.json

macOS Apple Silicon

bash
mkdir -p "$HOME/.local/bin"
curl -fL https://github.com/whtsky/copilot2api/releases/download/v0.6.1/copilot2api-darwin-arm64 \
  -o "$HOME/.local/bin/copilot2api"
printf '%s  %s\n' \
  '5450253ca53150a5441cabd52949cb17c4f40806351a4f7f816e39b0d6bbfbc9' \
  "$HOME/.local/bin/copilot2api" | shasum -a 256 -c -
chmod 755 "$HOME/.local/bin/copilot2api"
"$HOME/.local/bin/copilot2api"

Linux x86-64

bash
mkdir -p "$HOME/.local/bin"
curl -fL https://github.com/whtsky/copilot2api/releases/download/v0.6.1/copilot2api-linux-amd64 \
  -o "$HOME/.local/bin/copilot2api"
printf '%s  %s\n' \
  '282795e112d4fe392564de6b2c3535e1999760c542fc063c5dda147a2f08bf62' \
  "$HOME/.local/bin/copilot2api" | sha256sum -c -
chmod 755 "$HOME/.local/bin/copilot2api"
"$HOME/.local/bin/copilot2api"

Windows、Intel Mac 和 Linux ARM64 的文件名及 SHA-256 可在 v0.6.1 Release 的 Assets 中核对。首次运行同样会显示 GitHub Device Flow 地址和设备码。

常用参数:

text
-host string          监听地址,默认 127.0.0.1
-port int             监听端口,默认 7777
-token-dir string     凭据目录,默认 ~/.config/copilot2api
-model-routes string  JSON 格式的精确模型路由
-debug                输出调试日志
-version              显示版本

日常运维

bash
cd "$HOME/apps/copilot2api"
docker compose ps
docker compose logs --tail=200 copilot2api
docker compose restart copilot2api
docker compose stop
docker compose start

需要临时增加日志时,可在 Compose 的服务下加入:

yaml
environment:
  COPILOT2API_DEBUG: "true"

然后执行 docker compose up -d 使配置生效。问题定位完成后删除该设置,避免长期记录过多请求上下文。

备份与恢复

凭据和本地状态都在 copilot2api-data 卷中。备份前停止服务,避免复制过程中继续写入:

bash
cd "$HOME/apps/copilot2api"
docker compose stop copilot2api
BACKUP_DIR="copilot2api-data-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_DIR"
docker cp copilot2api:/root/.config/copilot2api/. "$BACKUP_DIR"/
tar czf "$BACKUP_DIR.tar.gz" -C "$BACKUP_DIR" .
docker compose start copilot2api

恢复时先把归档写入一个新卷,不覆盖现有数据。下面的 docker rm 只删除临时辅助容器,不删除原容器、原卷或备份:

bash
cd "$HOME/apps/copilot2api"
BACKUP_FILE="$(ls -1t copilot2api-data-*.tar.gz | head -1)"
tar tzf "$BACKUP_FILE" | head
RESTORE_DIR="$(mktemp -d)"
tar xzf "$BACKUP_FILE" -C "$RESTORE_DIR"
docker volume create copilot2api-data-restore
docker create \
  --name copilot2api-restore-helper \
  -v copilot2api-data-restore:/data \
  alpine:3.22
docker cp "$RESTORE_DIR"/. copilot2api-restore-helper:/data/
docker rm copilot2api-restore-helper

compose.yaml 最后一行的 name 临时改为 copilot2api-data-restore,执行 docker compose up -d 并重新检查 /v1/models。验证完成前保留原卷,以便快速回切。

升级和回滚

  1. 打开 Releases,阅读目标版本说明,确认是否有凭据格式或配置变化。
  2. 按上一节完成备份。
  3. compose.yaml 的镜像标签从 0.6.1 改为明确的目标版本;不要改成长期漂移的 latest
  4. 执行 docker compose pull && docker compose up -d
  5. 检查日志、/v1/models/usage 和一次实际对话请求。

如果新版本启动失败且发布说明没有不可逆数据迁移,把镜像标签改回 0.6.1 并再次执行 docker compose up -d。若发布说明声明了不可逆迁移,应使用备份恢复到新卷,不要让旧版本直接读取已经迁移的数据。

常见问题

每次启动都要求重新授权

检查卷是否挂载,以及容器内是否存在凭据文件:

bash
docker inspect copilot2api --format '{{json .Mounts}}'
CHECK_DIR="$(mktemp -d)"
docker cp copilot2api:/root/.config/copilot2api/. "$CHECK_DIR"/
ls -la "$CHECK_DIR"

缺少卷挂载时,容器删除后凭据会一同消失。修正 Compose 后重新完成一次 Device Flow。

本机无法连接 7777

bash
docker compose ps
docker compose logs --tail=100 copilot2api
lsof -nP -iTCP:7777 -sTCP:LISTEN

授权尚未完成时服务可能仍在等待 Device Flow;端口被其他进程占用时,修改主机侧端口,例如 127.0.0.1:17777:7777,客户端地址同步改为 http://127.0.0.1:17777

客户端报告模型不存在

bash
curl -fsS http://127.0.0.1:7777/v1/models

以接口实际返回的 ID 为准。Copilot 模型目录会随账号类型、区域和 GitHub 调整而变化。

局域网或远程设备需要访问

不要把端口映射改成 7777:7777 后直接开放。项目没有 API Key 校验,这会形成任何人都能调用的代理。确有跨设备需求时,应在前面增加带认证和 TLS 的反向代理,并通过防火墙限制来源;这已经超出本地部署的安全范围。

部署完成后

  • 保留版本固定的 compose.yaml 和最近一次可验证备份。
  • 定期检查 /usage,避免自动化客户端在后台消耗大量 Copilot 配额。
  • GitHub Token、Copilot Token 和数据卷备份都按密钥处理,不上传仓库或发送给他人。

总结

本文使用 ghcr.io/whtsky/copilot2api:0.6.1 和 Docker Compose 部署了一个仅本机可访问的 GitHub Copilot 兼容代理,并覆盖首次 OAuth、模型查询、实际请求、客户端接入、备份及升级流程。最重要的限制是服务不校验 API Key,因此安全边界必须由 127.0.0.1 监听和主机访问控制保证。

参考资料

全部公开文章由同一个站点构建和发布。