本文最后更新于:January 27, 2025 pm
LobeChat 是一款现代化设计的开源 ChatGPT/LLMs 聊天应用与开发框架,也是一个支持语音合成、多模态、可扩展的(function call)插件系统。LobeChat 默认使用客户端数据库(IndexedDB),同时也支持使用服务端数据库(下简称 DB 版)。 本文将以docker-compose的部署方式为例介绍如何私有化部署lobechat的DB版本。
1、official doc 1.1 快速开始 官方的部署指引文档 ,最简单的私有化部署方式可以直接使用一个docker命令解决
$ docker run -d -p 3210:3210 \ -e OPENAI_API_KEY =sk-xxxx \ -e ACCESS_CODE =lobe66 \ --name lobe-chat \ lobehub/lobe-chat
指令说明:
默认映射端口为 3210
, 请确保未被占用或手动更改端口映射
OPENAI_API_KEY
这个环境变量需要使用自己的 OpenAI API Key 替换上述命令中的 sk-xxxx
同样的方式还可以添加别的key例如GOOGLE_API_KEY
等,完整的可以参考官方给出的环境变量文档
1.2 关于数据库 LobeChat 默认使用客户端数据库(IndexedDB),同时也支持使用服务端数据库(下简称 DB 版)。LobeChat 采用了 Postgres 作为后端存储数据库。
PostgreSQL 是一种强大的开源关系型数据库管理系统,具备高度扩展性和标准 SQL 支持。它提供了丰富的数据类型、并发处理、数据完整性、安全性及可编程性,适用于复杂应用和大规模数据管理。
对于 LobeChat 的 DB 版,正常的部署流程都需要包含三个模块的配置:
数据库配置;
身份验证服务配置;
S3 存储服务配置。
同时,由于 LobeChat 支持了文件对话 / 知识库对话的能力,因此我们需要为 Postgres 安装 pgvector
插件,该插件提供了向量搜索的能力,是 LobeChat 实现 RAG 的重要构件之一。
1.3 身份验证服务配置 身份验证服务的说明,我们可以参考这个文档 ,lobechat在实现的时候主要集成了两个不同的身份验证服务,用于满足不同场景的诉求,一种是 Clerk ,另外一种是 NextAuth。
Clerk 是一个身份验证 SaaS 服务,提供了开箱即用的身份验证能力,产品化程度很高,集成成本较低,体验很好。官方提供的 LobeChat Cloud ,就是使用了 Clerk 作为身份验证服务。
NextAuth 是一个开源的身份验证库,支持多种身份验证提供商,包括 Auth0、Cognito、GitHub、Google、Facebook、Apple、Twitter 等。NextAuth 本身提供了一套完整的身份验证解决方案,包括用户注册、登录、密码找回、多种身份验证提供商的集成等。
在官方的 Docker 镜像 lobe-chat-database
中,官方推荐使用 NextAuth 作为身份验证服务。
1.4 S3 存储服务配置 LobeChat 在 很早以前 就支持了多模态的 AI 会话,其中涉及到图片上传给大模型的功能。在客户端数据库方案中,图片文件直接以二进制数据存储在浏览器 IndexedDB 数据库,但在服务端数据库中这个方案并不可行。因为在 Postgres 中直接存储文件类二进制数据会大大浪费宝贵的数据库存储空间,并拖慢计算性能。
这块最佳实践是使用文件存储服务(S3)来存储图片文件,同时 S3 也是文件上传 / 知识库功能所依赖的大容量静态文件存储方案。
官方文档中的 S3 所指代的是指兼容 S3 存储方案,即支持 Amazon S3 API 的对象存储系统,常见例如 Cloudflare R2 、阿里云 OSS,可以自部署的 minio 等均支持 S3 兼容 API。
这里我们使用的私有化部署方案,可以自己对接各个云厂商的S3存储服务,也可以自己部署一个minio服务。(本文以私有化部署minio为例)
1.5 部署方式 官方支持了很多个平台的部署方式并且有相关的指引文档,因为这里涉及到多个服务的部署,个人认为比较方便管理维护的方式应该是使用docker-compose来统一部署维护,因此这里我们选择使用docker-compose模式 来进行部署。
2、安装docker engine 以ubuntu系统为例,docker的安装我们可以参考官网
root @infra-ubuntu:~/lobechat# lsb_release -aNo LSB modules are available.Distributor ID: UbuntuDescription : Ubuntu 24 .04 .1 LTSRelease : 24 .04 Codename : noble
首先配置docker的 apt
仓库。
sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.ascecho \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME " ) stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update
然后直接安装docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
安装完成之后可以拉取 hello-world
镜像来检查docker是否正常工作。
$ sudo docker run hello-world
还可以使用这两个命令检查docker的状态
root @infra-ubuntu:~# docker --versionDocker version 27 .5 .1 , build 9 f9e405root @infra-ubuntu:~# docker info
3、安装docker-compose docker-compose的部署安装,我们可以参考这个文档
curl -SL https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-x86_64 -o /usr/local/bin/docker-composechmod +x /usr/local/bin/docker-compose sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
部署完成之后,我们进行检查
root@infra-ubuntu:~ Docker Compose version v2.32.4
4、部署 LobeChat DB 版 4.1 生成docker-compose文件 部署流程参考官方文档
先建一个目录用来存放部署的各种文件
下载官方的各个部署文件并直接启动服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 root@infra-ubuntu:~/lobechat docker-compose.yml 100%[====================================================================================================>] 2.95K --.-KB/s in 0s .env 100%[====================================================================================================>] 1.03K --.-KB/s in 0s init_data.json 100%[====================================================================================================>] 25.38K --.-KB/s in 0.05s s3_data.tar.gz 100%[====================================================================================================>] 11.77K --.-KB/s in 0.05s s3_data.tar.gz 解压成功到目录: . 重新生成安全密钥... 安全密钥生成结果如下: Casdoor: - Username: admin - Password: bac064 - Client Secret: 85db9fa40ab8155d26fed8c179906933 您已经完成了所有配置。请运行以下命令启动LobeChat: docker compose up -d 完整的环境变量在'.env' 中可以在文档中找到:https://lobehub.com/zh/docs/self-hosting/environment-variables 警告:如果你正在生产环境中使用,请在日志中检查密钥是否已经生成!!!
然后直接部署第一次
root@infra-ubuntu:~/lobechat# docker compose up -d <......> Running 6/6 ✔ Network lobe-chat-database_lobe-network Created 0.1s ✔ Container lobe-network Started 1.0s ✔ Container lobe-postgres Healthy 7.0s ✔ Container lobe-casdoor Started 5.8s ✔ Container lobe-minio Started 0.3s ✔ Container lobe-chat Started 6.4s
接着,你需要修改下载下来的 docker-compose.yml
文件,执行一次全文替换,将 localhost
替换为 your_server_ip
,随后重新启动:
root@infra -ubuntu:~/lobechat# sed -i 's/localhost/10.31.100.3/g' docker-compose.yml
再次启动
root@infra-ubuntu:~/lobechat [+] Running 5/5 ✔ Container lobe-network Running 0.0s ✔ Container lobe-postgres Healthy 11.2s ✔ Container lobe-chat Started 11.3s ✔ Container lobe-minio Started 0.1s ✔ Container lobe-casdoor Started 0.6s
4.2 配置casdoor 使用 setup.sh
脚本启动后,Casdoor WebUI 默认端口为 8000
,你可以通过 http://your_server_ip:8000
访问,默认用户名和密码不要看lobechat官方文档里面的指示,不一定是对的,建议查看初始化过程中生产的init_data.json
文件,里面有user字段,包含用户的用户名和密码,例如我这里的用户名和密码字段为:
"name" : "admin" , "password" : "bac064" ,
在 身份认证 -> 应用
中找到lobechat
找到重定向URLs
这个配置,修改里面的localhost为我们的服务器IP
http://y our_server_ip:3210 /api/ auth/callback/ casdoor
其他配置大多保持默认即可,你也可以在 身份认证 -> 应用
中修改默认配置
4.3 配置 MinIO S3 使用 setup.sh
脚本启动后,MinIO WebUI 默认端口为 9001
,你可以通过 http://your_server_ip:9001
访问,默认用户名 YOUR_MINIO_USER
,密码 YOUR_MINIO_PASSWORD
密码是存储在初始化配置里面的.env
文件中的,可以查看里面的字段获得
root@infra-ubuntu:~/lobechat MINIO_PORT=9000 MINIO_ROOT_USER=YOUR_MINIO_USER MINIO_ROOT_PASSWORD=YOUR_MINIO_PASSWORD MINIO_LOBE_BUCKET=lobe
登录进去之后,我们可以看到已经创建给 lobechat 使用的 bucket ,这里再创建一个 bucket 给 casdoor 使用
这里我们创建一个casdoor
的bucket,注意如果修改了名字,下面配置中的casdoor
也要一并修改。
创建成功之后点击进去bucket详情,在Summary里面,点击Access Policy ,选择custom ,贴入下面的内容,然后保存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 { "Statement" : [ { "Effect" : "Allow" , "Principal" : { "AWS" : [ "*" ] } , "Action" : [ "s3:GetBucketLocation" ] , "Resource" : [ "arn:aws:s3:::casdoor" ] } , { "Effect" : "Allow" , "Principal" : { "AWS" : [ "*" ] } , "Action" : [ "s3:ListBucket" ] , "Resource" : [ "arn:aws:s3:::casdoor" ] , "Condition" : { "StringEquals" : { "s3:prefix" : [ "files/*" ] } } } , { "Effect" : "Allow" , "Principal" : { "AWS" : [ "*" ] } , "Action" : [ "s3:PutObject" , "s3:DeleteObject" , "s3:GetObject" ] , "Resource" : [ "arn:aws:s3:::casdoor/**" ] } ] , "Version" : "2012-10-17" }
然后我们创建一个AccessKey
注意退出这个页面之后不能再查看SecretKey 的内容,需要保存好密钥,如下所示为之前创建的密钥。
tfIcV3 Gl7 CjcHJkh5 OsZ DuNmfJykcoFTVp8 Tl3 DEzIE20 Jvvl9 ii5 N2 pUn5 p
在 Casdoor 的 身份认证 -> 提供商
中关联 MinIO S3 服务,注意分类要选择Storage,客户端 ID、客户端密钥为上一步创建的访问密钥中的 Access Key
和 Secret Key
,10.31.100.3
应当被替换为实际部署MinIO服务的服务IP。
以下是一个示例配置:
在 Casdoor 的 身份认证 -> 应用
中,对 app-built-in
应用添加提供商,选择 minio
,保存并退出
我们可以在 Casdoor 的 身份认证 -> 资源
中,尝试上传文件以测试配置是否正确
也可以直接测试是否可以修改头像,在用户管理里面,选择用户,然后点击编辑,就可以修改头像了。
4.4 配置文件 最后附上完整的配置文件作为参考,注意里面的配置参数(如IP地址、持久化映射目录、密钥等需要自行修改)
docker-compose.yml
文件内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 root@infra-ubuntu:~/lobechat# cat docker-compose.yml name: lobe-chat-database services: network-service: image: alpine container_name: lobe-network ports: - '${MINIO_PORT}:${MINIO_PORT}' - '9001:9001' - '${CASDOOR_PORT}:${CASDOOR_PORT}' - '${LOBE_PORT}:3210' command: tail -f /dev/null networks: - lobe-network postgresql: image: pgvector/pgvector:pg16 container_name: lobe-postgres ports: - '5432:5432' volumes: - './data:/var/lib/postgresql/data' environment: - 'POSTGRES_DB=${LOBE_DB_NAME}' - 'POSTGRES_PASSWORD=${POSTGRES_PASSWORD}' healthcheck: test: ['CMD-SHELL' , 'pg_isready -U postgres' ] interval: 5s timeout: 5s retries: 5 restart: always networks: - lobe-network minio: image: minio/minio container_name: lobe-minio network_mode: 'service:network-service' volumes: - './s3_data:/etc/minio/data' environment: - 'MINIO_ROOT_USER=${MINIO_ROOT_USER}' - 'MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD}' - 'MINIO_API_CORS_ALLOW_ORIGIN=http://10.31.100.3:${LOBE_PORT}' restart: always command: > server /etc/minio/data --address ":${MINIO_PORT}" --console-address ":9001" casdoor: image: casbin/casdoor container_name: lobe-casdoor entrypoint: /bin/sh -c './server --createDatabase=true' network_mode: 'service:network-service' depends_on: postgresql: condition: service_healthy environment: RUNNING_IN_DOCKER: 'true' driverName: 'postgres' dataSourceName: 'user=postgres password=${POSTGRES_PASSWORD} host=postgresql port=5432 sslmode=disable dbname=casdoor' origin: 'http://10.31.100.3:${CASDOOR_PORT}' runmode: 'dev' volumes: - ./init_data.json:/init_data.json lobe: image: lobehub/lobe-chat-database container_name: lobe-chat network_mode: 'service:network-service' depends_on: postgresql: condition: service_healthy network-service: condition: service_started minio: condition: service_started casdoor: condition: service_started environment: - 'APP_URL=http://10.31.100.3:3210' - 'NEXT_AUTH_SSO_PROVIDERS=casdoor' - 'KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ=' - 'NEXT_AUTH_SECRET=NX2kaPE923dt6BL2U8e9oSre5RfoT7hg' - 'AUTH_URL=http://10.31.100.3:${LOBE_PORT}/api/auth' - 'AUTH_CASDOOR_ISSUER=http://10.31.100.3:${CASDOOR_PORT}' - 'DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@postgresql:5432/${LOBE_DB_NAME}' - 'S3_ENDPOINT=http://10.31.100.3:${MINIO_PORT}' - 'S3_BUCKET=${MINIO_LOBE_BUCKET}' - 'S3_PUBLIC_DOMAIN=http://10.31.100.3:${MINIO_PORT}' - 'S3_ENABLE_PATH_STYLE=1' - 'LLM_VISION_IMAGE_USE_BASE64=1' env_file: - .env restart: always volumes: data: driver: local s3_data: driver: local networks: lobe-network: driver: bridge
.env
文件内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 root@infra-ubuntu:~/lobechat# cat .envLOBE_PORT =3210CASDOOR_PORT =8000MINIO_PORT =9000LOBE_DB_NAME =lobechatPOSTGRES_PASSWORD =uWNZugjBqixf8dxCAUTH_CASDOOR_ID =a387a4892ee19b1a2249AUTH_CASDOOR_SECRET =85db9fa40ab8155d26fed8c179906933MINIO_ROOT_USER =YOUR_MINIO_USERMINIO_ROOT_PASSWORD =YOUR_MINIO_PASSWORDMINIO_LOBE_BUCKET =lobeS3_ACCESS_KEY_ID =soaucnP8Bip0TDdUjxngS3_SECRET_ACCESS_KEY =ZPUzvY34umfcfxvWKSv0P00vczVMB6YmgJS5J9eO
另外需要注意的是init_data.json
这个文件是casdoor
组件初始化过程中产生的,存储着不少重要信息,切记不要随意删除。