Docker系列 基于OpenAI API和Access Token自建ChatGPT
本文最后更新于 61 天前,如有失效请评论区留言。

本博客由ZGOCLOUD大力赞助!如何更快地访问本站?有需要可加电报群获得更多帮助。本博客用什么VPS?创作不易,请支持苯苯!推荐购买本博客的VIP喔,10元/年即可畅享所有VIP专属内容!

日志

不会用Docker的小伙伴可以加苯苯tg群,有时间可以帮你搭建;自备VPS和远程软件todesk向日葵parsec即可。没VPS的可以在这里选一台。另外,“扩展阅读”会经常更新,但一般不在日志中体现。

  • 2024-02-18:2024年2月中旬左右linweiyuan/go-chatgpt-api已经不支持Access Token,同期很多类似项目都不能支持。API模式不受影响。详见issue。续观 Σ( ° △ °|||)︴
  • 2023-12-31Kerwin1202/chatgpt-web: v2.13.8。新增单独设置API地址、设置最大上下文计数(默认为20)、允许过滤用户统计、支持自定义聊天模型(比如文心一言)。
  • 2023-12-01:鉴于linweiyuan/go-chatgpt-api项目已经archived,用法已固定,因此更新精简相关教程,删除旧教程。
  • 2023-11-12Kerwin1202/chatgpt-web: v2.13.7更新,支持:新模型 gpt-4-1106-preview 和 gpt-4-vision-preview;修复:UI展示。
  • 2023-10-29Kerwin1202/chatgpt-web: v2.13.6更新(太难得了),支持:更改密码和启用2FA、支持编辑用户备注、允许添加新用户、允许关闭登录模式、显示用户角色、在多个打开的浏览器上同步用户信息。修复:调用api时跳过历史记录中已删除的消息。
  • 2023-07-10Kerwin1202/chatgpt-web: v2.13.5+更新,新增模型、用户登录权限相关接口的限流、GUI添加新用户、允许Access Token模式计费。优化NPM设置以达到反爬目的,详见API自建ChatGPT——NPM设置。添加反爬后,建议旧API删除并切换新API。
  • 2023-07-07:OpenAI全面开放gpt-4-8k,本项目也可以使用这个模型喔!
  • 更多历史日志见这里

前言

感谢Chanzhaoyu/chatgpt-webKerwin1202/chatgpt-weblinweiyuan/go-chatgpt-api等项目的开发大大们的无私奉献!欢迎大家关注他们的工作喔 (ฅ´ω`ฅ) 还要感谢@wang小伙伴的指点!

我用帐号/密码使用chatGPT已经有一段时间。但是,我有几个私交较密的朋友,他们并不具备使用chatGPT的条件;但又想体验一下这个神奇的工具。因此,最近我专门去了解了一波自建ChatGPT的相关项目。在这里,我总结一下在Linux系统中自建chatGPT的经验。大家有什么好项目也可以在评论区推荐下!

自建OpenAI的ChatGPT一般基于两种授权方式:APIAccess Token模式。对本教程而言,这两种方案的区别大致如下:

API Access Token(非Plus)
基本要求 OpenAI帐号+ 绑定国外的虚拟信用卡 仅OpenAI帐号
收费情况 使用收费 免费
基础Prompt 支持 不支持
超参数支持 Temprature/Top_p 不支持
单位时间请求数 较高,适合多人使用 较低,适合个人使用
响应速度 较快 较慢
token长度 较长 较短
绕过Cloudflare的反向代理 不需要 需要
稳定性 较高 较低

我使用的项目是Kerwin1202/chatgpt-web,基于MongoDB后端,支持APIAccess Token模式。目前的功能包括:多用户登录/注册数据库管理对话云端保存和管理敏感词管理自定义提示词多Key轮询用户管理用户统计自定义模型等(v2.13.0起)。最重要的是,该项目是完全开源和免费的!关于安全性,我只能说我暂时没有发现这个方案有主观恶意行为;API并没有异常扣费。

我的自建chatGPT(gpt-3.5-turbo)在PC端的界面大致如下(基于API):

msedge_jmTUPoSKsq.gif

在移动端的界面大致如下(基于Access Token):

chat-web_mobile.gif

值得注意的是,只要你的API支持,这个方案也支持GPT-4——由OpenAI公司在2023年3月14日发布的一个比gpt-3.5更强大的语言模型。想进一步了解GPT-4的小伙伴可以看“跟李沐学AI”的视频:GPT-4论文精读

2023-04-13:这里吐槽下国内大厂的类GPT模型,个个宣传得很厉害;一进官网全TM是网页前端+内测阶段,可以说是蹭热度吃相十分难看 Σ( ° △ °|||)︴哪怕只有chatGPT的0.5倍,每天限额20条提问也比现在这种情况要强。

下面咱们开始布署自建ChatGPT吧。Go, Go, Go!

准备工作

你需要使用非中国大陆和香港的IP访问openai.com,具体比较复杂。如果你不知道我在说什么,看到这里你就可以停了

如果你使用Access Token的方式,要特别注意本文的Access Token自建ChatGPT小节;这部分准备工作可以忽略。后面的内容最好都看看,提高对该项目的熟悉程度。

如果你使用API的方式,则需要准备一个可用的OpenAI API。具体方案如下:

申请虚拟信用卡

首先,我们要有一张合适的虚拟信用卡。之前很多人介绍depay。但是,目前depay的身份验证通道是维护状态(2023-04-24前后已经恢复了);月费2美元;需要使用USDT支付。这对很多人是一个很高的门槛。

此隐藏内容仅限VIP查看。包年VIP仅10元,建议升级。VIP可享有哪些特权

获得OpenAI API

可以根据该教程注册OpenAI帐号。绑卡的过程建议全程使用美国节点。

温馨提示:对于没有OpenAI帐号的小伙伴可以找找第三方号贩子,花钱就可以买Openai API使用——普通的5刀API大概1-1.5元一个,有请求限制,3次/20S。120刀的API一般是可用1个月,无请求限制,10块以内找找应该有不少。但这些买来的API的稳定性和安全性都是没有保障的喔!

你可以通过“Account API Keys – OpenAI API”新建一个API。这个过程很简单,直接点Create new secret key即可:

msedge_slHCHbf1sm

这个API Key只展示一次,你应该记录一下。如果忘记了,新建一个再删除旧的,然后记住新的key即可。

你可以在“Account – OpenAI API”中查看消费情况:

msedge_RdK2eaGpTq

建议限制一下高额消费提醒:

msedge_FiUb2uepcm

你可以在“Pricing”中查看服务单价(每1000 token)。token大致就是单词片段,这个概念主要来自transformer模型,大家简单了解一下就好。请注意,调用gpt-4 API时,Prompt(提示)和Completion(结论)的计费是不同的;不过目前gpt-4 API暂时还是申请制,有的人应该不多。总之,gpt-3.5的API价格还是挺亲民的,个人用户目前用它即可。gpt-4的价格就比较高了,特别是在对话很长的情况下;因而只建议企业级用户体验:

msedge_FPMIkQbjmU

申请GPT-4 API

2023-07-07 OpenAI全面开放GPT-4-8k的权限

最后,如果你可以使用gpt-3.5的API,建议尽快加入gpt-4的waitlist。这个是需要一段时间的,尽早申请。说不定运气好很快就可以申请成功 (ฅ´ω`ฅ):

msedge_kol3H2FsXz

如果填写成功,之后会收到邮件:

msedge_MZP543xLaW

有点期待可以使用gpt-4 ヾ(≧∇≦*)ゝ

测试环境

我的自建chatGPT布署在博客所在的RackNerd VPS上:

uname -a # Linux racknerd-XXXXX 5.4.0-28-generic #32-Ubuntu SMP Wed Apr 22 17:40:10 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

docker --version # Docker version 23.0.3, build 3e7cbfd

docker-compose --version # Docker Compose version v2.4.1

我的VPS上搭载了各种docker应用,有20个docker stacks,合计47个containers,包括两个自建的chatGPT(一个用Access Token一个用API)。如果你还没有自己的VPS,强烈推荐选购一台喔!

如无特殊说明,本文所有代码都是使用root用户运行。这是由于数据库往往需要部分root权限才可以成功,为了避免权限相关的bug,咱们还是使用root用户比较稳。高手可以无视此限制。

本文所使用的chat-gpt web项目是:

本文所使用的反向代理项目是:

API自建ChatGPT

不了解docker的小伙伴请先看:《Docker系列 配置Docker全局环境》;《Docker系列 了解Docker Compose的配置文件》。

完成准备工作后,我们通过docker自建ChatGPT。我目前使用的项目是: Kerwin1202/chatgpt-web,它提供了使用MongoDB托管后台数据的接口。该项目衍生于Chanzhaoyu/chatgpt-web: 用 Express 和 Vue3 搭建的 ChatGPT 演示网页——仅提供了一个ChatGPT前端的Demo,比较原始。

