侧边栏壁纸
博主头像
琉璃红梅 博主等级

琉璃世界,白雪红梅。

  • 累计撰写 44 篇文章
  • 累计创建 90 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Docker系列-LobeChat(数据库版本)的搭建与使用

雪穗
2024-10-07 / 0 评论 / 0 点赞 / 72 阅读 / 0 字
温馨提示:
本文最后更新于39天前,若内容或图片失效,请留言反馈。 若部分素材不小心影响到您的利益,请联系我删除。

1.LobeChat简介

LobeChat 是开源的高性能聊天机器人框架,支持语音合成、多模态、可扩展的(Function Call)插件系统。支持一键免费部署私人 ChatGPT/LLM 网页应用程序,更为详细的介绍到请前往LobeChat的官网。
我发过一篇部署LobeChat服务的文章——docker系列-LobeChat(客户端版本)的搭建与使用,之前部署的为客户端版本,即对话记录和模型配置全部保存在客户端浏览器中,这种部署方式的优点是部署十分简单,缺点就是数据保存在本地,一旦清除浏览器缓存,所有数据就会消失。而本文部署的是LobeChat数据库版本,将使用过程中的数据保存在服务器的数据库中,并且设置登录后才可以访问LobeChat服务。

LobeChat的官网:https://lobehub.com/zh
LobeChat的GitHub地址:https://github.com/lobehub/lobe-chat

2.LobeChat的安装

安装前提:

1.备好服务器

2.已经安装好docker和docker compose,请参看我的博文 docker系列-docker与docker compose安装

安装建议:

1.将所有docker项目放在统一目录 /root/data/docker_data/ 下,方面后期管理与维护

2.添加SWAP虚拟内存,请参看我的博文 添加 SWAP 虚拟内存

2.1 创建安装目录

mkdir -p /root/data/docker_data/lobechat

2.2 创建docker-compose.yaml和.env文件并上传至服务器

上传 docker-compose.yaml.env 文件到lobechat目录下,

docker-compose.yaml 内容如下:

services:
  postgresql:
    image: pgvector/pgvector:pg16
    container_name: postgres
    ports:
      - 5432:5432                                           #左侧为postgresql数据库映射端口,如果冲突,自行修改
    volumes:
      - ./pgdb_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=lobe                                #数据库名
      - POSTGRES_PASSWORD=2gvxtIMuLG6h3n6    #数据库密码
    healthcheck:                                              #安全检查
      test: [ 'CMD-SHELL', 'pg_isready -U postgres' ]
      interval: 5s
      timeout: 5s
      retries: 5
    restart: always

  minio:
    image: minio/minio
    container_name: minio
    ports:
      - 9000:9000 #minio api
      - 9001:9001 #minio ui,左侧端口如果冲突,自行修改,同时需要修改 command 中的对应端口
    volumes:
      - ./minios3_data:/etc/minio/data
    environment:
      - MINIO_ROOT_USER=admin                          #Minio控制台登录用户名,自行修改
      - MINIO_ROOT_PASSWORD=Xwkgs9L6gje8yZ5    #Minio控制台登录密码,自行修改
      - MINIO_DOMAIN=minio-api.example.com          #Minio api域名,自行修改
    restart: always
    command: >
      server /etc/minio/data --address ":9000" --console-address ":9001"

  logto:
    image: svhd/logto
    container_name: logto
    ports:
      - 3001:3001 #logto api,左侧端口如果冲突,自行修改
      - 3002:3002 #logto ui,左侧端口如果冲突,自行修改
    depends_on:
      postgresql:
        condition: service_healthy
    environment:
      - TRUST_PROXY_HEADER=1
      - DB_URL=postgresql://postgres:2gvxtIMuLG6h3n6@postgresql:5432/logto  #密码与数据库密码保持一致
      - ENDPOINT=https://logto-api.example.com            #logto api域名,自行修改
      - ADMIN_ENDPOINT=https://logto-ui.example.com    #logto ui域名,自行修改
    entrypoint: [ 'sh', '-c', 'npm run cli db seed -- --swe && npm start' ]

  lobe:
    image: lobehub/lobe-chat-database
    container_name: lobe-database
    ports:
      - 3210:3210                         #左侧为lobechat服务访问端口,如果冲突,自行修改
    depends_on:
      - postgresql
      - minio
      - logto
    env_file:
      - .env
    restart: always

volumes:                                 #卷的名字与上方地址映射保持一致
  pgdb_data:
    driver: local
  minios3_data:
    driver: local

.env 文件内容如下:

