image

image

AI大爆发阶段,各种AI现在层出不穷,但是很少有能调用第三方模型的,coze虽然官方宣传后期支持,但是目前没有

LobeChat 默认使用客户端数据库(IndexedDB)方式,这种模式虽然能正常使用,但是多端没有办法同步,并且不支持知识库、文件管理功能,所以前段时间,他又开发出来了服务端数据库版本(下简称 DB 版)。DB版本的LobeChat 采用了 Postgres 作为后端存储数据库。

前提:

  • 默认搭建服务器已经安装好dockerdocker-compose还有Nginx
  • 已经注册好了 ChatGPT-API-KEY 或者 Claude API ( 如果没有可以私信我,长期提供OpenAI-API和Claude-API )
  • 有准备好的域名,且域名可以进行二级域名解析

当前环境:阿里云99元的独享ECS ,2C2G

老规矩,这种工具型应用的搭建,最好使用docker-compose来搭建,以后哪怕长时间不管了更新也清楚方便。

基础-客户端数据库版本搭建(DB版可以跳过)

不推荐使用基础版客户端数据库,当然如果只是本地使用,不考虑丢机器人助手和对话信息的话,简单部署的话也可以使用。

本版本部署有一系列部署方案,一般使用这个版本的,都是为了方便快速使用的,在当前这个docker大部分镜像被禁用的情况下,只推荐使用Vercel一键搭建,然后到阿里云购买一个域名绑定到domain中。

Vercel部署流程

  1. 获取你的 OpenAI API Key

  2. Vercel Deploy

    直接使用 GitHub 账号登录即可,记得在环境变量页填入 OPENAI_API_KEY​ (必填) and ACCESS_CODE​(推荐-使用密码)。

  3. 部署完毕后,即可开始使用了。

  4. 绑定阿里云注册的自定义域名
    Vercel 分配的域名 DNS 在某些区域被污染了,绑定自定义域名即可直连

  5. 访问域名即可进入独属于你自己的LobeChat。

image

服务端数据库版本(DB版本-域名模式)

DB版本因为中间环境较为复杂且需要安装的支持应用较多,所以推荐使用docker-compose方式部署。

DB版本包含本机、IP、域名方式,本机不符合DB特性,IP没办法快速访问,故使用域名版本!

Docker-compose方式部署

因为政策问题,现在国内的docker镜像源基本死了个七七八八,更别说的docker-hub的了,所以需要换docker源

image

修改docker镜像源

#2024-11-18可用镜像源(网络中获取)
vi /etc/docker/daemon.json

{
"registry-mirrors": [
    "https://docker.m.daocloud.io", 
    "https://noohub.ru", 
    "https://huecker.io",
    "https://dockerhub.timeweb.cloud",
    "https://0c105db5188026850f80c001def654a0.mirror.swr.myhuaweicloud.com",
    "https://5tqw56kt.mirror.aliyuncs.com",
    "https://docker.1panel.live",
    "http://mirrors.ustc.edu.cn/",
    "http://mirror.azure.cn/",
    "https://hub.rat.dev/",
    "https://docker.ckyl.me/",
    "https://docker.chenby.cn",
    "https://docker.hpcloud.cloud",
    "https://docker.m.daocloud.io"
  ]
}

wq保存后执行:

systemctl daemon-reload

systemctl restart docker
重启docker后再进行操作

准备搭建

一般来讲,想要完整的运行 LobeChat 数据库版本,你需要至少拥有如下四个服务

  • LobeChat 数据库版本自身
  • 带有 PGVector 插件的 PostgreSQL 数据库
  • 支持 S3 协议的对象存储服务
  • 受 LobeChat 支持的 SSO 登录鉴权服务

这些服务可以通过自建或者在线云服务组合搭配,以满足不同层次的部署需求。

本文中,我们提供了完全基于开源自建服务的 Docker Compose 配置,你可以直接使用这份配置文件来启动 LobeChat 数据库版本,也可以对之进行修改以适应你的需求。

我们默认使用 MinIO 作为本地 S3 对象存储服务,使用 Logto 作为本地鉴权服务。

开始搭建

docker-compose.yml下载

#在当前目录下执行来下载