另外,对于使用OpenAI API的朋友如果是在家里搭建的,一定要关注自己节点的可靠性——这是因为https请求应该会附带API相关的明文信息,理论上对方只要设定一些筛选规则就可以获取你使用的API,从而造成API泄露。这也是为什么我是在Racknerd VPS里搭建自建ChatGPT的原因,除了网络连接问题,最重要的考量其实是安全性。如果你觉得某个API不安全了,请及时删除它喔!

文件夹和端口

首先,我们新建工作目录:

work=~/docker/kerwin_chatgpt
mkdir -p $work; cd $work

该目录用于保存docker stack的重要数据,便于迁移和备份。

如果你也使用了ufw,应该开放一下端口(没用防火墙的可以忽略此步):

sudo ufw allow 1004/tcp comment 'kerwin_chatgpt' && sudo ufw reload
sudo ufw allow 1005/tcp comment 'kerwin_chatgpt GUI' && sudo ufw reload

如果你的VPS后台还有防火墙,也要相应开放(没用防火墙的可以忽略此步)。

yml文件

这里有很多帐户和密码,大家多关注:

  • OPENAI_API_KEY:OpenAI后台的API key。
  • SMTP系列:这是给注册用户发送邮件时用的。
  • AUTH_SECRET_KEY:源项目是登陆密钥。这里暂时不知道有什么用。注册过程似乎用不到AUTH_SECRET_KEY选项,但必须要提供,否则可能报错
  • MongoDB:数据库名chatgpt,用户名user01,密码password01。这里要注意mongodb url的书写格式——mongodb://user01:password01@database:27017,其中database是该stack中数据库的“小名”,而27017是暴露于stack局域网中的端口号,是默认端口,我也没有改动。如果这两个参数你都使用了自定义,应该要做相应改动。
  • Mongo-Express:用户名user02,密码password02。这是登陆MongoDB Express时用的。如果不设置,任何知道数据库网址的人都可以访问数据库——这是十分危险的!

无论什么时候,都不建议大家使用弱密码。我推荐使用自建bitwarden进行密码管理。希望大家要做好安全防护,不然被人扫描出来进行弱密码暴破甚至是直接登陆就不好了。除了密码外,基于Nginx Proxy Manager的https也是很关键的。

如果你用过mongomongo-express镜像,可以改为自己正在使用的tag,这样比较节省磁盘空间。有按需修改提示的参数也要按自己的实际情况修改。

上面的帐号/密码理清后,我们新建docker-compose.yml文件:

vi $work/docker-compose.yml

kerwin1202/chatgpt-web:v2.12.5是我比较喜欢的版本,bug不多;如果大家不喜欢latest也可以用它。写入以下内容:

version: '3'

services:
  app:
    image: kerwin1202/chatgpt-web:latest
    restart: unless-stopped
    ports:
      - 1004:3002
    depends_on:
      - database
    environment:
      TZ: Asia/Shanghai
      # API or Access Token模式
      OPENAI_API_MODEL: ChatGPTAPI # 在较新版本时可能需要该参数
      # 默认模型。默认是gpt-3.5-turbo
      # OPENAI_API_MODEL: gpt-3.5-turbo-0613
      # 从OpenAI后台里获得
      OPENAI_API_KEY: sk-XXX # 按需修改
      # 访问jwt加密参数,可选 不为空则允许登录 同时需要设置 MONGODB_URL
      AUTH_SECRET_KEY: 12345678abcdefg # 按需修改
      # 超时,单位毫秒,可选
      TIMEOUT_MS: 60000
      # 网站名
      SITE_TITLE: APIChat # 按需修改。写个自己喜欢的名字就行
      # mongodb 的连接字符串
      MONGODB_URL: 'mongodb://user01:password01@database:27017' # 按需修改
      # 网站是否开启注册
      REGISTER_ENABLED: true # 完成注册后,可以直接在前端页面关闭注册。
      # 开启注册之后 网站注册允许的邮箱后缀 如果空 则允许任意后缀
      REGISTER_MAILS: '@qq.com,@gmail.com,@163.com' # 按需修改
      # 加密盐。算法: echo -n 'passwordsalt' | md5sum | cut -c 1-32
      PASSWORD_MD5_SALT: tNJ%M&D # 按需修改
      # 开启注册之后 超级管理员的邮箱
      ROOT_USER: [email protected] # 按需修改
      # 前面一定要有https://或http://,且末尾不含/。注册的时候发送验证邮箱使用。
      SITE_DOMAIN: https://chatgpt.hwb0307.com # 按需修改
      # 开启注册之后 发送验证邮箱配置
      SMTP_HOST: smtp.qq.com
      SMTP_PORT: 465 # 也可以尝试587
      SMTP_TSL: true
      SMTP_USERNAME: [email protected] # 按需修改
      SMTP_PASSWORD: xxxxxxxx # 按需修改
    links:
      - database

  database:
    # image: mongo:3.6 # 为了支持v2.13.0+版本,不再使用mongodb 3.x
    image: mongo:4.0
    restart: unless-stopped
    expose:
      - '27017'
    volumes:
      - ./mongodb:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: user01 # 按需修改
      MONGO_INITDB_ROOT_PASSWORD: password01 # 按需修改
      MONGO_INITDB_DATABASE: chatgpt

  gui:
    image: mongo-express:1.0.0-alpha
    restart: unless-stopped
    ports:
      - "1005:8081"
    environment:
      # 选择主题。详见: http://codemirror.net/demo/theme.html
      ME_CONFIG_OPTIONS_EDITORTHEME: ambiance
      # 数据库信息
      ME_CONFIG_BASICAUTH_USERNAME: user02 # 按需修改
      ME_CONFIG_BASICAUTH_PASSWORD: password02 # 按需修改
      ME_CONFIG_MONGODB_URL: 'mongodb://user01:password01@database:27017'
      ME_CONFIG_MONGODB_ENABLE_ADMIN: true # 可能不是必要的
      ME_CONFIG_MONGODB_ADMINUSERNAME: user01 # 可能不是必要的
      ME_CONFIG_MONGODB_ADMINPASSWORD: password01 # 可能不是必要的

请注意,SITE_DOMAIN参数中https://chatgpt.hwb0307.com这个域名是不存在的,你应该改成自己的域名。另外,听说有小伙伴用http的时候存在新用户无法正常注册和验证。但出于安全性考虑,你应该使用https

这个docker-compose.yml要自定义的东西还挺多的。如果大家使用时有什么疑问,可以在评论区留言!

最后直接上线即可:

cd $work && docker-compose up -d

若想更新chatgpt-web,只要依次运行下列命令:

docker-compose down # 下线
docker-compose pull # 拉取chatgpt-web latest镜像。mongo/mongo-express用的是固定tag,一般不会更新
docker-compose up -d # 重新上线

完成更新后,旧镜像不会自动删除,而是回退为其它tag或标记为none。这时可以手动删除,比如用docker rmi xxx或者去Portainer后台删除。

其它docker相关操作和一般的docker应用是类似,这里就不细说了。

NPM设置

不了解Nginx Proxy Manager(NPM)用法的小伙伴,请看《Docker系列 两大神器NPM和ddns-go的安装》。

准备两个域名并在域名托管商(比如Cloudflare)的后台完成解析。比如,使用chatgpt.hwb0307.comchatgptgui.hwb0307.com

  • chatgpt.hwb0307.com给chatGPT的前端使用,反代地址http://172.17.0.1:1004
  • chatgptgui.hwb0307.com给chatGPT的后端使用,反代地址http://172.17.0.1:1005

反代过程最好添加一些反爬的nginx配置(感谢@Eric Erek的提醒),比如:

   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;
    }

填到Advanced——Custom Nginx Configuration即可:

msedge_RyndiSqCeH

我使用wget测试的效果如下:

MobaXterm1_CHS_EbowE9kDSw

最后,ChatGTP-Web的前端基本界面如下:

msedge_yLBWgtDM4J

后端数据库界面如下:

msedge_GifyaaFR8d

简单使用

注册

第一个用户默认是管理员用户,请使用docker-compose.yml文件里约定的管理员邮箱注册,并在邮箱里点击验证链接即可。其它用户的注册也是类似的,点击注册即可。不过,由于我的用户都是家人和同事,我个人比较喜欢直接使用数据库添加非邮箱注册的用户(详见数据库后端——添加非注册用户)。

如果你的目标用户已经注册完毕,你可以在docker-compose中设置REGISTER_ENABLED: false,重启docker stack生效。当然,可能在网站配置里设置更合理(见后面)。

总之,这些配置和docker-compose.yml文件里定义的参数是相一致的。当然,这部分我觉得还不太合理——可能经常变化的参数不应该在docker-compose.yml里定义。

连续/非连续对话

这里提醒下,对话输入框左边有个时钟标记,绿色时聊天会携带之前的对话信息;红色时则不会。后者会比较节省token。这个技巧是非常实用的——如果你只需要ChatGPT一问一答,建议点红该时钟

