之前,ChatGPT只在登录验证页面进行IP检测,但现在每次请求都会进行IP检测。我购买的阿里云新加坡独享IP和亚马逊美国区的独享IP都被封禁了。为了解决这个问题,我在Vultr上尝试了十几个区的IP,但都不可用。令人感到奇怪的是,即使使用ChatGPT Plus也无法幸免,因为封禁IP的策略完全不透明。
虽然我一直推荐的机场还能使用,但大量的人挤占可用IP,导致需要时不时刷新页面才能持续问答。
好在还有救,我在Github上找到了一个很棒的开源项目https://github.com/Yidadaa/ChatGPT-Next-Web/ ,可以私有化部署到自己的服务器,并稳定地使用ChatGPT售卖的API。当私有化部署完成后,它的效果如图所示。
转自: https://www.v2fy.com/p/2023-04-18-chatgpt-dev-1681812847000/
首先向ChatGPT获取token
进入 https://platform.openai.com/account/ 注册账号登录成功后,为保证可以长期使用,建议绑定海外银行卡,我用的 depay , 目前ChatGPT连续三个月扣费很稳定,depay 邀请链接 https://depay.depay.one/web-app/register-h5?invitCode=620375&lang=zh-cn
绑定银行卡,需要填写地址,填写地址的过程中,建议使用美国地址生成器,选择免税州,生成地址,阿拉斯加免税州生成链接 https://www.meiguodizhi.com/usa-address/alaska
在绑定银行卡界面提交时,要使用美国IP, 我是直接用的亚马逊云的Virginia美国服务器,亚马逊前三个月免费,等于白嫖, 详细开通教程我做了记录,可以前往 https://github.com/zhaoolee/pilog/wiki/Buy-Amazon-Lightsail-as-Raspberry-Pi-frp-server 查看
绑定成功后,就可以在Billing 的Payment methods中查看到支付方式了 https://platform.openai.com/account/billing/payment-methods ,以后只要保证这张卡有余额,就能一直稳定使用ChatGPT了
通过USER -> API keys 获取token , token为 sk
开头
搭建chatgpt-next-web私有化服务
如果你恰好有一台新加坡服务器(也可以直接买 https://common-buy.aliyun.com/?commodityCode=swas®ionId=ap-southeast-1 ),而这台服务器的3000端口也恰好空着,你只需一行命令,就能直接用Docker 运行私有化服务
docker run -d -p 3000:3000 \
-e OPENAI_API_KEY="sk-xxxx" \
-e CODE="页面访问密码" \
yidadaa/chatgpt-next-web
私有化服务在服务器3000端口运行成功后,打开设置
输入docker运行时的访问密码,关闭设置即可自动生效
如果你想在国内服务器部署,并添加https,请继续往下看
国内服务器是无法直接访问海外OpenAi 服务器的,我的方案是在阿里云7890端口配置代理,详细方案可参考 如何让国内的阿里云服务器可以高速下载Github代码 https://www.v2fy.com/p/2021-06-06-clash-wordpress-1622973106000/
但 如何让国内的阿里云服务器可以高速下载Github代码 里面自建的方案有些过时了,更新的自建方案在这里 通过新加坡阿里云访问ChatGPT https://www.v2fy.com/p/2023-03-01-v2ray-1677654246000/ , 另外,狡兔三窟,我验证vultr大量被ban的ip时,发现了这个脚本 source <(curl -sL https://multi.netlify.app/v2ray.sh) --zh
一键安装,很爽,甚至支持多用户,来源教程 https://iyideng.net/black-technology/cgfw/vmess-v2ray-server-building-and-using-tutorial.html
如何验证国内阿里云的某个端口已成功配置代理
我们可以用一次性docker容器来验证,docker容器是否可以通过某个端口的代理访问外网
docker run -it --rm --network host curlimages/curl curl -x http://172.17.0.1:7890 https://www.youtube.com
这里为什么是172.17.0.1
, 而不是127.0.0.1
? 因为对于Docker容器而言,127.0.0.1 会指向自己,而不是物理机;
这里的172.17.0.1
是怎么来的? 我是通过ifconfig | grep inet
获得的
此刻,我们已经验证,对于docker容器,可以通过配置代理 172.17.0.1:7890
顺利访问外网
其实我这里并不严谨,能顺利访问youtube.com 并不代表能顺利访问openai的服务器,但openai的api服务器好像并没有做ip的限制,因为我的新加坡阿里云服务器无法访问ChatGPT的网页服务(即使我交了20美刀每月的会员),但新加坡阿里云能顺利访问openai的api服务器,或许openai没有对开发者token请求的来源做限制(枪口抬高了一寸)
然后我们在国内服务器物理机3008端口(端口自己定,不和其他服务起冲突就好)起一个服务
docker run -d -p 3008:3000 \
-e OPENAI_API_KEY="sk-****" \
-e CODE="*****" \
-e PROXY_URL="http://172.17.0.1:7890" \
yidadaa/chatgpt-next-web
此刻我们的国内服务器就可以通过3008端口对外提供服务了。
将3008端口的服务,通过nginx,映射到一个独立域名,并添加https
重复的内容我就不写了,可以参考这篇文章
另外,还有一些nginx配置的细节,全在配置文件里,我直接把配置文件贴出来, 我的域名是 chat.v2fy.com
配置文件的位置为
/etc/nginx/conf.d/chat.v2fy.com.conf
配置文件chat.v2fy.com.conf的内容为
server {
listen 80;
server_name chat.v2fy.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name chat.v2fy.com;
ssl_certificate "/etc/nginx/ssl/chat.v2fy.com/fullchain.cer";
ssl_certificate_key "/etc/nginx/ssl/chat.v2fy.com/chat.v2fy.com.key";
location / {
proxy_pass http://127.0.0.1:3008/;
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_buffering off;
chunked_transfer_encoding on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 300;
}
}
大家可以根据自己的域名进行替换~
小结
ChatGPT 本身是很优秀的产品,作为一个程序员,ChatGPT为我省了大量时间,但ChatGPT近期的操作,显然不想给免费用户太多使用量,早点转为买token 进行私有化部署,或许是少折腾的最优解。
server {
listen 80;
server_name chat.v2fy.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name chat.v2fy.com;
ssl_certificate "/etc/nginx/ssl/chat.v2fy.com/fullchain.cer";
ssl_certificate_key "/etc/nginx/ssl/chat.v2fy.com/chat.v2fy.com.key";
location / {
proxy_pass http://127.0.0.1:3008/;
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_buffering off;
chunked_transfer_encoding on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 300;
}
}
大家可以根据自己的域名进行替换~
小结
ChatGPT 本身是很优秀的产品,作为一个程序员,ChatGPT为我省了大量时间,但ChatGPT近期的操作,显然不想给免费用户太多使用量,早点转为买token 进行私有化部署,或许是少折腾的最优解。