码农之家

ChatGPT 服务私有化部署,实现无代理访问

客观来说目前所有的 ChatGPT 相关产品都是 API wrapper,各种功能也无非是 UI 化的 prompt , 野心勃勃的创业者可能感到失望,因为相关产品毫无护城河可言。所以本文重点不是 ChatGPT (毕竟每天头条看麻了),而是以私有化部署 ChatGPT 服务为目的,入门多个新形态云服务的使用,丰富个人私有云的工具链,拓宽一些云服务相关的姿势水平,本文主要使用 Vercel 和 CloudFlare。

目标

将 ChatGPT 整合进日常工具链,并且无需任何代理无痛使用。因为在非办公网环境时,即使日常就使用相关服务,也不一定会代理全流量;即使是全流量,也一般不用 American 的节点(比较慢)。无任何代理使用 3.5-turbo 可以说是一个小刚需,而 3.5 API 也足够满足大部分日常需求。

方法

无任何代理使用 ChatGPT 方法有很多,渐进式的可分为以下方式:

  • 直接使用共享的服务,类似于 freegpt.one/ ,缺点是比较卡,不推荐
  • 使用 page server 私有化域名部署 github.com/Yidadaa/Cha… 这种 Web page ,比较好的日用方式,这里会解释一点网络知识。
  • 使用 faas 服务反向代理 API URL api.openai.com ,对于一些 chrome plugin 或 ios app,配置为自己的 base url 就能无痛的使用 API 了。

Page Server 私有域名部署 webpage

目标:一键 fork 他人项目然后在 Vercel 部署,配置添加自己的域名就能使用,私有云服务 +1。如果你没弄过这套流程,单纯从好玩的角度也十分值得实践。

这种方式部署比较有趣的点在于为什么它能无代理访问。

Why work?

我们简单将 github.com/Yidadaa/Cha… 这种纯前端项目通过 vercel 部署后,通过一个私有域名假设为 chat.abc.work 访问,前端调用 API 使用相对路径,假设为 chat.abc.work/api , 实际上就能正常调用了 api.openai.com 的 API ,本机无需任何代理,这是为什么?

WFG 常识

主要分两种,一种是只污染了域名解析,如 Vecel,CloudFlare,及部分的 Github (可见前两者的生态位); 一种是在污染 DNS 的前提下还额外封了 IP,如谷歌。

你可能会好奇 HTTPS 不是端到端加密吗,怎么封 IP? 在这篇文章里分析了 HTTPS中, tls 的端到端加密的确可靠 , 但在 tls 1.3 之前 sni 会明文暴露目标域名:一个服务器(IP) 可能部署多个服务,则请求需要先告诉具体域名,服务器再返回域名的证书。这导致中间人可以获取一个 域名:IP 的 map,封禁流量的同时还启发性的封禁了 IP。

正是因为 Vercel 只被封了域名,没有被封 IP,部署在它服务器上的 webpage 调用相对路径接口如 chat.abc.work/api ,相当于从 Vercel 的服务器请求了 api.openai.com 的 API,同时本地又能正常访问 Vercel ip ,所以直接省略了反代的步骤就能 work。

举一反三:本地对 chat.openai.com/chat 起一个反代,使用一个自签域名是否就能访问?当然不行,不仅 WFG 封了 openai 的 ip,openai 也封了你的 ip(狗头)。只有 API 可以多地区使用。

步骤

购买域名

如果你已有域名本步骤跳过。

如果你没有个人域名,这里给出一些建议:

为什么需要个人域名

  • 便宜,尽量去小牌的域名网站购买,首年 5 块搞定,解析服务使用 CloudFlare 即可。
  • 私人域名是搭建私有云套件的门扉。各种云服务通过 subdomain.${servicename}.个人域名部署,完全不用记,十分方便,也能极大提高扩充私有云服务的热情。

购买域名后,在购买的网站上将域名 DNS 配置成 CloudFlare 即可,我们使用后者管理域名解析。

Vercel 部署

云服务产品的形式多种多样,目的都是针对具体的业务场景高度定制,尽量屏蔽掉运维成本,一键完成 DevOps 。Vercel 作为偏前端的云平台,前端部署的云产品易用度已经到了极致。

Github fork 项目如 github.com/Yidadaa/Cha…

Vercel create project,导入 Github 项目,一键部署。

完成后能赠送一个 *.vercel.app 域名(dns 污染),我们需要额外添加一个自己的域名。

Vercel 添加私有域名解析

这部分我用过三个平台, Netlify 似乎需要强制绑定域名解析服务器, 而 CloudFlare 的 Page 服务在编译时常出现异常,Vercel 的体验是最好的。

在 CloudFlare dns 上添加一个 cname 记录指向 vercel 的 cname 服务。这里可以添加一个通配符,假设为: *.v.abc.work

在 Vercel 部署项目的 setting => domain 里添加一条解析,如 gpt.v.abc.work 。 稍等片刻,Vercel 就自动生成了 SSL 证书和域名解析,我们就能通过 gpt.v.abc.work 访问这个服务了。

另外 Vercel 上图中的环境变量配置和访问控制也十分方便,由此部署完成,无需任何代理即可使用服务,同时私有云服务+1。

FaaS 部署域名反代

如果我们想使用一些客户端 app ,配置一个 API url 来反代默认的 api.openai.com 即可正常使用。这里推荐两种方式。

腾讯云

来自 github.com/Ice-Hazymoo…

云函数部署一个最简单的 node 反代,然后使用它的公网路径即可。 缺点在于这个公网路径无法自定义不好记,需要保存在记事本里。

CloudFlare

来自 github.com/x-dr/chatgp…

CloudFlare worker 也是标准的 FaaS 服务,逻辑基本相同。

优点在于可以自由配置 domain, 比如添加一个自定义的subdomain, 和私有云服务一样好记,使用相关app 配置 API url 时 使用 openai.abc.work 替换 api.openai.com 即可。

结语

综上,已经达成了无代理使用 3.5 的目标。另外还有 docker 部署前后端的更完整部署方案,实际上更加复杂一点,也没啥必要。 CloudFlare 和 Vercel 访问难度和 Github 基本相同,相信问题不大。

写文章本身也是一个学习的过程,也请读者能指出文章中的疏忽错漏之处。如果本文对你有所帮助,欢迎点赞收藏。

原文链接:https://juejin.cn/post/7215967109183864888 作者:Stirner