lobechat数据库版本私有化部署

本文最后更新于:January 27, 2025 pm

LobeChat 是一款现代化设计的开源 ChatGPT/LLMs 聊天应用与开发框架,也是一个支持语音合成、多模态、可扩展的(function call)插件系统。LobeChat 默认使用客户端数据库(IndexedDB),同时也支持使用服务端数据库(下简称 DB 版)。
本文将以docker-compose的部署方式为例介绍如何私有化部署lobechat的DB版本。

1、official doc

1.1 快速开始

官方的部署指引文档,最简单的私有化部署方式可以直接使用一个docker命令解决

1
2
3
4
5
$ 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 版,正常的部署流程都需要包含三个模块的配置:

  1. 数据库配置;
  2. 身份验证服务配置;
  3. 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的安装我们可以参考官网

1
2
3
4
5
6
root@infra-ubuntu:~/lobechat# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 24.04.1 LTS
Release: 24.04
Codename: noble

首先配置docker的 apt 仓库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Add Docker's official GPG key:
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.asc

# Add the repository to Apt sources:
echo \
"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

1
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装完成之后可以拉取 hello-world 镜像来检查docker是否正常工作。

1
$ sudo docker run hello-world

还可以使用这两个命令检查docker的状态

1
2
3
4
root@infra-ubuntu:~# docker --version
Docker version 27.5.1, build 9f9e405

root@infra-ubuntu:~# docker info

3、安装docker-compose

docker-compose的部署安装,我们可以参考这个文档

1
2
3
curl -SL https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

部署完成之后,我们进行检查

1
2
root@infra-ubuntu:~# docker-compose --version
Docker Compose version v2.32.4

4、部署 LobeChat DB 版

4.1 生成docker-compose文件

部署流程参考官方文档

先建一个目录用来存放部署的各种文件

1
mkdir lobechat

下载官方的各个部署文件并直接启动服务

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# bash <(curl -fsSL https://raw.githubusercontent.com/lobehub/lobe-chat/HEAD/docker-compose/local/setup.sh) -f -l zh_CN
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

警告:如果你正在生产环境中使用,请在日志中检查密钥是否已经生成!!!

然后直接部署第一次

1
2
3
4
5
6
7
8
9
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,随后重新启动:

1
root@infra-ubuntu:~/lobechat# sed -i 's/localhost/10.31.100.3/g' docker-compose.yml

再次启动

1
2
3
4
5
6
7
root@infra-ubuntu:~/lobechat# docker compose up -d
[+] 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字段,包含用户的用户名和密码,例如我这里的用户名和密码字段为:

1
2
"name": "admin",
"password": "bac064",

身份认证 -> 应用 中找到lobechat

找到重定向URLs这个配置,修改里面的localhost为我们的服务器IP

1
http://your_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文件中的,可以查看里面的字段获得

1
2
3
4
5
root@infra-ubuntu:~/lobechat# cat .env | grep MINIO
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的内容,需要保存好密钥,如下所示为之前创建的密钥。

1
2
tfIcV3Gl7CjcHJkh5OsZ
DuNmfJykcoFTVp8Tl3DEzIE20Jvvl9ii5N2pUn5p

在 Casdoor 的 身份认证 -> 提供商 中关联 MinIO S3 服务,注意分类要选择Storage,客户端 ID、客户端密钥为上一步创建的访问密钥中的 Access KeySecret Key10.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}' # MinIO API
- '9001:9001' # MinIO Console
- '${CASDOOR_PORT}:${CASDOOR_PORT}' # Casdoor
- '${LOBE_PORT}:3210' # LobeChat
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 .env
# Proxy, if you need it
# HTTP_PROXY=http://localhost:7890
# HTTPS_PROXY=http://localhost:7890


# Other environment variables, as needed. You can refer to the environment variables configuration for the client version, making sure not to have ACCESS_CODE.
# OPENAI_API_KEY=sk-xxxx
# OPENAI_PROXY_URL=https://api.openai.com/v1
# OPENAI_MODEL_LIST=...


# ===========================
# ====== Preset config ======
# ===========================
# if no special requirements, no need to change
LOBE_PORT=3210
CASDOOR_PORT=8000
MINIO_PORT=9000

# Postgres related, which are the necessary environment variables for DB
LOBE_DB_NAME=lobechat
POSTGRES_PASSWORD=uWNZugjBqixf8dxC

# Casdoor secret
AUTH_CASDOOR_ID=a387a4892ee19b1a2249
AUTH_CASDOOR_SECRET=85db9fa40ab8155d26fed8c179906933

# MinIO S3 configuration
MINIO_ROOT_USER=YOUR_MINIO_USER
MINIO_ROOT_PASSWORD=YOUR_MINIO_PASSWORD

# Configure the bucket information of MinIO
MINIO_LOBE_BUCKET=lobe
S3_ACCESS_KEY_ID=soaucnP8Bip0TDdUjxng
S3_SECRET_ACCESS_KEY=ZPUzvY34umfcfxvWKSv0P00vczVMB6YmgJS5J9eO

另外需要注意的是init_data.json这个文件是casdoor组件初始化过程中产生的,存储着不少重要信息,切记不要随意删除。