curl -fsSL https://raw.githubusercontent.com/lobehub/lobe-chat/HEAD/docker-compose/production/logto/docker-compose.yml > docker-compose.yml
curl -fsSL https://raw.githubusercontent.com/lobehub/lobe-chat/HEAD/docker-compose/production/logto/.env.zh-CN.example > .env

如果上面文件下载不下来,可以公众号中回复lobechat,即可下载,放置到服务器即可!

为了快速上手,此 docker-compose.yml内置了大量的 Secret/Password 的敏感字段配置,仅适用于快速演示或个人本地使用。请勿直接用于线上生产环境!否则遇到安全问题请自行负责!

新建目录

假设局域网 / 公网需要运行 LobeChat 服务的机器 IP 为 your_server_ip​。

新建一个 lobe-chat-db​ 目录,用于存放你的配置文件和后续的数据库文件。

mkdir lobe-chat-db
cd lobe-chat-db

下载容器镜像并启动

docker compose up -d

## 检查日志

docker logs -f lobe-chat

如果你在容器中看到了以下日志,则说明已经启动成功:

[Database] Start to migration...
✅ database migration pass.
-------------------------------------
  ▲ Next.js x.x.x
  - Local:        http://localhost:3210
  - Network:      http://0.0.0.0:3210

 ✓ Starting...
 ✓ Ready in 95ms

你可以通过 http://IP:3210​ 访问你的 LobeChat 服务。

image

至此,你已经完成部署 LobeChat 数据库版本的50% ,然后你会发现虽然能访问,但是登陆会报错,莫慌我们一步步解决

image

Nginx配置域名反向代理

在Nginx中加入域名反向代理映射到配套服务端口说明如下:

  • lobe.example.com​:为你的 LobeChat 服务端域名,需要反向代理到 LobeChat 服务端口,默认为 3210
  • lobe-auth-api.example.com​:为你的 Logto 服务端域名,需要反向代理到 Logto API 服务端口,默认为 3001
  • lobe-auth-ui.example.com​:为你的 Logto UI 域名,需要反向代理到 Logto WebUI 服务端口,默认为 3002
  • lobe-s3-api.example.com​:为你的 MinIO API 域名,需要反向代理到 MinIO API 服务端口,默认为 9000
  • lobe-s3-ui.example.com​:可选(不推荐把minio-ui映射到外网),为你的 MinIO UI 域名,需要反向代理到 MinIO WebUI 服务端口,默认为 9001
Nginx反向代理示例:


#lobe-chat应用

server {
    listen 443 ssl;
    server_name lobe.xxxx.com;
    client_max_body_size 1024m;
  	location / {
    proxy_pass http://127.0.0.1:3210;
    proxy_set_header HOST $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Upgrade $http_upgrade;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header Accept-Encoding gzip;
  }

}

#Logto-API
server {
    listen 443 ssl; 
    server_name lobe-auth-api.xxxx.com;
    client_max_body_size 1024m;
  	location / {
    proxy_pass http://127.0.0.1:3001;
    proxy_set_header HOST $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Upgrade $http_upgrade;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header Accept-Encoding gzip;
  }

}

#Logto-UI
server {
    listen 443 ssl; 
    server_name lobe-auth-ui.xxxx.com;
    client_max_body_size 1024m;
  	location / {
    proxy_pass http://127.0.0.1:3002;
    proxy_set_header HOST $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Upgrade $http_upgrade;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header Accept-Encoding gzip;
  }


}

