项目地址:Kerwin1202/chatgpt-web: 用 Express 和 Vue3 搭建的 ChatGPT 演示网页 (github.com)
参考教程:项目readme及Docker系列 基于OpenAI API和Access Token自建chatGPT - Bensz (hwb0307.com)
一、docker-compose部署
部分环境变量说明:
AUTH_SECRET_KEY
:源项目是登陆密钥。这里暂时不知道有什么用。注册过程似乎用不到AUTH_SECRET_KEY
选项,但必须要提供,否则可能报错。MongoDB
:数据库名chatgpt
,用户名chatgpt
,密码xxxx
。这里要注意mongodb url的书写格式——mongodb://用户名:密码@database:27017
,其中database
是该stack中数据库的“小名”,而27017
是暴露于stack局域网中的默认端口号。
version: '3'
services:
app:
image: kerwin1202/chatgpt-web # 总是使用latest,更新时重新pull该tag镜像即可
container_name: chatgptweb
restart: unless-stopped
ports:
- 3002:3002
depends_on:
- database
environment:
TZ: Asia/Shanghai
# OPENAI的API
OPENAI_API_KEY: sk-xxx
# API接口地址,可选,设置 OPENAI_API_KEY 时可用
OPENAI_API_BASE_URL: xxx
# ChatGPTAPI或者ChatGPTUnofficialProxyAPI,对应两种调用方式
OPENAI_API_MODEL: ChatGPTAPI
# 每小时最大请求次数,可选,默认无限
MAX_REQUEST_PER_HOUR: 0
# 超时,单位毫秒,可选
TIMEOUT_MS: 600000
# 访问jwt加密参数,可选 不为空则允许登录 同时需要设置 MONGODB_URL
AUTH_SECRET_KEY: xxx
# 网站名称
SITE_TITLE: ChatGpt Web
# mongodb 的连接字符串
MONGODB_URL: 'mongodb://chatgpt:xxxx@database:27017'
# 网站是否开启注册
REGISTER_ENABLED: 'true'
# 开启注册之后 网站注册允许的邮箱后缀 如果空 则允许任意后缀
REGISTER_MAILS: '@qq.com,@sina.com,@163.com,@outlook.com,@google.com'
# 开启注册之后 密码加密的盐
PASSWORD_MD5_SALT: xxx
# 开启注册之后 超级管理邮箱
ROOT_USER: me@example.com
# 开启注册之后 网站域名 结尾不含 / 注册的时候发送验证邮箱使用
SITE_DOMAIN: http://127.0.0.1:3002
# 开启注册之后 发送验证邮箱配置
SMTP_HOST: smtp.qq.com
SMTP_PORT: 465
SMTP_TSL: 'true'
SMTP_USERNAME: noreply@examile.com
SMTP_PASSWORD: xxx
# 是否开启敏感词审核, 因为响应结果是流式 所以暂时没审核
AUDIT_ENABLED: 'false'
# https://ai.baidu.com/ai-doc/ANTIPORN/Vk3h6xaga
AUDIT_PROVIDER: baidu
AUDIT_API_KEY: xxx
AUDIT_API_SECRET: xxx
AUDIT_TEXT_LABEL: xxx
links:
- database
database:
image: mongo
container_name: chatgptweb-database
restart: unless-stopped
ports:
- '27017:27017'
expose:
- '27017'
volumes:
- mongodb:/data/db
environment:
MONGO_INITDB_ROOT_USERNAME: chatgpt
MONGO_INITDB_ROOT_PASSWORD: xxxx
MONGO_INITDB_DATABASE: chatgpt
volumes:
mongodb: {}
二、容器控制
# 后台上线
docker-compose up -d
# 下线
docker-compose down
# 拉取chatgpt-web latest镜像
docker-compose pull
三、mongoDB数据库管理
1、配置远程连接
# 进入容器
docker exec -it mongodb bash
# 更新源
apt-get update
#安装 vim
apt-get install vim
#修改 mongo 配置文件
vim /etc/mongod.conf.orig
将其中的bindIp: 127.0.0.1注释掉# bindIp: 127.0.0.1 或者改成bindIp: 0.0.0.0 即可开启远程连接
之后,宿主机开放端口27017(云服务器还需要开启防火墙端口),即可通过上面yml文件里的mongodb://chatgpt:xxxx@服务器IP:27017
远程访问。
2、数据库结构介绍
根据docker-compose的设定,该stack的数据库名为chatgpt
,它目前包含chat
、chat_room
、config
和user
等4个collection:
较新的版本里还有统计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: 'hwb2012@qq.com',
smtpPassword: 'xxxxxx'
}
}
3、添加非注册用户
由于我们使用了数据库托管,所以可以轻易地操作数据库以生成新用户。这里我简单展示如何新增一个用户。
首先,我们登陆MongoDB,进入chatGPT
数据库的user
collection:
这里我创建了一个测试用户test@qq.com
。我们双击该记录查看具体信息,如下:
{ _id: ObjectId('6434ececdf45624abb1d190a'), name: 'test@qq.com', email: 'test@qq.com', 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
暂时不知道是什么。createTime
和verifyTime
代表创建和验证时间,差不多是间隔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
新增一条记录并保存,这样就可以在不开放注册的情况下添加用户。
4、备份数据
首先,我们在映射到宿主机的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 to2023-04-11T23:50:29.533+0000 writing chatgpt.chat_room to2023-04-11T23:50:29.533+0000 writing chatgpt.user to2023-04-11T23:50:29.534+0000 writing chatgpt.config to2023-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。
5、恢复数据
首先,将之前的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 admindocker 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 instead2023-04-12T00:10:19.121+0000 building a list of collections to restore from /data/db/chatgpt dir2023-04-12T00:10:19.122+0000 reading metadata for chatgpt.chat from /data/db/chatgpt/chat.metadata.json2023-04-12T00:10:19.122+0000 reading metadata for chatgpt.user from /data/db/chatgpt/user.metadata.json2023-04-12T00:10:19.123+0000 reading metadata for chatgpt.chat_room from /data/db/chatgpt/chat_room.metadata.json2023-04-12T00:10:19.224+0000 reading metadata for chatgpt.config from /data/db/chatgpt/config.metadata.json2023-04-12T00:10:19.224+0000 restoring chatgpt.chat_room from /data/db/chatgpt/chat_room.bson2023-04-12T00:10:19.301+0000 restoring chatgpt.chat from /data/db/chatgpt/chat.bson2023-04-12T00:10:19.369+0000 restoring chatgpt.user from /data/db/chatgpt/user.bson2023-04-12T00:10:19.515+0000 no indexes to restore2023-04-12T00:10:19.515+0000 finished restoring chatgpt.chat_room (12 documents)2023-04-12T00:10:19.515+0000 no indexes to restore2023-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.bson2023-04-12T00:10:19.516+0000 no indexes to restore2023-04-12T00:10:19.516+0000 finished restoring chatgpt.chat (55 documents)2023-04-12T00:10:19.517+0000 no indexes to restore2023-04-12T00:10:19.517+0000 finished restoring chatgpt.config (1 document)2023-04-12T00:10:19.517+0000 done