docker搭建chatGPT-web对接api

项目地址: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,它目前包含chatchat_roomconfiguser等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暂时不知道是什么。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新增一条记录并保存,这样就可以在不开放注册的情况下添加用户。

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
无标签