msedge_rYuBb9pO9n

基础Prompt

v2.12.4后,Kerwin1202/chatgpt-web开始支持个性化设置某个对话的基础Prompt:

msedge_Yw8rp3n1xq

这是一个非常实用的功能。每个对话都可以实现一个基础角色。 默认是这样的:

You are ChatGPT, a large language model trained by OpenAI. Follow the user's instructions carefully. Respond using markdown.

比官方强太多啦!

复制和导出

导出目前只支持图片功能,希望之后可以支持更多格式(最好有markdown这种可编辑文本)。当然,复制时的格式是markdown/html格式的 (ฅ´ω`ฅ)

msedge_kvXsgTORBw

如果你不知道什么是markdown,你就要去我的这篇文章里补补课了: Typora 地表最强Markdown编辑器之一。半个小时入门markdown应该问题不大!

更改默认模型

随着OpenAI的可用模型越来越多,我们可能想会指定一下特别的模型作为默认模型:

msedge_OpGhVZbDug

目前只要在对话里直接选择即可;它是一个全局设置,所有的对话都会改为新选择的模型:

msedge_ov65b0CF8R

这里我更改为gpt-3.5-turbo-0613,一个在2023年6月中旬提出的支持function calling功能的新chatGPT模型。

另外,你也可以直接去数据库后台(chatgpt——config)修改:

msedge_IgoJDkJXPU

msedge_hMOM4KR22w

这对于新用户来说可能是有用的。

设置

所有的设置都可从左下角的设置按钮进入查看:

msedge_EegIbiJemj

总览

总览界面基本上和数据库内容是一一对应的:

msedge_IcCkoq7r6U

总览里还可以导入/导出聊天记录(以.json格式),也是挺不错的!

我这里简单展示其它选项的内容:

高级

设定角色。一般是默认的。

msedge_ykePHnElZX

在较新版本(2023-04-16之后)中还支持TempratureTop_p超参数:

msedge_Wl2we15ZWY

一般来说,TemperatureTop-p是生成文本任务中可以影响模型生成结果的超参数

  • Temperature 是一个控制输出概率分布平滑程度的指标。具体来说,它可以被视为一个用于在概率分布上取样的“温度值”,当温度较高时,模型会生成更加多样化和出奇的结果;温度较低时,则会生成更加保守和可预测的结果
  • Top-p 参数是一个控制生成文本长度和多样性的参数。它基于概率累积函数(CDF)来截取最高概率的 token,防止一些重复或者不好的词语出现。 在这种情况下, 模型会根据当前概率分布中的 token 累计概率进行采样,然后选择累计概率达到 p 的所有 token 中的一个作为下一个输出token。 当p接近于1时,生成的文本就趋向于确定性,而当p逐渐减小时,生成的文本将变得更加多样化

大家可以根据实际需要进行调整。你也可以问一下ChatGPT噢 (ฅ´ω`ฅ)。

统计

v2.13.0+以后才有的特性

有一个统计token的可视化图表,不过目前暂不支持指定用户。值得期待!

msedge_TkUCQ6odw5

v2.13.8以后支持某个用户的用量查看,感觉棒棒嗒 (~ ̄▽ ̄)~

基本配置

这里展示了API的余额,它并不是当月余额,而是当月限额-全部用额(这个设定不太合理)。

Api模型建议使用gpt-3.5-turbo,这也是目前最流行的gpt-3.5模型。其它选项按需要填写即可。如果你使用https/socks代理,一定要明确该代理是安全的!

msedge_TYrZA4gn1d

2.12.6版本起,开发者新增了接口类型选项。不过,我还是习惯将API和Access Token分开为2个docker stack管理——我只给小伙伴用API,这样更加稳定;我自己则两者都用。

msedge_HxYlXQmPNh

网站配置

建议注册登录功能最好不要点暗(在2023-04-16之后的新版本中已不可操作,这是对的),否则容易出bug,导致所有用户无法登陆:

msedge_VqFsyqLiU1

数据库里直接修改似乎无法生效。感觉这是bug,或者是缓存问题,我暂时还没有头绪:

msedge_vXFuaJFrSP

此外,点亮新用户表明你开放注册;点亮新用户审核表明该用户需要你审核才可以使用。如果你开放注册,一般建议这两者都要点亮。当新用户注册后,他会在自己的邮箱里收到验证邮件。点击验证后,管理员的邮箱里也会收到审核邮件,需要点击审核链接。完成这两步后,新用户才可以登陆和使用。

如果你不想开放注册,将新用户点暗即可。即时生效,不用重启docker stack。

邮箱配置

密码是SMTP专用密码,不是QQ邮箱密码。关于SMTP密码的获取,我在《Docker系列 WordPress系列 WP Mail SMTP插件》也有提及,大致的步骤是需要向腾讯给定的电话号码发送一条短信,然后点击获取。设置好SMTP信息,你可以点测试给自己发一封邮件,看看是否可以收到。

msedge_1I3vrTj3TO

敏感词审核

v2.12.x以后版本才支持

本项目有敏感词审核功能,不过我没怎么用过:

msedge_ic763RAMSd

用户管理

v2.13.x以后版本才支持

本项目支持简单的用户管理功能,后面应该会做得更好(v2.13.5+起管理员可以直接在GUI里添加新用户):

msedge_L2L4w4g2bK

Key管理

v2.13.x以后版本才支持

支持多个Key的管理,某个Key可以指定一到多个模型。这个功能以后可以随便扩展至非ChatGPT模型,比较看好:

msedge_drdS8DEyaS

v2.13.8后支持自定义模型:

msedge_lhW0aqksmq

提示词商店

它内置了一些提示词(Prompts)链接:

msedge_9HDeSbzt9I

