本文的目标是搭建一个可墙内访问的ChatGPT,使用的Github上开源的chatgpt-web
该项目支持双模型,提供了两种非官方 ChatGPT API
方法
方式 | 免费? | 可靠性 | 质量 |
---|---|---|---|
ChatGPTAPI(gpt-3.5-turbo-0301) | 否 | 可靠 | 相对较笨 |
ChatGPTUnofficialProxyAPI(网页 accessToken) | 是 | 相对不可靠 | 聪明 |
本文介绍第二种,即accessToken的方式。
首先,访问这里获取你的AccessToken(得先web登录chatgpt)
在服务器任意目录创建docker-compose.yml
ninja版本(推荐)
version: '3'
services:
app:
image: chenzhaoyu94/chatgpt-web # 总是使用 latest ,更新时重新 pull 该 tag 镜像即可
container_name: chatWeb
#network_mode: "host"
ports:
- 23002:3002
environment:
#OPENAI_API_KEY: ""
# 二选一
OPENAI_ACCESS_TOKEN: "eyJhbGciOiJSUzI1NiIsIn***"
# API接口地址,可选,设置 OPENAI_API_KEY 时可用
#OPENAI_API_BASE_URL: xxxx
# 反向代理,
API_REVERSE_PROXY: http://本机IP:8080/backend-api/conversation
# 超时,单位毫秒,可选
#OPENAI_API_MODEL: gpt-3.5-turbo
TIMEOUT_MS: 60000
# 每小时最大请求次数,可选,默认无限
MAX_REQUEST_PER_HOUR: 500
# Socks代理,可选,和 SOCKS_PROXY_PORT 一起时生效
SOCKS_PROXY_HOST: 172.17.0.1
# Socks代理端口,可选,和 SOCKS_PROXY_HOST 一起时生效
SOCKS_PROXY_PORT: 7890
networks:
- blog_default
ninja:
image: gngpp/ninja:latest
container_name: ninja
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
- PROXIES=http://本机IP:7890
#socks5://host:port
command: run
ports:
- 8080:7999
networks:
- blog_default
watchtower:
container_name: watchtower
image: containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --interval 3600 --cleanup
restart: unless-stopped
networks:
blog_default:
external: true
go-chatgpt-api版本(该项目作者以弃坑,github上显示2023.10.24已经archived)
version: '3'
services:
app:
image: chenzhaoyu94/chatgpt-web
container_name: chatWeb
#network_mode: "host"
ports:
- 23002:3002
environment:
# 二选一
#OPENAI_API_KEY: "sk-VChNlxZJQVl6mfA3xeqm*****"
# 二选一
# 将上面得到的accessToken填入
OPENAI_ACCESS_TOKEN: "eyJhbGciOiJSUzI1N*****"
# API接口地址,可选,设置 OPENAI_API_KEY 时可用
#OPENAI_API_BASE_URL: xxxx
# 反向代理
API_REVERSE_PROXY: http://172.21.0.3:8080/chatgpt/backend-api/conversation
# 超时,单位毫秒,可选
OPENAI_API_MODEL: gpt-3.5-turbo
TIMEOUT_MS: 60000
# 每小时最大请求次数,可选,默认无限
MAX_REQUEST_PER_HOUR: 500
# Socks代理,可选,和 SOCKS_PROXY_PORT 一起时生效
SOCKS_PROXY_HOST: 172.17.0.1
# Socks代理端口,可选,和 SOCKS_PROXY_HOST 一起时生效
SOCKS_PROXY_PORT: 7890
networks:
- blog_default
go-chatgpt-api:
container_name: go-chatgpt-api
image: linweiyuan/go-chatgpt-api
ports:
- 8080:8080 # 容器端口映射到宿主机8080端口;宿主机监听端口可按需改为其它端口
#network_mode: host # 可选,将容器加入主机网络模式,即与主机共享网络命名空间;上面的端口映射将失效
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- TZ=Asia/Shanghai
- PROXY=http://172.17.0.1:7890
restart: unless-stopped
networks:
blog_default:
external: true
PROXY是你的fan墙代理,如果你是墙外的主机就不需要配置。
API_REVERSE_PROXY是ChatGPT反代服务,参考的另一个开源项目ChatGPT-Proxy
OpenAI提供了两种访问方式,一种是直接在ChatGPT网页端使用的Access Token方式,这种方式可以免费使用GPT-3.5模型,只需要登录即可使用。但缺点是不稳定,且无法扩展。另一种是使用API,注册用户可以获得5美元的赠送额度,但使用完之后就需要付费。这种方式相对更稳定,但缺点是赠送额度较少且存在限流,目前是3条/分钟。
因此,对于那些希望免费使用OpenAI GPT-3.5模型的用户来说,选择Access Token方式是比较好的选择。但是需要解决的问题是不稳定以及可能IP被封禁的问题。为了解决这些问题,我们可以自建反向代理服务来提高稳定性,并保护我们的IP地址不被OpenAI封禁。也有一些公共的反向代理服务可以选择使用,但是很不稳定,因为它们是免费共享的。所以自建反向代理服务是一个不错的选择
nginx配置
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name chat.guitang.fun;
# 防止爬虫抓取
if ($http_user_agent ~* "360Spider|JikeSpider|Spider|spider|bot|Bot|2345Explorer|curl|wget|webZIP|qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot|NSPlayer|bingbot")
{
return 403;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache off;
proxy_cache_bypass $http_pragma;
proxy_cache_revalidate on;
proxy_http_version 1.1;
proxy_buffering off;
# 前提是加入nginx的网络
# docker network connect blog_default chatWeb
location / {
proxy_pass http://chatWeb:3002/;
}
# certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
ssl_certificate /etc/nginx/conf.d/10276600_chat.guitang.fun_nginx/chat.guitang.fun.pem;
ssl_certificate_key /etc/nginx/conf.d/10276600_chat.guitang.fun_nginx/chat.guitang.fun.key; ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
}
接下来就大功告成啦,看看效果吧
发表回复