# 必填,LobeChat 域名,用于 tRPC 调用
# 请保证此域名在你的 NextAuth 鉴权服务提供商、S3 服务商的 CORS 白名单中
APP_URL=https://lobe.example.com/

# Postgres 相关,也即 DB 必需的环境变量
# 必填,用于加密敏感信息的密钥,可以使用 openssl rand -base64 32 生成
KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ=
# 必填,Postgres 数据库连接字符串,用于连接到数据库
# 格式:postgresql://username:password@host:port/dbname,如果你的 pg 实例为 Docker 容器且位于同一 docker-compose 文件中,亦可使用容器名作为 host
DATABASE_URL=postgresql://postgres:2gvxtIMuLG6h3n@postgresql:5432/lobe

# NEXT_AUTH 相关,也即鉴权服务必需的环境变量
# 可以使用 auth0、Azure AD、GitHub、Authentik、Zitadel、Logto 等,如有其他接入诉求欢迎提 PR
# 目前支持的鉴权服务提供商请参考:https://lobehub.com/zh/docs/self-hosting/advanced/auth#next-auth
# 如果你有 ACCESS_CODE,请务必清空,我们以 NEXT_AUTH 作为唯一鉴权来源
# 必填,用于 NextAuth 的密钥,可以使用 openssl rand -base64 32 生成
NEXT_AUTH_SECRET=NX2kaPE923dt6BL2U8e9oSre5RfoT7hg
# 必填,指定鉴权服务提供商,这里以 Logto 为例
NEXT_AUTH_SSO_PROVIDERS=logto
# 必填,NextAuth 的 URL,用于 NextAuth 的回调
NEXTAUTH_URL=https://lobe.example.com/api/auth

# NextAuth 鉴权服务提供商部分,以 Logto 为例
# 其他鉴权服务提供商所需的环境变量,请参考:https://lobehub.com/zh/docs/self-hosting/environment-variables/auth
AUTH_LOGTO_ID=YOUR_LOGTO_CLIENT_ID
AUTH_LOGTO_SECRET=YOUR_LOGTO_CLIENT_SECRET
AUTH_LOGTO_ISSUER=https://logto-api.example.com/oidc

# 代理相关,如果你需要的话(比如你使用 GitHub 作为鉴权服务提供商)
# HTTP_PROXY=http://localhost:7890
# HTTPS_PROXY=http://localhost:7890

# S3 相关,也即非结构化数据(文件、图片等)存储必需的环境变量
# 这里以 MinIO 为例
# 必填,S3 的 Access Key ID,对于 MinIO 来说,直到在 MinIO UI 中手动创建之前都是无效的
S3_ACCESS_KEY_ID=YOUR_S3_ACCESS_KEY_ID
# 必填,S3 的 Secret Access Key,对于 MinIO 来说,直到在 MinIO UI 中手动创建之前都是无效的
S3_SECRET_ACCESS_KEY=YOUR_S3_SECRET_ACCESS_KEY
# 必填,S3 的 Endpoint,用于服务端/客户端连接到 S3 API
S3_ENDPOINT=https://minio-api.example.com
# 必填,S3 的 Bucket,直到在 MinIO UI 中手动创建之前都是无效的
S3_BUCKET=lobe
# 必填,S3 的 Public Domain,用于客户端通过公开连接访问非结构化数据
S3_PUBLIC_DOMAIN=https://minio-api.example.com
# 选填,S3 的 Enable Path Style
# 对于主流 S3 Cloud 服务商,一般填 0 即可;对于自部署的 MinIO,请填 1
# 请参考:https://lobehub.com/zh/docs/self-hosting/advanced/s3#s-3-enable-path-style
S3_ENABLE_PATH_STYLE=1

# 其他基础环境变量,视需求而定。注意不要有 ACCESS_CODE
# 请参考:https://lobehub.com/zh/docs/self-hosting/environment-variables/basic
# 请注意,对于服务端版本,其 API 必须支持嵌入(OpenAI text-embedding-3-small)模型,否则无法对上传文件进行处理,但你无需在 OPENAI_MODEL_LIST 中指定此模型
# OPENAI_API_KEY=sk-xxxx
# OPENAI_PROXY_URL=https://api.openai.com/v1
# OPENAI_MODEL_LIST=...

2.3 LobeChat的部署

本文部署的LobeChat 数据库版服务依赖 PostgresqlMinIoLogto,同时 Logto 服务也依赖 Postgresql,所以需要占用6个端口,对应的域名如下:

IP:Port 域名
IP:3210 lobe.example.com
IP:3001 logto-api.example.com
IP:3002 logto-ui.example.com
IP:9000 minio-api.example.com
IP:9001 minio-ui.example.com

部署之前建议先查看5432、3210、3001、3002、9000、9001端口有没有被占用

lsof -i:9001

没有占用,进入lobechat目录下进行部署即可,若被占用可以更换为其它未被占用的端口,之后执行如下命令进行部署:

cd /root/data/docker_data/lobechat

docker compose up -d  

部署成功之后访问 http://ip:3210 ,出现如下页面,如果访问失败,请去服务器的运营商后台检查 3210 端口是否放开

3.LobeChat的配置

3.1 Logto登录鉴权配置

1.创建用户,第一个注册的用户为管理员

2.修改语言为中文

3.创建 Next.js(App Router) 应用

4.进行参数配置

参数名 参数
重定向 URIs(Redirect URI) https://lobechat.sqwfly.top/api/auth/callback/logto
退出登录后重定向 URIs(Post sign-out redirect URI) https://lobechat.sqwfly.top/
CORS 允许的来源(CORS allowed origins) https://lobechat.sqwfly.top/

5.获取 LOGTO_CLIENT_IDLOGTO_CLIENT_SECRET,并依此修改 .env 文件中的环境变量

环境变量
应用ID LOGTO_CLIENT_ID
App Secrets LOGTO_CLIENT_SECRET

6.登录校验邮箱(可选)

采用发送邮箱验证码的方式进行注册和登录lobechat服务,以防恶意注册

  • 设置连接器

  • 配置SMTP

1.关于如何获取SMTP密码请参看我的博文:开启邮箱的SMTP服务

2.现在163邮箱的SMTP密码有效期为180天,过期需要重新生成,所以建议使用QQ邮箱

  • 开启登录验证

3.2 MinIO配置

1.登录MinIO服务后台,管理员账号为 docker-compose.yaml 文件中的如下内容

登录账号 环境变量
username MINIO_ROOT_USER
password MINIO_ROOT_PASSWORD

2.创建存储桶,桶名固定为 lobe

3.为创建的存储桶设置自定义访问策略

写入策略的内容如下,将其复制到输入框中

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": ["*"]
      },
      "Action": ["s3:GetBucketLocation"],
      "Resource": ["arn:aws:s3:::lobe"]
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": ["*"]
      },
      "Action": ["s3:ListBucket"],
      "Resource": ["arn:aws:s3:::lobe"],
      "Condition": {
        "StringEquals": {
          "s3:prefix": ["files/*"]
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": ["*"]
      },
      "Action": ["s3:PutObject", "s3:DeleteObject", "s3:GetObject"],
      "Resource": ["arn:aws:s3:::lobe/files/**"]
    }
  ]
}

3.配置跨域

配置对应 S3 服务商的 CORS 跨域配置,以确保 LobeChat 能够正常访问 S3 服务。

在本文中,你需要允许 https://lobe.example.com 的跨域请求。这既可以在 MinIO WebUI 的 Configuration - API - Cors Allow Origin 中配置,也可以在 Docker Compose 中的 minio - environment - MINIO_API_CORS_ALLOW_ORIGIN 中配置。

如果你使用第二种方法进行配置,你将无法再在 MinIO WebUI 中配置,本文采用第一种方法

4.创建并记录 Access KeySecret Key,并依此修改 .env 文件中的环境变量

环境变量
Access Key S3_ACCESS_KEY_ID
Secret Key S3_SECRET_ACCESS_KEY

LogtoMinIO 服务配置完毕之后,重新部署一下,注意不要删除 lobechat 目录下的任何文件

docker compose down --rmi all   # 删除旧的容器
docker compose up -d              # 重新部署

查看 lobechat 的安装状态

docker logs -f lobe-database

如果安装正常应该显示如下

root@racknerd-a56326:~/data/docker_data/lobechat# docker logs -f lobe-database
🌐 DNS Server: [ '127.0.0.11' ]
-------------------------------------
[Database] Start to migration...
✅ database migration pass.
-------------------------------------
  ▲ Next.js 14.2.8
  - Local:        http://localhost:3210
  - Network:      http://0.0.0.0:3210

 ✓ Starting...
 ✓ Ready in 193ms
 
### 以下提示信息已过时
LOGTO_CLIENT_ID will be removed in the future. Please set AUTH_LOGTO_ID instead.
LOGTO_CLIENT_SECRET will be removed in the future. Please set AUTH_LOGTO_SECRET instead.
LOGTO_ISSUER will be removed in the future. Please set AUTH_LOGTO_ISSUER instead.
...