有个英文版的Prompts项目也挺不错: f/awesome-chatgpt-prompts: This repo includes ChatGPT prompt curation to use ChatGPT better.,大家可关注下。这些项目基本上涵盖了日常生活和工作中比较常用的功能。不过,一般我都是比较喜欢自己写Prompts。这也是可玩性的一部分吧!以后有机会,我也总结一下大佬们一般是怎么写Prompts的。讲究还挺多 (ฅ´ω`ฅ)

2023-04-17后chatgpt-web有一个比较方便的、不是json格式的提示词添加功能,大家也可以试试看:

msedge_Ez0tY08mEr

另外还要吐槽下,Prompts似乎是仅在浏览器里缓存的,更新缓存或cookie后就没了,还要重新添加。这种设定感觉不太合理,希望作者后续可以改进。

数据库后端

备份数据和恢复数据只是演示。大家按需测试即可。

基本架构

根据docker-compose的设定,该stack的数据库名为chatgpt,它目前包含chatchat_roomconfiguser等4个collection:

msedge_UufsU9WmR6

较新的版本里还有统计token数量的collection——chat_usage。每个collection都是由若干document组成。比如,chat包含每一个对话(即document):

{
    _id: ObjectId('6434eb321da04a227fxxxxxx'),
    status: 1,
    roomId: 1681189xxxxxx,
    uuid: 1681189xxxxxx,
    prompt: '您好',
    options: {
        messageId: 'chatcmpl-740WYC6ne0yHRvyRl8D3IHjxxxxxx'
    },
    dateTime: 1681189xxxxxx,
    response: '你好!有什么我能为你效劳的吗?'
}

chatroom包含某个聊天房的信息:

{
    _id: ObjectId('643509fc02c3279e5dxxxxxx'),
    status: 0,
    userId: '6434ea07160af6b018xxxxxx',
    title: '美波小姐',
    roomId: 1681197xxxxxx
}

config包含了前端应用的基本设置,目前仅包含1个document:

{
    _id: ObjectId('64350bb802c3279e5xxxxxx'),
    timeoutMs: 60000,
    apiKey: 'sk-xxxxxx', // OpenAI API Key
    apiDisableDebug: false,
    accessToken: null,
    apiBaseUrl: null,
    apiModel: 'gpt-3.5-turbo', // 用了什么模型
    reverseProxy: null,
    socksProxy: '',
    socksAuth: '',
    httpsProxy: null,
    siteConfig: {
        siteTitle: 'BenszChat',
        loginEnabled: true,
        loginSalt: 'xxxxxx', // 盐值用于加密用户密码
        registerEnabled: false,
        registerReview: true,
        registerMails: '@qq.com,@gmail.com,@163.com',
        siteDomain: 'https://xxxxxx.hwb0307.com' // 自建chatGPT网址
    },
    mailConfig: { 
        // SMTP信息
        smtpHost: 'smtp.qq.com',
        smtpPort: 465,
        smtpTsl: true,
        smtpUserName: '[email protected]',
        smtpPassword: 'xxxxxx'
    }
}

user的具体细节见“添加非注册用户”。

添加非注册用户

由于我们使用了数据库托管,所以可以轻易地操作数据库以生成新用户。这里我简单展示如何新增一个用户。

首先,我们登陆MongoDB,进入chatGPT数据库的user collection:

msedge_HydN9CrFiJ

这里我创建了一个测试用户[email protected]。我们双击该记录查看具体信息,如下:

{
    _id: ObjectId('6434ececdf45624abb1d190a'),
    name: '[email protected]',
    email: '[email protected]',
    password: '36d78f8755a4d79de6b21034f7bbb207',
    status: 0,
    createTime: '4/11/2023, 1:23:24 PM',
    verifyTime: '4/11/2023, 1:24:23 PM'
}

其中_id就是代表用户ID,类似于身份证号,只要与现存帐号不一样即可。name是用户名,email是用户邮箱。status暂时不知道是什么。createTimeverifyTime代表创建和验证时间,差不多是间隔1分钟左右;没研究过这个时间间隔有没有要求,大家可以试试看。

这里的password其实是一段基于md5的哈希值。假设密码是a,盐值(即docker-compose文件里的PASSWORD_MD5_SALT参数的值)是tNJ%M&D,则password的取值为:

# Linux Shell命令。 rawPassword代表用户密码;salt代表盐值;使用时替换为自己的值即可。
rawPassword='a'; salt='tNJ%M&D'
echo -n ${rawPassword}${salt} | md5sum | cut -c 1-32

输出结果为a3fedefc90692555644896f3c41c26eb,与我的记录是不同的。这是因为每个人的密码和盐值都是不同的,按需生成即可。

只要我们确定好这些参数,再左击New Document新增一条记录并保存,这样就可以在不开放注册的情况下添加用户

msedge_ZWndX6exJT

大家也可以尝试一下如何批量生成新用户喔!

备份数据

备份和恢复的过程和mysql数据库是十分相似的。

一般来说,我们可以利用Mongo Express单独备份某个collection:

msedge_kfjfMjmR5C

但我还是建议直接使用mongoDB默认的方式备份整个数据库。

首先,我们在映射到宿主机的mongodb文件夹中创建一个文件夹以托管备份文件:

# 思考一下这里的路径为什么是/data/db/?
docker exec kerwin_chatgpt-database-1 mkdir -p /data/db/benszbackup

然后,备份chatGPT的数据库:

# docker exec <数据库container名> mongodump -h localhost:27017 -d <chatgpt数据库名> -u <chatgpt数据库用户> -p <chatgpt数据库密码> -o /data/db/benszbackup --authenticationDatabase admin
# 上述信息按实际情况修改
docker exec kerwin_chatgpt-database-1 mongodump -h localhost:27017 -d chatgpt -u user01 -p password01 -o /data/db/benszbackup --authenticationDatabase admin

输出类似:

2023-04-11T23:50:29.532+0000    writing chatgpt.chat to
2023-04-11T23:50:29.533+0000    writing chatgpt.chat_room to
2023-04-11T23:50:29.533+0000    writing chatgpt.user to
2023-04-11T23:50:29.534+0000    writing chatgpt.config to
2023-04-11T23:50:29.541+0000    done dumping chatgpt.chat_room (12 documents)
2023-04-11T23:50:29.543+0000    done dumping chatgpt.chat (55 documents)
2023-04-11T23:50:29.548+0000    done dumping chatgpt.config (1 document)
2023-04-11T23:50:29.553+0000    done dumping chatgpt.user (6 documents)

就代表备份成功了!我们看看备份了啥:

# docker exec kerwin_chatgpt-database-1 ls -hlt /data/db/benszbackup/<chatgpt数据库名>
docker exec kerwin_chatgpt-database-1 ls -hlt /data/db/benszbackup/chatgpt

输出类似于:

-rw-r--r-- 1 root root  585 Apr 12 07:56 config.bson
-rw-r--r-- 1 root root 1.4K Apr 12 07:56 user.bson
-rw-r--r-- 1 root root  54K Apr 12 07:56 chat.bson
-rw-r--r-- 1 root root 1.4K Apr 12 07:56 chat_room.bson
-rw-r--r-- 1 root root  126 Apr 12 07:56 chat.metadata.json
-rw-r--r-- 1 root root  131 Apr 12 07:56 chat_room.metadata.json
-rw-r--r-- 1 root root  128 Apr 12 07:56 config.metadata.json
-rw-r--r-- 1 root root  126 Apr 12 07:56 user.metadata.json

主要就是一些json文件和相应的metadata。

恢复数据

假设,以后我们在一个叫test_mongodb的文件夹中恢复数据:

work2=~/docker/test_mongodb
mkdir -p $work2; cd $work2

根据以前的内容,咱们创建类似的docker-compose.yml:

vi $work2/docker-compose.yml

填入类似内容(先不包含chatgpt-web镜像,这样可以避免来自chagpt-web对数据的干扰):

version: '3'

services:
  database:
    image: mongo:3.6
    restart: unless-stopped
    expose:
      - '27017'
    volumes:
      - ./mongodb:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: user01
      MONGO_INITDB_ROOT_PASSWORD: password01
      MONGO_INITDB_DATABASE: chatgpt

  gui:
    image: mongo-express:1.0.0-alpha
    restart: unless-stopped
    ports:
      - "1005:8081"
    environment:
      # 选择主题。详见: http://codemirror.net/demo/theme.html
      ME_CONFIG_OPTIONS_EDITORTHEME: ambiance
      # 数据库信息
      ME_CONFIG_BASICAUTH_USERNAME: user02
      ME_CONFIG_BASICAUTH_PASSWORD: password02
      ME_CONFIG_MONGODB_URL: 'mongodb://user01:password01@database:27017'
      ME_CONFIG_MONGODB_ENABLE_ADMIN: true # 可能不是必要的
      ME_CONFIG_MONGODB_ADMINUSERNAME: user01 # 可能不是必要的
      ME_CONFIG_MONGODB_ADMINPASSWORD: password01 # 可能不是必要的

这时在新的mongo-express观察一下数据库的组成:

msedge_ww6LrDzRpr

由于是初始化状态,这里并没有关于chatgpt的任何数据。我们尝试恢复数据 (ฅ´ω`ฅ)

首先,将之前的chatgpt备份文件夹复制到映射到宿主机的mongodb目录里

cp -r <之前的chatgpt备份文件夹> ~/docker/test_mongodb/mongodb

直接恢复数据:

# docker exec test_mongodb-database-1 mongorestore -h localhost:27017 -d <chatgpt数据库名> -u <chatgpt数据库用户> -p <chatgpt数据库密码> /data/db/<chatgpt备份文件夹名> --authenticationDatabase admin
docker exec test_mongodb-database-1 mongorestore -h localhost:27017 -d chatgpt -u user01 -p password01 /data/db/chatgpt --authenticationDatabase admin

输出类似于:

2023-04-12T00:10:19.121+0000    the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead
2023-04-12T00:10:19.121+0000    building a list of collections to restore from /data/db/chatgpt dir
2023-04-12T00:10:19.122+0000    reading metadata for chatgpt.chat from /data/db/chatgpt/chat.metadata.json
2023-04-12T00:10:19.122+0000    reading metadata for chatgpt.user from /data/db/chatgpt/user.metadata.json
2023-04-12T00:10:19.123+0000    reading metadata for chatgpt.chat_room from /data/db/chatgpt/chat_room.metadata.json
2023-04-12T00:10:19.224+0000    reading metadata for chatgpt.config from /data/db/chatgpt/config.metadata.json
2023-04-12T00:10:19.224+0000    restoring chatgpt.chat_room from /data/db/chatgpt/chat_room.bson
2023-04-12T00:10:19.301+0000    restoring chatgpt.chat from /data/db/chatgpt/chat.bson
2023-04-12T00:10:19.369+0000    restoring chatgpt.user from /data/db/chatgpt/user.bson
2023-04-12T00:10:19.515+0000    no indexes to restore
2023-04-12T00:10:19.515+0000    finished restoring chatgpt.chat_room (12 documents)
2023-04-12T00:10:19.515+0000    no indexes to restore
2023-04-12T00:10:19.515+0000    finished restoring chatgpt.user (6 documents)
2023-04-12T00:10:19.515+0000    restoring chatgpt.config from /data/db/chatgpt/config.bson
2023-04-12T00:10:19.516+0000    no indexes to restore
2023-04-12T00:10:19.516+0000    finished restoring chatgpt.chat (55 documents)
2023-04-12T00:10:19.517+0000    no indexes to restore
2023-04-12T00:10:19.517+0000    finished restoring chatgpt.config (1 document)
2023-04-12T00:10:19.517+0000    done

此时,在新的Mongo Express里刷新数据库,可见已经完全恢复:

msedge_MEsVETuALt

之后下线整个stack,在新的docker-compose.yml里加入chatgpt-web的相关内容后重新上线,整个应用即可恢复如初。

Access Token自建ChatGPT

