CLIProxyAPI部署:Caddy反代 + Cloudflare托管

Cloudflare DNS 配置

添加 DNS 解析记录

登录 Cloudflare 控制台,进入目标域名的 DNS → Records 页面,添加一条 A 记录:

字段 说明
Type A IPv4 地址记录
Name cpa 子域名前缀,最终域名例如为 cpa.test.de
Content <服务器公网 IP> 源站的真实 IP 地址
Proxy status Proxied(橙云) 启用 Cloudflare 代理,隐藏源站 IP,保证Origin CA 证书正常工作

SSL/TLS 加密模式

进入 SSL/TLS → Overview 页面,将加密模式设置为 Full (Strict)

该模式要求 Cloudflare 边缘节点与源站之间的连接使用有效的 TLS 证书,并对证书进行严格验证。配合后续签发的 Origin CA 证书,可实现完整的端到端加密。

[!NOTE]
Full 与 Full (Strict) 的区别: Full 模式下 Cloudflare 不验证源站证书的有效性(允许自签名),存在被中间人攻击的风险。Full (Strict) 则要求源站证书由 Cloudflare 信任的 CA 签发(包括 Origin CA),安全性更高。


服务器环境准备

防火墙(UFW)配置

安装 UFW:

apt update && apt install ufw -y

放行 SSH 端口并启用防火墙:

ufw allow 22/tcp comment 'SSH'
ufw enable

[!WARNING]
在启用 UFW 之前,务必确认已放行 SSH 端口(默认 22)。 若服务器使用非标准 SSH 端口,请将上述命令中的 22 替换为实际端口号。

仅允许 Cloudflare IP 段访问 HTTP/HTTPS 端口:

从 Cloudflare 官方接口动态获取其边缘节点的 IPv4 和 IPv6 地址段,并逐条写入 UFW 规则。

curl -s https://www.cloudflare.com/ips-v4 | while read -r ip; do
  ufw allow from "$ip" to any port 80,443 proto tcp comment 'Cloudflare IPv4'
done

curl -s https://www.cloudflare.com/ips-v6 | while read -r ip; do
  ufw allow from "$ip" to any port 80,443 proto tcp comment 'Cloudflare IPv6'
done

验证规则是否生效:

ufw status numbered

预期输出中应包含多条来源为 Cloudflare IP 段、目标端口为 80,443 的 ALLOW 规则。

[!NOTE]
Cloudflare 会不定期更新其 IP 段。可定期重新执行上述命令以同步最新的 IP 列表,或编写 cron 定时任务自动化此流程。

创建目录结构

为 Caddy 和 CPA 分别创建独立的工作目录:

mkdir -p /opt/caddy/{certs,data,config} /opt/cpa

目录用途说明:

路径 用途
/opt/caddy/certs/ 存放 Cloudflare Origin CA 证书及私钥
/opt/caddy/data/ ~
/opt/caddy/config/ ~
/opt/cpa/ CPA 配置文件、认证数据及日志

创建 Docker 网络

此命令创建一个名为 caddy_net 的用户自定义桥接网络,支持容器间通过 容器名称 进行 DNS 解析。

docker network create caddy_net

签发 Cloudflare Origin CA 证书

Origin CA 证书是 Cloudflare 签发的专用证书,用于加密 Cloudflare 边缘节点与源站之间的通信。该证书 仅被 Cloudflare 信任,不被浏览器或其他客户端信任,因此不能脱离 Cloudflare 代理单独使用。

创建证书

进入 Cloudflare 控制台的 SSL/TLS → Origin Server 页面,点击 Create Certificate

配置选项:

选项 推荐值 说明
Private key type ECC 相比 RSA,ECC 密钥长度更短、计算效率更高
Certificate Validity 15 years Origin CA 证书最长有效期
Hostnames *.test.de, test.de 默认值即可

![Cloudflare Origin CA 证书创建界面]

保存证书与私钥

创建完成后,页面将展示 Origin Certificate(证书内容)和 Private Key(私钥内容)。

[!WARNING]
私钥仅在此页面展示一次,关闭后无法再次查看。
务必在关闭页面前完成保存。若丢失,需吊销当前证书并重新签发。

将证书和私钥分别写入服务器文件:

# 将 Origin Certificate 的完整内容(包含 -----BEGIN CERTIFICATE-----
# 和 -----END CERTIFICATE-----)粘贴写入以下文件
nano /opt/caddy/certs/cf.crt

# 将 Private Key 的完整内容(包含 -----BEGIN PRIVATE KEY-----
# 和 -----END PRIVATE KEY-----)粘贴写入以下文件
nano /opt/caddy/certs/cf.key

部署 CLIProxyAPI

编写 CPA 配置文件

cat > /opt/cpa/config.yaml << 'EOF'
host: "0.0.0.0"
port: 8317
auth-dir: "~/.cli-proxy-api"
request-retry: 3
quota-exceeded:
  switch-project: true
  switch-preview-model: true
api-keys:
  - "your-api-key-here"
remote-management:
  allow-remote: true
  secret-key: "your-strong-secret-here"
  disable-control-panel: false
  panel-github-repository: "https://github.com/kongkongyo/Cli-Proxy-API-Management-Center"
logging-to-file: true
usage-statistics-enabled: true
logs-max-total-size-mb: 100
EOF

[!WARNING]
api-keyssecret-key 替换为高强度随机字符串。

编写 Docker Compose 配置

cat > /opt/cpa/docker-compose.yml << 'EOF'
services:
  cli-proxy-api:
    image: eceasy/cli-proxy-api:latest
    container_name: cli-proxy-api
    networks:
      - caddy_net
    volumes:
      - ./config.yaml:/CLIProxyAPI/config.yaml
      - ./auths:/root/.cli-proxy-api
      - ./logs:/CLIProxyAPI/logs
    restart: unless-stopped

networks:
  caddy_net:
    external: true
EOF

启动 CPA 服务

cd /opt/cpa && docker compose up -d

部署 Caddy 反向代理

编写 Caddyfile

cat > /opt/caddy/Caddyfile << 'EOF'
cpa.test.de {
    tls /etc/caddy/certs/cf.crt /etc/caddy/certs/cf.key

    reverse_proxy cli-proxy-api:8317
}
EOF

[!IMPORTANT]
cpa.test.de 替换为你的实际域名,与前面创建的 DNS A 记录一致。

编写 Docker Compose 配置

cat > /opt/caddy/docker-compose.yml << 'EOF'
services:
  caddy:
    image: caddy:latest
    container_name: caddy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./certs:/etc/caddy/certs:ro
      - ./data:/data
      - ./config:/config
    networks:
      - caddy_net

networks:
  caddy_net:
    external: true
EOF

配置要点:

  • ports: "80:80""443:443" – Caddy 需要对宿主机暴露 HTTP/HTTPS 端口以接收来自 Cloudflare 的流量。端口 80 用于处理 HTTP 到 HTTPS 的重定向。

启动 Caddy

cd /opt/caddy && docker compose up -d

验证与测试

管理面板访问

在浏览器中访问以下地址,进入 CPA 远程管理面板:

https://{你的域名}/management.html

使用 config.yamlremote-management.secret-key 配置的密码登录。


参考资料

https://linux.do/t/topic/1670317

33 个赞

前排支持喂嘴里的教程

写的不错,让cc 就照着这个做

我直接cf tunnel感觉方便好多

收藏了。

学习了,我昨天想用Cloudflare托管然后通过CC Switch让Claude Code用Gemini,但是不知道为什么就是成功不了

太强了,大佬

太强了,喂嘴里了

是的,tunnel也很方便 https://linux.do/t/topic/1670317

这个有啥好处呢。。。

牛啊 大佬

哈哈哈哈我问哈基米也是这样做的

使用 codex 会出现 cf 403 的问题不。

Access blocked by Cloudflare. This usually happens when connecting from a restricted region (status 403
Forbidden), url: https://xxx.com, cf-ray: 9d7f7d081c4ffe8b-
SIN

谢谢分享!先收藏,有空试试

我直接1panel搞定了,界面操作还是快

感謝佬友分享的餵飯教程!

我没遇到过,要不问问ai :shaking_face:

我也是看的另外一个老哥的走tunnel模式的教程跑起来的。另外还顺便看了个sub2api的教程,说建议请求从服务器出去的时候走cloudflare的warp(也是不要钱的),这样进出都被cloudflare罩着了,更安全。

谢谢佬友分享

好的 谢谢