参考官方教程:使用 Docker Compose 部署 LobeChat 服务端数据库版本
一、在一台支持bash环境的机器上执行,需要安装好curl
bash <(curl -fsSL https://lobe.li/setup.sh) -l zh_CN
它首先会下载四个文件,分别是
#环境变量文件, 用于docker容器
.env
#casdoor鉴权服务配置
init_data.json
#docker核心配置脚本
docker-compose.yml
#搜索服务配置文
searxng-settings.yml
执行过程中它会提示选择哪种模式,我们选择最正式的模式,也就是域名模式,重新生成密钥和数据库默认都是y,接着输入三个域名:
https://lobe.mydomain.com:9443 用于访问lobe-chat
https://casdoor.mydomain.com:9443 用于访问casdoor鉴权服务
https://minio.mydomain.com:9443 用于访问minio对象存储
这里根据自己购买的域名进行修改,如果你部署的目标是vps等云主机,那你可以不加端口号,采用默认的443端口,如果你是部署在家庭网络那还是带上端口号,因为宽带封443端口,家庭公网ip无法通过443来访问。
二、配置域名反代和DNS服务
你可以使用你的反向代理服务(如NginxProxyManager,Lucky,雷池Waf、群晖、宝塔、飞牛等) 配好域名证书,协议:https,监听9443(根据上面你填入的端口来)
lobe.mydomain.com --> http://你实际部署主机IP:3210
casdoor.mydomain.com --> http://你实际部署主机IP:8000
minio.mydomain.com --> http://你实际部署主机IP:9000
局域网中DNS服务或者本机Host配置(没有购买域名或者想要访问提速的情况):
lobe.mydomain.com 反向代理主机IP
casdoor.mydomain.com 反向代理主机IP
minio.mydomain.com 反向代理主机IP
三、修改配置生成的文件
为了支持lobe-chat使用知识库,其中一个很关键的服务是向量数据分块,而这个服务lobe-chat官方默认调用的是openai的模型,国内使用openai非常麻烦,并且模型收费,国内的替代方案是使用硅基流动的免费模型bge-m3(又快又好)。当然最佳方案是本地化部署ollama,使用ollama来调用bge-m3模型(在你有gpu服务器的情况下可以选择)。
我这里选择硅基流动提供的模型,https://siliconflow.cn/ 注册账号—>API密钥—>新建API密钥----->复制密钥 sk开头
修改.env文件
#先删掉没用的注释并新增
#配置上面注册的硅基流动API密钥
SILICONCLOUD_API_KEY=sk-xxxxxxxxxxxxxxxxxxx
#固定API地址
SILICONCLOUD_PROXY_URL=https://api.siliconflow.cn/v1/
#配置默认的嵌入向量模型
DEFAULT_FILES_CONFIG=embedding_model=siliconcloud/BAAI/bge-m3
#如果是自己部署ollama,按下面配置
#ENABLED_OLLAMA=1
#OLLAMA_PROXY_URL=自建的服务地址
#DEFAULT_FILES_CONFIG=embedding_model=ollama/BAAI/bge-m3
#-------------下面不用改
LOBE_PORT=3210
CASDOOR_PORT=8000
MINIO_PORT=9000
APP_URL=https://https://lobe.mydomain.com:9443
AUTH_URL=https://https://lobe.mydomain.com:9443/api/auth
# Postgres 相关,也即 DB 必须的环境变量
LOBE_DB_NAME=lobechat
POSTGRES_PASSWORD=uWNZugjBqixf8dxC
AUTH_CASDOOR_ISSUER=https://casdoor.mydomain.com:9443
# Casdoor secret
AUTH_CASDOOR_ID=a387a4892ee19b1a2249
AUTH_CASDOOR_SECRET=3dc06e2a73ff2ddcb2fd59e3d4392a67
CASDOOR_WEBHOOK_SECRET=casdoor-secret
# MinIO S3 配置
MINIO_ROOT_USER=admin
MINIO_ROOT_PASSWORD=b5cea6ea
# 在下方配置 minio 中添加的桶
S3_PUBLIC_DOMAIN=https://https://minio.mydomain.com:9443
S3_ENDPOINT=https://https://minio.mydomain.com:9443
MINIO_LOBE_BUCKET=lobe
# 为 casdoor 配置
origin=https://casdoor.mydomain.com:9443
修改docker-compose.yml
###这里把日志搜集、看板服务都删了,没什么用
name: lobe-chat-database
services:
network-service:
image: alpine
container_name: lobe-network
restart: always
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:pg17
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:RELEASE.2025-04-22T22-12-26Z
container_name: lobe-minio
network_mode: 'service:network-service'
volumes:
- './s3_data:/etc/minio/data'
environment:
- 'MINIO_API_CORS_ALLOW_ORIGIN=*'
env_file:
- .env
restart: always
entrypoint: >
/bin/sh -c "
minio server /etc/minio/data --address ':${MINIO_PORT}' --console-address ':9001' &
MINIO_PID=\$!
while ! curl -s http://localhost:${MINIO_PORT}/minio/health/live; do
echo 'Waiting for MinIO to start...'
sleep 1
done
sleep 5
mc alias set myminio http://localhost:${MINIO_PORT} ${MINIO_ROOT_USER} ${MINIO_ROOT_PASSWORD}
echo 'Creating bucket ${MINIO_LOBE_BUCKET}'
mc mb myminio/${MINIO_LOBE_BUCKET}
wait \$MINIO_PID
"
casdoor:
image: casbin/casdoor:v2.13.0
container_name: lobe-casdoor
entrypoint: /bin/sh -c './server --createDatabase=true'
network_mode: 'service:network-service'
depends_on:
postgresql:
condition: service_healthy
environment:
httpport: ${CASDOOR_PORT}
RUNNING_IN_DOCKER: 'true'
driverName: 'postgres'
dataSourceName: 'user=postgres password=${POSTGRES_PASSWORD} host=postgresql port=5432 sslmode=disable dbname=casdoor'
runmode: 'dev'
volumes:
- ./init_data.json:/init_data.json
env_file:
- .env
searxng:
image: searxng/searxng
container_name: lobe-searxng
volumes:
- './searxng-settings.yml:/etc/searxng/settings.yml'
environment:
- 'SEARXNG_SETTINGS_FILE=/etc/searxng/settings.yml'
restart: always
networks:
- lobe-network
env_file:
- .env
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:
- 'NEXT_AUTH_SSO_PROVIDERS=casdoor'
- 'KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ='
- 'NEXT_AUTH_SECRET=NX2kaPE923dt6BL2U8e9oSre5RfoT7hg'
- 'DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@postgresql:5432/${LOBE_DB_NAME}'
- 'S3_BUCKET=${MINIO_LOBE_BUCKET}'
- 'S3_ENABLE_PATH_STYLE=1'
- 'S3_ACCESS_KEY=${MINIO_ROOT_USER}'
- 'S3_ACCESS_KEY_ID=${MINIO_ROOT_USER}'
- 'S3_SECRET_ACCESS_KEY=${MINIO_ROOT_PASSWORD}'
- 'LLM_VISION_IMAGE_USE_BASE64=1'
- 'S3_SET_ACL=0'
- 'SEARXNG_URL=http://searxng:8080'
env_file:
- .env
restart: always
entrypoint: >
/bin/sh -c "
/bin/node /app/startServer.js &
LOBE_PID=\$!
sleep 3
if [ $(wget --timeout=5 --spider --server-response ${AUTH_CASDOOR_ISSUER}/.well-known/openid-configuration 2>&1 | grep -c 'HTTP/1.1 200 OK') -eq 0 ]; then
echo '⚠️Warning: Unable to fetch OIDC configuration from Casdoor'
echo 'Request URL: ${AUTH_CASDOOR_ISSUER}/.well-known/openid-configuration'
echo 'Read more at: https://lobehub.com/docs/self-hosting/server-database/docker-compose#necessary-configuration'
echo ''
echo '⚠️注意:无法从 Casdoor 获取 OIDC 配置'
echo '请求 URL: ${AUTH_CASDOOR_ISSUER}/.well-known/openid-configuration'
echo '了解更多:https://lobehub.com/zh/docs/self-hosting/server-database/docker-compose#necessary-configuration'
echo ''
else
if ! wget -O - --timeout=5 ${AUTH_CASDOOR_ISSUER}/.well-known/openid-configuration 2>&1 | grep 'issuer' | grep ${AUTH_CASDOOR_ISSUER}; then
printf '❌Error: The Auth issuer is conflict, Issuer in OIDC configuration is: %s' \$(wget -O - --timeout=5 ${AUTH_CASDOOR_ISSUER}/.well-known/openid-configuration 2>&1 | grep -E 'issuer.*' | awk -F '\"' '{print \$4}')
echo ' , but the issuer in .env file is: ${AUTH_CASDOOR_ISSUER} '
echo 'Request URL: ${AUTH_CASDOOR_ISSUER}/.well-known/openid-configuration'
echo 'Read more at: https://lobehub.com/docs/self-hosting/server-database/docker-compose#necessary-configuration'
echo ''
printf '❌错误:Auth 的 issuer 冲突,OIDC 配置中的 issuer 是:%s' \$(wget -O - --timeout=5 ${AUTH_CASDOOR_ISSUER}/.well-known/openid-configuration 2>&1 | grep -E 'issuer.*' | awk -F '\"' '{print \$4}')
echo ' , 但 .env 文件中的 issuer 是:${AUTH_CASDOOR_ISSUER} '
echo '请求 URL: ${AUTH_CASDOOR_ISSUER}/.well-known/openid-configuration'
echo '了解更多:https://lobehub.com/zh/docs/self-hosting/server-database/docker-compose#necessary-configuration'
echo ''
fi
fi
if [ $(wget --timeout=5 --spider --server-response ${S3_ENDPOINT}/minio/health/live 2>&1 | grep -c 'HTTP/1.1 200 OK') -eq 0 ]; then
echo '⚠️Warning: Unable to fetch MinIO health status'
echo 'Request URL: ${S3_ENDPOINT}/minio/health/live'
echo 'Read more at: https://lobehub.com/docs/self-hosting/server-database/docker-compose#necessary-configuration'
echo ''
echo '⚠️注意:无法获取 MinIO 健康状态'
echo '请求 URL: ${S3_ENDPOINT}/minio/health/live'
echo '了解更多:https://lobehub.com/zh/docs/self-hosting/server-database/docker-compose#necessary-configuration'
echo ''
fi
wait \$LOBE_PID
"
volumes:
data:
driver: local
s3_data:
driver: local
networks:
lobe-network:
driver: bridge
四、正式部署
下面以群晖7.2 docker为例来部署,其他系统下大同小异。
1、在docker目录下新建lobe文件夹,在其中创建data、s3_data目录
2、将上面四个文件都上传上来,得到的目录文件如下图。
3、打开Container Manager 新建项目名:lobe-chat 随意,路径 /docker/lobe,使用现有compose 4、一直下一步,等待构建完成。
五、实测
登录:https://lobe.mydomain.com:9443 会提示登录,使用你第一步中获得的lobe账号密码登录。
点击左上角的图像点应用设置,正常来说就能看到SiliconCloud(硅基流动)已经是可用状态,你可以在右边窗口挑选一些模型来测试,尽量选一些免费的吧(后面带free的)。
测试下对话聊天
测试知识库 在左侧选择文件,下面添加知识库,名称自己随意,我就随便上传一份文档来测试。
上传上去后点击分块,SiliconCloud的bge-m3模型会执行文件向量化并保存到向量数据库pgvector中
先打开知识库选项然后提问,模型就会自动分析文档给出答案。
补充:
如果容器已经启动,你要修改.env文件,你需要把容器都删除,然后重新构建才能生效。
lobechat依赖的主要服务:
pgvector/pgvector:pg17 保存登录信息、lobe配置信息、文档的向量数据等
minio/minio:RELEASE.2025-04-22T22-12-26Z 保存上传的文件
casbin/casdoor:v2.13.0 权限认证
searxng/searxng 联网搜索,在聊天对话中可以开启联网搜索
minio官方选择RELEASE.2025-04-22T22-12-26Z这个版本的原因是,新版本的web界面删除了创建密钥等核心功能,所以对象存储我没有使用它,我实际使用的是之前部署的rustfs,lobechat完全支持兼容s3的对象存储。
casdoor 这项目谈不上好坏,只能说很杂,对lobechat来说,实现完整用户系统太重了,不得已选择其他sso产品来实现多用户登录,其实casdoor只用在本地lobechat上来说有点重了。
下面列出官方依赖服务的支持文档
对象存储支持列表 https://lobehub.com/zh/docs/self-hosting/advanced/s3 https://lobehub.com/zh/docs/self-hosting/environment-variables/s3
鉴权服务支持列表 https://lobehub.com/zh/docs/self-hosting/advanced/auth https://lobehub.com/zh/docs/self-hosting/environment-variables/auth
联网搜索服务支持列表 https://lobehub.com/zh/docs/self-hosting/advanced/online-search
模型服务商 https://lobehub.com/zh/docs/self-hosting/environment-variables/model-provider
基础变量 https://lobehub.com/zh/docs/self-hosting/environment-variables/basic
[…] 之前已经介绍过完整的lobe-chat-database数据库版最新本地部署指南(含知识库) […]