请特别关注“合并方案”。对大多数普通用户来说,这应该是使用Access token和反向代理的最佳实践之一。如果正常使用过程中失效(比如fetch failed等报错),重启反向代理的stack或更新镜像后再重启stack即可。

对于没有API的小伙伴们,kerwin1202/chatgpt-web也是完全支持Access Token的喔!如果玩过阿里云WebDav的小伙伴应该对Access Token不陌生。

Access Token是一种常用的API访问方式,它可以被用来授权第三方应用或用户访问某个受保护的资源。Access Token通常由授权服务器签发,以表示授权的有效性和权限范围。我们在OpenAI官方网站登陆帐号后,就会获得一个官方颁发的Access Token,它是一个比较长的随机字符串。我们访问OpenAI时,浏览器使用Access Token作为凭证,向OpenAI的资源服务器请求访问受保护的资源。一般来说,Access Token具有时效性,其有效期由授权服务器设置,并且在一定时间后会自动失效(OpenAI是15-30天);失效后往往会有类似[OpenAI]提供错误的API密钥 | Incorrect API key provided之类的error信息。此外,Access Token还可以被撤销,例如当用户取消了对第三方应用的授权时。通俗地讲,只要你的第三方应用包含了浏览器user-agent或其它header信息,Access Token即可被用于模拟人类登陆浏览器的行为

OpenAI的Access Token可以通过访问https://chat.openai.com/api/auth/session(返回的json文件中有一个accessToken字段)或者F12自己在application里找。由于是拟人登陆,所以OpenAI后台会保存Access Token相关的聊天数据。由于目前gpt-3.5对登陆用户是免费开放的,所以使用Access Token暂时也是免费的 (ฅ´ω`ฅ) 不过稳定性就很难说了,只能说试试看。有人说不好用,有人说还行。我使用的时候就经常出现ChatGPTUnofficialProxyAPI.sendMessage: conversationId and parentMessageId must both be set or both be undefined这种报错;而且同时使用多个对话不如API稳定。使用Access Token对于VPS的位置不太敏感——只要可以和OpenAI的反向代理正常连接即可。

在VPS里自建反向代理

适合有国外VPS的小伙伴尝试

由于存在Cloudflare验证,需要建立一个反向代理绕过验证才可以使用类似API的方式访问chatGPT。这是一些比较常用的公共反向代理:

一般来说,公共反向代理都不太稳。因此,有能力的小伙伴建议自建反向代理,比如基于linweiyuan/go-chatgpt-api项目或linweiyuan/java-chatgpt-api项目。应该还有其它类似的项目,小伙伴有了解的可以在评论区推荐下。一般来说,这些方法对VPS的IP纯净程度要求较高;但使用WARP的话对IP的纯净度要求应该会变低。总体上,自建反向代理的稳定性比一些公共地址更高

这里我们以linweiyuan/go-chatgpt-api为例,其实项目README也说得挺清楚了。另外一位小伙伴的文章dqzboy/ChatGPT-Porxy: ChatGPT Porxy也写得不错,可以看看。具体如下:

首先,创建工作目录:

work3=~/docker/go-chatgpt-api
mkdir -p $work3; cd $work3

防火墙方面(这里的教程仅限Ubuntu的ufw;其它Linux系统自己想办法),一般使用这个规则就够了:

sudo ufw allow 8080/tcp comment 'proxy for chatgpt access token' && sudo ufw reload

这个8080,如果大家映射到宿主机的是其它端口,相应改动即可。另外,这个防火墙的规则并不能阻止某些陌生IP白嫖我们的节点。我觉得比较好的方法应该是将反向代理建在chatgpt-web的局域网中,比如下面的“合并方案”;或者是像《Docker系列 两大神器NPM和ddns go的安装》的“NPM——注意事项——防火墙”小节所描述的方案。

下面,我介绍几种经实测可行的自建反向代理方案,大家酌情选用其中之一即可。

无WARP布署

新建docker-compose.yml文件并填入以下内容:

services:
  go-chatgpt-api:
    container_name: go-chatgpt-api
    image: linweiyuan/go-chatgpt-api:latest # 最新
    ports:
      - 8080:8080 # 宿主机8080端口可按需改为其它端口
    environment:
      - GIN_MODE=release
      # - GO_CHATGPT_API_PROXY=
    restart: unless-stopped

完成部署后,我们查看日志:

docker-compose logs -f

平时可以这样监控访问记录:

docker logs -f  go-chatgpt-api
# [GIN] 2023/04/19 - 23:38:00 | 200 | 21.785759553s | 192.168.0.1 | POST     "/conversation"

这个200就代表成功访问。

这时,该自建IP的访问地址为http://<vps-ip>:8080/chatgpt/backend-api/conversation,它可以作为下面的docker-compose.yml中API_REVERSE_PROXY参数的值。如果你在浏览器访问该地址,会出现{"errorMessage":"Missing accessToken."}的提示,这是正常的,不用惊慌(具体见该issue)。这里提个小问题:出于安全性要求,有无必要为该反向代理专门反代一个https地址?大家可以将答案留在评论区内喔!

请注意,如果该反向代理和你的chatgpt-web布署在同一个docker网段,你还可以使用局域网地址: http://172.17.0.1:8080/chatgpt/backend-api/conversation。具体原理为:docker在安装时会自动创建一个名为docker0的虚拟网络接口,并分配地址172.17.0.1 作为网桥的默认网关地址。

基于WARP布署

如果显示Access denied之类的报错,提示IP被屏蔽。这时可以使用Cloudflare WARP——Cloudflare开发的VPN工具。基于Cloudflare的全球边缘网络,WARP将用户的网络流量路由到Cloudflare分布在世界各地的海量服务器上来保护用户的网络连接。当用户使用WARP连接到Cloudflare的VPN服务器时,其网络流量将会被路由到最接近目标网站的服务器上,从而可以绕过目标网站所设置的地理位置限制和IP封锁。此外,WARP还使用了一些高级的加密和安全措施来保护用户的数据和隐私。这些措施包括TLS 1.3加密、AES-256-GCM加密等。这些措施可以确保用户的网络连接和数据是安全的,并且不会被恶意方获取和利用。

我的RackNerd VPS就是基于WARP成功自建反向代理的:

services:
  go-chatgpt-api:
    container_name: go-chatgpt-api
    image: linweiyuan/go-chatgpt-api:latest # 最新
    ports:
      - 8080:8080 # 宿主机8080端口可按需改为其它端口
    environment:
      - GIN_MODE=release
      - GO_CHATGPT_API_PROXY=socks5://chatgpt-proxy-server-warp:65535
    depends_on:
      - chatgpt-proxy-server-warp
    restart: unless-stopped

  chatgpt-proxy-server-warp:
    container_name: chatgpt-proxy-server-warp
    image: linweiyuan/chatgpt-proxy-server-warp
    environment:
      - LOG_LEVEL=INFO
    restart: unless-stopped

与chatgpt-web同网段

推荐比较了解docker的小伙伴选用。一种更加安全的使用反向代理的方法。

此隐藏内容仅限VIP查看。包年VIP仅10元,建议升级。VIP可享有哪些特权

在本地Linux系统自建反向代理

适合本地有可通过帐号/密码访问OpenAI的节点、有长期开启的Linux主机/虚拟机、对docker较熟悉的小伙伴

有些朋友问:如果我在本地可以访问OpenAI,并且有个Linux系统(比如NAS或虚拟机),是否可以自建一个类似WARP的绕过检查的反向代理?答案是肯定的。具体步骤如下:

此隐藏内容仅限VIP查看。包年VIP仅10元,建议升级。VIP可享有哪些特权

Access Token相关Docker Compose

关于Access Token功能的最新进展可关注该issue: Bug: 使用access token时存在 Cannot read properties of undefined (reading ‘choices’) 报错 · Issue #24 · Kerwin1202/chatgpt-web