#S3-Minio-API
server {
    listen 443 ssl; 
    server_name lobe-s3-api.xxxx.com;
    client_max_body_size 1024m;
  	location / {
    proxy_pass http://127.0.0.1:9000;
    proxy_set_header HOST $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Upgrade $http_upgrade;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header Accept-Encoding gzip;
  }

域名解析至服务器

示例:阿里云

  • lobe.example.com
  • lobe-auth-api.example.com
  • lobe-auth-ui.example.com
  • lobe-s3-api.example.com
  • lobe-s3-ui.example.com​:可选

使用A记录将如上二级域名解析至你的服务器

image

为域名配置SSL

我们使用Certbot为如上域名挨个生成SSL证书,如果不了解Certbot的可以看我之前的文章。

登录鉴权服务配置

本文以 Logto 为例,解释配置过程,如果你使用的是其他登录鉴权服务商,请参照其文档进行配置。

请记得注意配置对应登录鉴权服务提供商的 CORS 跨域配置,以确保 LobeChat 能够正常访问登录鉴权服务。

在本文中,你需要允许 https://lobe.example.com​ 的跨域请求。

你需要首先访问 WebUI 来进行配置:

  • 如果你按照前文配置了反向代理,打开 https://lobe-auth-ui.example.com
  • 否则,请在进行端口映射后,打开 http://localhost:3002
  1. 注册一个新账户,首个注册的账户将自动成为管理员image
  2. 修改为中文显示image
  3. Applications​ 里创建一个 Next.js (App Router)​ 应用,名称随意image
  4. 配置 Redirect URI​ 为 https://lobe.example.com/api/auth/callback/logto​,Post sign-out redirect URI​ 为 https://lobe.example.com/
  5. 点击确定后,再配置 CORS allowed origins​ 为 https://lobe.example.comimage
  6. 获取 App ID​ 和 App secrets​,填入你的 .env​ 文件中的 AUTH_LOGTO_ID​ 和 AUTH_LOGTO_SECRET​ 中image
  7. 配置你的 .env​ 文件中 AUTH_LOGTO_ISSUER​ 为 https://lobe-auth-api.example.com/oidc
  8. 可选,在左侧 登录体验​ 面板的 注册与登录​ 中关闭 启动用户注册​,禁止用户自行注册。如果你禁止了用户自行注册,那么你只能在左侧 User Management​ 里手动添加用户。image

这样鉴权服务就配置完成了

请注意,管理员账户不等同于注册用户,不要用你的管理员账户登录 LobeChat,那样只会报错!

S3对象存储服务配置

本文以 MinIO 为例,解释配置过程,如果你使用的是其他 S3 服务商,请参照其文档进行配置。

请记得注意配置对应 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 中配置。

你需要首先访问 WebUI 来进行配置:

  • 如果你按照前文配置了反向代理,打开 https://lobe-s3-ui.example.com
  • 否则,请在进行端口映射后,打开 http://localhost:9001
  1. 在登录界面输入你设置的 MINIO_ROOT_USER​ 和 MINIO_ROOT_PASSWORD​,然后点击登录

  2. 在左侧面板 Administer / Buckets 中点击 Create Bucket​,输入 lobe​(对应你的 S3_BUCKET​ 环境变量),然后点击 Create
    image

  3. 选中你的桶,点击 Summary - Access Policy,编辑,选择 Custom​,输入 minio-bucket-config.json​ 中的内容(可以公众号中回复lobechat,即可下载)并保存(同样默认你的桶名为 lobe​):
    image

    image

  4. 在左侧面板 Service Accounts 处,点击 Create Service Account​,无需额外修改,点击 Create ,将生成的 Access Key​ 和 Secret Key​ 填入你的 .env​ 文件中的 S3_ACCESS_KEY_ID​ 和 S3_SECRET_ACCESS_KEY​ 中
    image

启动服务

你能看到这里,说明默认你已经完成了 LobeChat 数据库版本的各种前置应用搭建,那么就差执行了

#先执行
docker compose down

并将前面为了下载容器所创建的s3_data/ 、 data/ 都删除,然后执行
docker compose up -d

至此,你就可以通过 https://lobe.example.com​ 访问你的 LobeChat DB服务啦!image

下面就是在.env中配置你想要api接口或者key之类,注意!每次修改完成后,需要docker compose up -d 来重创建lobe-chat

LobeChat 环境变量配置指南 · LobeChat Docs · LobeHub

image

长篇教程,总有疏忽之处,如有错误欢迎指正!

常见问题:

minio启动出错:

lobe-minio | ERROR Unable to initialize backend: format.json file: expected format-type: fs, found: xl-single

原因:

启动命令中挂载的/home/minio/data已经被minio占用了。(以前启动的minio挂载过)

解决:

找到.minio.sys 文件夹将其删了

image

NextAuth Error报错

原因:

.env中的nextauth未配置正确,可以查看是不是https没配

image

登陆Logto时直接显示 Invalid client YOUR_LOGTO_ID

原因:Logto未进行配置

解决:先进入Logto按上面的登陆鉴权服务配置好,获取了key和id并配置到.env中

image

文件上传不了

原因:S3配置有误或https未配置

解决:检查S3配置​​

image