本小节以下内容已经过时,本文已经修改了 .env 过时环境变量,部署时将不会再出现过时提示

可以看到 logto服务 提示我们,一些变量已经过时,建议替换,为了更好的适配未来版本,本文按照提示进行了修改了 .env 文件,这里也体现了使用单独的 .env 文件的好处—当环境变量过多时,可以将经常改动的环境变量放入单独的文件中,方便后续改动。

环境变量 过时环境变量
AUTH_LOGTO_ID LOGTO_CLIENT_ID
AUTH_LOGTO_SECRET LOGTO_CLIENT_SECRET
AUTH_LOGTO_ISSUER LOGTO_ISSUER

修改之后再次重新部署

docker compose down --rmi all && docker compose up -d && docker logs -f lobe-database

部署成功

root@racknerd-a56326:~/data/docker_data/lobechat# docker logs -f lobe-database
🌐 DNS Server: [ '127.0.0.11' ]
-------------------------------------
[Database] Start to migration...
✅ database migration pass.
-------------------------------------
  ▲ Next.js 14.2.8
  - Local:        http://localhost:3210
  - Network:      http://0.0.0.0:3210

 ✓ Starting...
 ✓ Ready in 210ms

3.3 LobeChat的基本使用

管理员账户不等同于注册用户,不要用你的管理员账户登录 LobeChat,使用前请先注册登录!

用户必须注册才能使用,否则会提示权限不够

点击 注册

输入注册的邮箱,之后查看邮箱邮件填入验证码,最后输入密码完成注册

使用指南:基础使用指南
模型配置:在 LobeChat 中使用多模型服务商
强烈推荐国产的AI大模型:DeepSeek

如果你需要购买OpenAI的大模型可以前往 AiHubMix,当然不仅是OpenAI,基本所有服务商的大模型都可以获取得到,只是一些服务商的网站在国内可能不是那么方便访问,充值之后按量计费即用多少花多少。

支持众多或者说是大多数国内和国外的大语言模型,你可以通过申请Api-Key的方式使用,大多数国内的大语言模型首次注册都会免费赠送一定的使用额度(tokens),如果需要强大的模型或者特别的功能比如文生图就需要付费了,根据你自己的需要来。登录之后首先是配置可使用的语言模型。

配置之后就可以对话或问答了,简单演示如下,

使用openai支持语音转文字以及文字转语音,不过还不支持直接语音对话。

此外还可以选择不同角色,赋予侧重技能。

也支持图片识别(需要使用gpt-4-vision-preview或其它支持图像识别的模型)以及插件功能,当然还支持PDF等文件格式的内容总结(需要text-embedding-xxx模型用于分块提取文件内容),如果某些插件不能安装请使用魔法,其它功能请自行探索。

4.LobeChat的升级与更新

升级logto很容易出现问题,建议只升级LobeChat

4.1 只升级LobeChat

lobechat 目录下新建脚本 upgrade.sh,写入以下内容,./upgrade.sh 执行即可

#!/bin/bash

LOG_FILE="/root/data/docker_data/lobechat/update_lobe.log"

# 记录日志函数
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}

# 1. 进入项目目录
cd /root/data/docker_data/lobechat || { log "目录不存在!"; exit 1; }

# 2. 停止并删除 lobe 容器
log "停止 lobe 容器..."
docker-compose down lobe || { log "停止容器失败!"; exit 1; }

# 3. 拉取最新镜像
log "拉取 lobe 最新镜像..."
docker-compose pull lobe || { log "拉取镜像失败!"; exit 1; }

# 4. 重新启动 lobe 容器
log "启动 lobe 容器..."
docker-compose up -d --no-deps lobe || { log "启动容器失败!"; exit 1; }

log "lobe 容器更新完成!"

4.2 升级全部容器

# 方式一
cd /root/data/docker_data/lobechat

docker compose down --rmi all  # 停止容器运行并删除相关镜像

docker compose up -d           # 请不要使用 docker-compose stop 来停止容器,因为这么做需要额外的时间等待容器停止;docker-compose up -d 直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。

# 方式二
cd /root/data/docker_data/lobechat

docker compose down   # 停止容器运行

docker compose pull   # 重新拉取镜像

docker compose up -d   

5.LobeChat的卸载

cd /root/data/docker_data/lobechat

docker compose down --rmi all           # 停止容器运行并删除相关镜像

cd ..

rm -rf /root/data/docker_data/lobechat  # 完全删除

6.参考

🌌使用 Docker Compose 部署 LobeChat 服务端数据库版本

0

评论区