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 数据库版服务依赖 Postgresql、MinIo、Logto,同时 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_ID、LOGTO_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 Key 和 Secret Key,并依此修改 .env 文件中的环境变量
环境变量 | |
---|---|
Access Key | S3_ACCESS_KEY_ID |
Secret Key | S3_SECRET_ACCESS_KEY |
Logto 和 MinIO 服务配置完毕之后,重新部署一下,注意不要删除 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 # 完全删除
评论区