建议优先尝试latest版本 (ฅ´ω`ฅ) Access Token的yaml内容和API类似:

version: '3'

services:
  app:
    image: kerwin1202/chatgpt-web:latest
    restart: unless-stopped
    ports:
      - 1004:3002
    environment:
      TZ: Asia/Shanghai
      # 访问jwt加密参数,可选 不为空则允许登录 同时需要设置 MONGODB_URL
      AUTH_SECRET_KEY: 12345678abcdefg # 按需修改
      # API or Access Token模式
      OPENAI_API_MODEL: ChatGPTUnofficialProxyAPI # 在较新版本时需要该参数
      # 你的openai access token
      OPENAI_ACCESS_TOKEN: xxx # 这一串很长很长的。
      # OpenAI绕过Cloudflare验证的反向代理
      # API_REVERSE_PROXY: https://bypass.churchless.tech/api/conversation
      API_REVERSE_PROXY: 你的自建反向代理或某个可用反向代理
      # 超时,单位毫秒,可选
      TIMEOUT_MS: 60000
      # 网站名
      SITE_TITLE: TokenChat # 按需修改。写个自己喜欢的名字就行
      # mongodb 的连接字符串
      MONGODB_URL: 'mongodb://user01:password01@database:27017' # 按需修改
      # 网站是否开启注册
      REGISTER_ENABLED: true # 完成注册后,可以在前端页面关闭注册
      # 开启注册之后 网站注册允许的邮箱后缀 如果空 则允许任意后缀
      REGISTER_MAILS: '@qq.com,@gmail.com,@163.com' # 按需修改
      # 加密盐。算法: echo -n 'passwordsalt' | md5sum | cut -c 1-32
      PASSWORD_MD5_SALT: tNJ%M&D # 按需修改
      # 开启注册之后 超级管理员的邮箱
      ROOT_USER: [email protected] # 按需修改
      # 前面一定要有https://或http://,且末尾不含/。注册的时候发送验证邮箱使用。
      SITE_DOMAIN: https://chatgpt.hwb0307.com # 按需修改
      # 开启注册之后 发送验证邮箱配置
      SMTP_HOST: smtp.qq.com
      SMTP_PORT: 465 # 也可以尝试587
      SMTP_TSL: true
      SMTP_USERNAME: [email protected] # 按需修改
      SMTP_PASSWORD: xxxxxxxx # 按需修改
    links:
      - database
    depends_on:
      - database

  database:
    # image: mongo:3.6 # 为了支持v2.13.0+版本,不再使用mongodb 3.x
    image: mongo:4.0
    restart: unless-stopped
    expose:
      - '27017'
    volumes:
      - ./mongodb:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: user01
      MONGO_INITDB_ROOT_PASSWORD: password01
      MONGO_INITDB_DATABASE: chatgpt

  gui:
    image: mongo-express:1.0.0-alpha
    restart: unless-stopped
    ports:
      - "1005:8081"
    environment:
      # 选择主题。详见: http://codemirror.net/demo/theme.html
      ME_CONFIG_OPTIONS_EDITORTHEME: ambiance
      # 数据库信息
      ME_CONFIG_BASICAUTH_USERNAME: user02
      ME_CONFIG_BASICAUTH_PASSWORD: password02
      ME_CONFIG_MONGODB_URL: 'mongodb://user01:password01@database:27017'
      ME_CONFIG_MONGODB_ENABLE_ADMIN: true # 可能不是必要的
      ME_CONFIG_MONGODB_ADMINUSERNAME: user01 # 可能不是必要的
      ME_CONFIG_MONGODB_ADMINPASSWORD: password01 # 可能不是必要的

直接上线:

docker-compose up -d

更新方式同API,不再细说。

合并方案

由于我还是想保持足够的灵活性,并没有将chatgpt-web和反向代理合并在同一个docker stack里。

如果你的自建反向代理只有chatgpt-web使用,建议这样安装chatgpt-web和反向代理:

version: '3'

services:
  # chatgpt-web
  app:
    image: kerwin1202/chatgpt-web:latest
    restart: unless-stopped
    ports:
      - 1004:3002
    environment:
      TZ: Asia/Shanghai
      # 访问jwt加密参数,可选 不为空则允许登录 同时需要设置 MONGODB_URL
      AUTH_SECRET_KEY: 12345678abcdefg # 按需修改
      # API or Access Token模式
      OPENAI_API_MODEL: ChatGPTUnofficialProxyAPI # 在较新版本时需要该参数
      # 你的openai access token
      OPENAI_ACCESS_TOKEN: xxx # 这一串很长很长的。
      # 自建OpenAI绕过Cloudflare验证的反向代理
      API_REVERSE_PROXY: http://go-chatgpt-api:8080/chatgpt/conversation
      # 超时,单位毫秒,可选
      TIMEOUT_MS: 60000
      # 网站名
      SITE_TITLE: TokenChat # 按需修改。写个自己喜欢的名字就行
      # mongodb 的连接字符串
      MONGODB_URL: 'mongodb://user01:password01@database:27017' # 按需修改
      # 网站是否开启注册
      REGISTER_ENABLED: true # 完成注册后,这一项要改为false
      # 开启注册之后 网站注册允许的邮箱后缀 如果空 则允许任意后缀
      REGISTER_MAILS: '@qq.com,@gmail.com,@163.com' # 按需修改
      # 加密盐。算法: echo -n 'passwordsalt' | md5sum | cut -c 1-32
      PASSWORD_MD5_SALT: tNJ%M&D # 按需修改
      # 开启注册之后 超级管理员的邮箱
      ROOT_USER: [email protected] # 按需修改
      # 前面一定要有https://或http://,且末尾不含/。注册的时候发送验证邮箱使用。
      SITE_DOMAIN: https://chatgpt.hwb0307.com # 按需修改
      # 开启注册之后 发送验证邮箱配置
      SMTP_HOST: smtp.qq.com
      SMTP_PORT: 465 # 也可以尝试587
      SMTP_TSL: true
      SMTP_USERNAME: [email protected] # 按需修改
      SMTP_PASSWORD: xxxxxxxx # 按需修改
    links:
      - database
    depends_on:
      - database

  # 数据库
  database:
    image: mongo:3.6
    restart: unless-stopped
    expose:
      - '27017'
    volumes:
      - ./mongodb:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: user01
      MONGO_INITDB_ROOT_PASSWORD: password01
      MONGO_INITDB_DATABASE: chatgpt

  # 数据库图形界面
  gui:
    image: mongo-express:1.0.0-alpha
    restart: unless-stopped
    ports:
      - "1005:8081"
    environment:
      # 选择主题。详见: http://codemirror.net/demo/theme.html
      ME_CONFIG_OPTIONS_EDITORTHEME: ambiance
      # 数据库信息
      ME_CONFIG_BASICAUTH_USERNAME: user02
      ME_CONFIG_BASICAUTH_PASSWORD: password02
      ME_CONFIG_MONGODB_URL: 'mongodb://user01:password01@database:27017'
      ME_CONFIG_MONGODB_ENABLE_ADMIN: true # 可能不是必要的
      ME_CONFIG_MONGODB_ADMINUSERNAME: user01 # 可能不是必要的
      ME_CONFIG_MONGODB_ADMINPASSWORD: password01 # 可能不是必要的

  # 绕过Cloudflare验证的反向代理
  go-chatgpt-api:
    container_name: go-chatgpt-api
    image: linweiyuan/go-chatgpt-api:20230504095144 # 较稳
    # image: linweiyuan/go-chatgpt-api:latest # 最新
    expose:
      - '8080'
    environment:
      - GIN_MODE=release
      - GO_CHATGPT_API_PROXY=socks5://chatgpt-proxy-server-warp:65535
    depends_on:
      - chatgpt-proxy-server-warp
    restart: unless-stopped

  chatgpt-proxy-server-warp:
    container_name: chatgpt-proxy-server-warp
    image: linweiyuan/chatgpt-proxy-server-warp
    restart: unless-stopped

其中,我们的API_REVERSE_PROXY: http://go-chatgpt-api:8080/chatgpt/backend-api/conversation直接使用了该stack里的反向代理go-chatgpt-api,避免了反向代理的8080端口向宿主机映射,因此更加安全,不可能被外界IP白嫖。

更换反向代理

如果旧的代理如果要更换代理,可以按下列步骤操作:

  • 在数据库后台、网页前台更换代理。
  • docker-compose.yml 的旧代理修改为新代理。
  • docker-compose restart重启stack。
  • 通过docker-compose logs -f观察日志,并输入test等命令测试代理是否更改。当且仅当日志中的代理地址改变,更换代理才算正式生效。

这样更改一般是可以成功的。自己试试看!

检查数据库

上线后登陆Mongo Express,进入config

msedge_n025eMCpY8

双击该记录,检查参数是否正确:

msedge_1Oumntc7F5

如果参数不正确,记得改正。修改后按右下角的Save保存即可。这些参数在数据库里改是最有效的。只在docker-compose.yml里改是不够的;这可能也是开发者考虑得不太周全的地方。

刷新chatGPT前端页面

打开无痕浏览器(防止缓存和cookie的影响),输入邮箱和密码进入chatGPT,测试一下是否正常:

msedge_5q8lLxnyz0

如果返回的是正常聊天信息就说明成功了。这时在openai后台检查可看到同样的聊天:

msedge_jipXHPFXXv

如果有其它error,就要具体情况具体分析。有问题欢迎在评论区留言!

小结

我怀疑由于前端项目的限制,数据库的能力并没有被充分发挥。该项目还有以下缺陷:

  • 不支持流量/付费控制
  • Prompts并不保存在数据库内;Prompts不可以随意改变位置或置顶

除此之外,随着开发工作的进行,偶尔会有些小bug。总之,该项目目前并不完美,还有很大的进步空间。不过,近期作者维护和升级得很频繁,与用户的互动也比较积极。所以,我感觉Kerwin1202/chatgpt-web是一个前途不错的开源项目,值得持续关注 (ฅ´ω`ฅ)

