ChatGPT已经火了有一阵了,而自己在使用 NPM(Nginx Proxy Manger) 后,便一直想尝试通过 NPM 来反代 ChatGPT 页面。并且本地和远程服务器也无法访问 OpenAI API,因此进行一番尝试后,得到如下架构来实现。
其中,Caddy2 作为基本的 Web 服务器,来支持访问 ChatGPT 的个性化静态页面。然后由于 Caddy2 所在的远程服务器无法访问OpenAI API,再想办法让 Caddy2 通过代理的形式访问,因此要再使用一个 WARP 服务充当 Socket5 代理。
配置
以下为相关的配置文件。
Docker Compose file
version: "3.7"
services:
app:
image: 'caddy:latest'
container_name: chatgpt_web
restart: unless-stopped
environment:
- HTTP_PROXY=socks5h://warp-socks:9091
- HTTPS_PROXY=socks5h://warp-socks:9091
depends_on:
- warp-socks
ports:
- 20011:80
volumes:
- ./data/Caddyfile:/etc/caddy/Caddyfile
- ./data/site:/srv
- ./data/caddy_data:/data
- ./data/caddy_config:/config
warp-socks:
image: monius/docker-warp-socks:latest
privileged: true
# ports:
# - "9091:9091"
# # - target: 9091
# # published: 9091
# # mode: host
cap_add:
- NET_ADMIN
- SYS_ADMIN
sysctls:
net.ipv6.conf.all.disable_ipv6: 0
net.ipv4.conf.all.src_valid_mark: 1
healthcheck:
test: ["CMD", "curl", "-f", "https://www.cloudflare.com/cdn-cgi/trace"]
interval: 30s
timeout: 10s
retries: 5
如果要让 warp socks 向外提供服务,则修改 warp-socks 中的 ports 注释。
Caddy2配置
在 docker-compose.yml 同级目录中创建 data目录,在data目录中创建 Caddyfile 目录,内容如下。这里的 route /api* 表示对于反代域名/api* 会实际访问api.openai.com,并且 uri strip_prefix /api
将路径中的 /api 给去除。这样 openai 收到的地址才是正常的访问路径。
:80 {
route /api* {
uri strip_prefix /api
reverse_proxy https://api.openai.com {
header_up Host api.openai.com
header_up Authorization "{http.request.header.Authorization}"
}
}
encode zstd gzip
# Set this path to your site's directory.
root * /srv
# Enable the static file server.
file_server
}
静态ChatGPT页面
这里利用了现现成的 GitHub 库来进行,这里选择了 https://github.com/xqdoo00o/chatgpt-web 这个库来做前端页面,支持语音输入转文字和朗读功能,我觉得用起来很顺手。
-
在 data 目录,执行
git clone https://github.com/xqdoo00o/chatgpt-web.git site
,这会将 git 库下载并命名为site
。 -
回到
data
目录上一级,包含docker-compose.yml
,执行docker compose up -d
,启动服务。
NPM配置
自己定义一个域名,在托管 域名管理
控制面板中将该域名指向 NPM 的服务器地址,随后在 NPM 中创建该域名,并在 hostname/IP 填写本地地址,Forward Port 指向 Compose file 中所填端口。 SSL中按自己所申请的具体域名还是泛域名进行选择打开。
使用
访问设置的域名,进入主界面后,进入设置页面,在OpenAI 接口处填入 域名/api/
,然后输入 API 密钥(sk-xxx形式),点击检查API额度,数秒后正确返回结果即代表可正常访问,若有错误则需重回整体步骤检查。
结语
通过一套反代配置,可以利用 NPM 和 Caddy2 的优势,结合 ChatGPT 前端页面,来快速实 ChatGPT 基本聊天功能访问,解决本地和远程服务器不是 OpenAI 目标对象而无法使用的情形。