还有一个类似的chatgpt-web衍生项目: gouguoyin/chatgpt-web,它的文档“展示”了许多功能,包括登录注册、管理后台、设置首次登录赠送免费提问次数、key轮询池、卡券套餐管理、对话管理、敏感词管理、自定义回复管理、提示词prompt管理、卡密套餐管理、卡密生成和核销等。但gouguoyin/chatgpt-web似乎是一个付费应用。只能说,有高级需求并感兴趣的小伙伴可以了解喽 (~ ̄▽ ̄)~ 也可以加入开发者的QQ群145225165关注开发工作。

值得关注的是,Chanzhaoyu大佬在2023-04-26建了一个QQ群734133205,介绍了源项目的plus版本——chatgpt-web-plus,其包含个人部署、商业部署、企业部署和团队部署等内容。项目地址在Chanzhaoyu/chatgpt-web-plus,非开源且付费(好像是1000多元/份?)。感兴趣的小伙伴可以关注 chatgpt-web-plus · Issue #1606 · Chanzhaoyu/chatgpt-web

关于自建chatGPT的介绍暂时到这里。以后有更实用的项目,我会详细介绍的!欢迎加入tg群交流,或通过RSS免费订阅我的博客喔!

拓展阅读

项目

ChatGPT的第三方版本或类ChatGPT项目

msedge_B6WjqNsh1y

msedge_rvnzoV13Qi

demo2.png

插件

官方ChatGPT的增强浏览器插件。

  • xcanwin/KeepChatGPT:一个近期比较流行的chatGPT官网增强工具。让ChatGPT的使用过程中更高效、更顺畅。它完美解决ChatGPT网络错误,不再频繁地刷新网页,省去10个多余的步骤。还可以取消后台监管审计。解决了这几类报错: (1) NetworkError when attempting to fetch resource. (2) Something went wrong. If this issue persists please contact us through our help center at help.openai.com. (3) This content may violate our content policy. (4) Conversation not found. 据说效果不错!
  • josStorer/chatGPTBox: 一个十分优秀的ChatGPT浏览器插件。支持随时调出任意页面的聊天对话框;支持移动设备;使用右键单击菜单总结任何页面;独立的对话页面;多种 API 支持(免费和 Plus 用户的 Web API、GPT-3.5、GPT-4、New Bing、Self-Hosted、Azure、Poe 等);集成各种常用网站(Reddit、Quora、YouTube、GitHub、GitLab、StackOverflow、知乎、Bilibili);集成到所有主流搜索引擎和自定义查询以支持其他站点;选择工具和右键菜单可执行翻译、摘要、润色、情感分析、段落划分、代码解释和查询等各种任务;静态卡片支持多分支对话的浮动聊天框;轻松保存完整聊天记录或部分复制;强大的渲染支持,无论是代码高亮还是复杂的数学公式;语言偏好支持;自定义 API 地址支持;所有站点适配和选择工具(气泡)可以自由打开或关闭,禁用不需要的模块;聊天以提高答案质量。
  • binary-husky/chatgpt_academic: 科研工作专用ChatGPT/GLM拓展,特别优化学术Paper润色体验,模块化设计支持自定义快捷按钮&函数插件,支持代码块表格显示,Tex公式双显示,新增Python和C++项目剖析&自译解功能,PDF/LaTex论文翻译&总结功能,支持并行问询多种LLM模型,支持gpt-3.5/gpt-4/chatglm。
  • C-Nedelcu/talk-to-chatgpt:Talk-to-ChatGPT 是 Google Chrome 和 Microsoft Edge 的扩展,允许用户使用他们的语音(语音识别)与 ChatGPT AI 交谈,并通过语音(文本到语音)聆听机器人的回答,而不仅仅是通过打字。使用此工具,用户可以与 AI 对话并接收语音回复,使交互感觉更加自然和对话。这可能在各种环境中都很有用,在这些环境中,与 AI 进行更像人类的交互会很有帮助。类似的项目还有Voice Control for ChatGPT

应用

ChatGPT的衍生应用。

教程

使用(类)ChatGPT的技巧

观点

AIGC/AGI相关新闻或观点

寄语

后续有更好的开源免费项目,我也会陆续介绍。祝大家使用愉快!有问题记得加tg群或评论区留言!

---------------
完结,撒花!如果您点一下广告,可以养活苯苯😍😍😍

感谢ZGOCLOUD友情赞助 (ฅ´ω`ฅ) 本博客基于m2w创作。版权声明:除特殊说明,博客文章均为Bensz原创,依据CC BY-SA 4.0许可证进行授权,转载请附上出处链接及本声明。VIP内容严禁转载!由于可能会成为AI模型(如chatGPT)的训练样本,本博客禁止将AI自动生成内容作为文章上传(特别声明时除外)。如有需要,请至学习地图系统学习本博客的教程。加Telegram群可获得更多帮助喔! | 博客订阅:RSS | 广告招租请留言 | 博客VPS | 致谢渺软公益CDN |

评论

  1. yuuki280
    Windows Edge 123.0.0.0
    7 天前
    2024-4-13 18:55:37

    博主您好,有些问题可以交流一下吗,qq:1216054879

  2. arthurfsy
    Windows Edge 121.0.0.0
    已编辑
    3 月前
    2024-2-04 16:43:32

    国内阿里云终于部署成功了,是参考“10.4 合并方案”的compose代码,但是还是踩坑。

    1. 19行的API_REVERSE_PROXY: http://go-chatgpt-api:8080/chatgpt/conversation需要改为:API_REVERSE_PROXY: http://go-chatgpt-api:8080/chatgpt/backend-api/conversation
    2. 80的镜像需要使用81行的latest,20230504095144这个版本在hub.docker.com是没有了。# image: linweiyuan/go-chatgpt-api:latest # 最新
    3. 86行的- GO_CHATGPT_API_PROXY=socks5://chatgpt-proxy-server-warp:65535需要改为PROXY=socks5://chatgpt-proxy-server-warp:65535
      注意:如果服务器是国内的,还需要对服务器进行科学上网,并将链接改为自己的代理链接。
      参考这个可以在服务器上部署clash(前提是你已经有梯子的yml了)
  3. sam
    Windows Chrome 120.0.0.0
    3 月前
    2024-1-12 13:33:50

    root@ip-172-31-28-151:~/chatgpt# docker logs -f go-chatgpt-api
    ERRO[0000] failed to start, please try again later: 403 Forbidden这个怎么解决呀

    • 博主
      sam
      Windows Edge 120.0.0.0
      3 月前
      2024-1-12 22:17:51

      这提示您的VPS线路可能不太适合安装go-chatgpt-api。可能无解 Σ( ° △ °|||)︴

  4. wy18218701210
    Macintosh Chrome 112.0.0.0
    5 月前
    2023-11-16 15:48:28

    ⠿ chatgpt-proxy-server Error 2.0s
    ⠿ go-chatgpt-api Error 2.0s
    Error response from daemon: pull access denied for linweiyuan/chatgpt-proxy-server, repository does not exist or may require ‘docker login’: denied: requested access to the resource is denied
    使用docker login之后依然报错

    • 博主
      wy18218701210
      Windows Edge 119.0.0.0
      5 月前
      2023-11-16 19:57:14

      镜像显然还是存在的( https://hub.docker.com/u/linweiyuan ),但似乎作者不再维护了。 因此可能是其它问题。你下载其它镜像的时候会遇到类似的问题吗?

    • 博主
      wy18218701210
      Windows Edge 119.0.0.0
      5 月前
      2023-11-16 19:58:05

      有一种可能性,就是你的镜像源里可能不存在这个镜像。但这种可能性不是很大,你注意排除下吧

      • wy18218701210
        Bensz
        iPhone Safari 603.2.4
        5 月前
        2023-11-16 20:10:42

        docker search 镜像没有东西出来

      • 博主
        wy18218701210
        Windows Edge 119.0.0.0
        5 月前
        2023-11-16 20:13:10

        我刚刚试了一下docker pull linweiyuan/go-chatgpt-api:latest是可以成功下载的。估计是你的镜像源的问题;或者是你的VPS的架构问题(x86 vs. ARM)。

      • wy18218701210
        Bensz
        Macintosh Chrome 112.0.0.0
        5 月前
        2023-11-17 15:41:29

        docker-compose logs go-chatgpt-api
        一直是这个报错
        go-chatgpt-api | ERRO[0000] failed to start, please try again later: 403 Forbidden

      • 博主
        wy18218701210
        Windows Edge 119.0.0.0
        5 月前
        2023-11-17 15:42:54

        留个QQ,我加一下。准备好todesk,我抽空帮你看看

      • wy18218701210
        Bensz
        Macintosh Chrome 112.0.0.0
        5 月前
        2023-11-17 15:46:53

        1761353979

  5. 谢艺
    Windows Chrome 109.0.0.0
    5 月前
    2023-11-10 12:26:36

    博主可以出一篇chatgpt-web-share的教程么。看说明文档好混乱

    • 博主
      谢艺
      Windows Edge 119.0.0.0
      5 月前
      2023-11-10 21:37:09

      恐怕不行,因为我并没有在使用chatgpt-web-share,也并不感兴趣 Σ( ° △ °|||)︴

  6. Windows Edge 117.0.2045.47
    7 月前
    2023-10-08 0:31:25

    楼主我想问一下,为什么我的设置只有总览、高级和统计三个部分,其他都没有。感觉是残血版了。是不是我的docker-compose.yml文件有问题
    version: ‘3’
    services:
    app:
    image: kerwin1202/chatgpt-web:latest
    restart: unless-stopped
    ports:

    • 1004:3002
      depends_on:
    • database
      environment:
      TZ: Asia/Shanghai

      API or Access Token模式

      OPENAI_API_MODEL: ChatGPTAPI # 在较新版本时可能需要该参数

      默认模型。默认是gpt-3.5-turbo

      OPENAI_API_MODEL: gpt-3.5-turbo-0613

      从OpenAI后台里获得

      OPENAI_API_KEY: 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 # 按需修改

      访问jwt加密参数,可选 不为空则允许登录 同时需要设置 MONGODB_URL

      AUTH_SECRET_KEY: 12345678abcdefg # 按需修改

      超时,单位毫秒,可选

      TIMEOUT_MS: 60000

      网站名

      SITE_TITLE: APIChat # 按需修改。写个自己喜欢的名字就行

      mongodb 的连接字符串

      MONGODB_URL: ‘mongodb://user01:password01@database:27017’ # 按需修改

      网站是否开启注册

      REGISTER_ENABLED: true # 完成注册后,可以直接在前端页面关闭注册。

      开启注册之后 网站注册允许的邮箱后缀 如果空 则允许任意后缀

      REGISTER_MAILS: ‘@qq.com,@gmail.com,@163.com’ # 按需修改

      加密盐。算法: echo -n ‘passwordsalt’ | md5sum | cut -c 1-32

      PASSWORD_MD5_SALT: tNJ%M&D # 按需修改

      开启注册之后 超级管理员的邮箱

      ROOT_USER: [email protected] # 按需修改

      前面一定要有https://或http://,且末尾不含/。注册的时候发送验证邮箱使用。

      SITE_DOMAIN: http://www.aptx-4869.eu.org:1004 # 按需修改

      开启注册之后 发送验证邮箱配置

      SMTP_HOST: smtp.qq.com
      SMTP_PORT: 465 # 也可以尝试587
      SMTP_TSL: true
      SMTP_USERNAME: [email protected] # 按需修改
      SMTP_PASSWORD: ybdivbbhutlfbjge # 按需修改
      links:

    • database

    database:

    image: mongo:3.6 # 为了支持v2.13.0+版本,不再使用mongodb 3.x

    image: mongo:4.0
    restart: unless-stopped
    ports:
      - '27017:27017'
    expose:
      - '27017'
    volumes:
      - ./mongodb:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: user01 # 按需修改
      MONGO_INITDB_ROOT_PASSWORD: password01 # 按需修改
      MONGO_INITDB_DATABASE: chatgpt

    gui:
    image: mongo-express:1.0.0-alpha
    restart: unless-stopped
    ports:

    • “1005:8081”
      environment:

      选择主题。详见: http://codemirror.net/demo/theme.html

      ME_CONFIG_OPTIONS_EDITORTHEME: ambiance

      数据库信息

      ME_CONFIG_BASICAUTH_USERNAME: user02 # 按需修改
      ME_CONFIG_BASICAUTH_PASSWORD: password02 # 按需修改
      ME_CONFIG_MONGODB_URL: ‘mongodb://user01:password01@database:27017’
      ME_CONFIG_MONGODB_ENABLE_ADMIN: true # 可能不是必要的
      ME_CONFIG_MONGODB_ADMINUSERNAME: user01 # 可能不是必要的
      ME_CONFIG_MONGODB_ADMINPASSWORD: password01 # 可能不是必要的

    volumes:
    mongodb: {}

    • derong lin
      Windows Edge 117.0.2045.47
      7 月前
      2023-10-08 0:32:07

      我的qq是1826387316,可以加个qq方便发图片吗?

    • 博主
      derong lin
      Windows Edge 117.0.2045.47
      6 月前
      2023-10-08 20:26:45

      你现在登陆的帐号是管理员帐号吗?如果不是就没有很多选项.

  7. Windows Edge 117.0.2045.47
    7 月前
    2023-10-07 23:43:25

    楼主大大,为什么我的设置只有总览、高级和统计三个部分的呢?感觉好残血版。是不是monggodb的部分哪里没有弄完全
    version: ‘3’
    services:
    app:
    image: kerwin1202/chatgpt-web:latest
    restart: unless-stopped
    ports:

    • 1004:3002
      depends_on:
    • database
      environment:
      TZ: Asia/Shanghai

      API or Access Token模式

      OPENAI_API_MODEL: ChatGPTAPI # 在较新版本时可能需要该参数

      默认模型。默认是gpt-3.5-turbo

      OPENAI_API_MODEL: gpt-3.5-turbo-0613

      从OpenAI后台里获得

      OPENAI_API_KEY: sk-qjgZEONyPWgGBaktvBkpT3BlbkFJPAx66xxxxxxx # 按需修改

      访问jwt加密参数,可选 不为空则允许登录 同时需要设置 MONGODB_URL

      AUTH_SECRET_KEY: 12345678abcdefg # 按需修改

      超时,单位毫秒,可选

      TIMEOUT_MS: 60000

      网站名

      SITE_TITLE: APIChat # 按需修改。写个自己喜欢的名字就行

      mongodb 的连接字符串

      MONGODB_URL: ‘mongodb://user01:password01@database:27017’ # 按需修改

      网站是否开启注册

      REGISTER_ENABLED: true # 完成注册后,可以直接在前端页面关闭注册。

      开启注册之后 网站注册允许的邮箱后缀 如果空 则允许任意后缀

      REGISTER_MAILS: ‘@qq.com,@gmail.com,@163.com’ # 按需修改

      加密盐。算法: echo -n ‘passwordsalt’ | md5sum | cut -c 1-32

      PASSWORD_MD5_SALT: tNJ%M&D # 按需修改

      开启注册之后 超级管理员的邮箱

      ROOT_USER: [email protected] # 按需修改

      前面一定要有https://或http://,且末尾不含/。注册的时候发送验证邮箱使用。

      SITE_DOMAIN: http://www.aptx-4869.eu.org:1004 # 按需修改

      开启注册之后 发送验证邮箱配置

      SMTP_HOST: smtp.qq.com
      SMTP_PORT: 465 # 也可以尝试587
      SMTP_TSL: true
      SMTP_USERNAME: [email protected] # 按需修改
      SMTP_PASSWORD: ybdivbbxxxxx # 按需修改
      links:

    • database

    database:

    image: mongo:3.6 # 为了支持v2.13.0+版本,不再使用mongodb 3.x

    image: mongo:4.0
    restart: unless-stopped
    ports:
      - '27017:27017'
    expose:
      - '27017'
    volumes:
      - ./mongodb:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: user01 # 按需修改
      MONGO_INITDB_ROOT_PASSWORD: password01 # 按需修改
      MONGO_INITDB_DATABASE: chatgpt

    gui:
    image: mongo-express:1.0.0-alpha
    restart: unless-stopped
    ports:

    • “1005:8081”
      environment:

      选择主题。详见: http://codemirror.net/demo/theme.html

      ME_CONFIG_OPTIONS_EDITORTHEME: ambiance

      数据库信息

      ME_CONFIG_BASICAUTH_USERNAME: user02 # 按需修改
      ME_CONFIG_BASICAUTH_PASSWORD: password02 # 按需修改
      ME_CONFIG_MONGODB_URL: ‘mongodb://user01:password01@database:27017’
      ME_CONFIG_MONGODB_ENABLE_ADMIN: true # 可能不是必要的
      ME_CONFIG_MONGODB_ADMINUSERNAME: user01 # 可能不是必要的
      ME_CONFIG_MONGODB_ADMINPASSWORD: password01 # 可能不是必要的

    volumes:
    mongodb: {}
    这是我的docker-compose.yml文件

  8. valley
    Windows Chrome 116.0.0.0
    已编辑
    7 月前
    2023-9-21 17:24:28

    博主,我搭建好之后,无法访问到前端和数据库,可用帮我看下么。qq:982777253

    • 博主
      valley
      Windows Edge 117.0.2045.31
      7 月前
      2023-9-21 22:03:31

      最近比较忙,没时间。可以问问群里的小伙伴有没有时间呀 (~ ̄▽ ̄)~ https://t.me/benszhub

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