项目地址:GitHub
官方文档:构建属于自己的 LobeChat – 自选部署平台 · LobeChat… · LobeHub
前言
LobeChat 是一款开源的聊天工具,支持多种AI模型、SSO登录和云同步功能。相比基础版,数据库版本通过集成 PostgreSQL、MinIO 和 Logto,带来了账户管理、知识库和子话题等高级特性。
由于官方文档省略了很多细节,各位在部署时难免踩坑。本文将带领你从零开始部署LobeChat数据库版本,让小白也能轻松玩转自部署。
环境
云服务商:腾讯云
系统:Debian12
本文涉及的技术点
- Docker
- Nginx
- Docker Compose
- Auth:Logto
- S3:Minio
Docker
安装Docker Engine
参考文档:https://docs.docker.com/engine/install
安装步骤
以下是Docker官方给出的安装步骤
1. 执行以下命令设置 Docker 的官方 GPG 密钥和存储库
sudo apt-get update && \
sudo apt-get install -y ca-certificates curl && \
sudo install -m 0755 -d /etc/apt/keyrings && \
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc && \
sudo chmod a+r /etc/apt/keyrings/docker.asc && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null && \
sudo apt-get update
2. 执行apt命令安装Docker软件包
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3. 通过运行映像来验证安装是否成功
sudo docker run hello-world
可能遇到的问题
因为国内网络问题,无法从https://download.docker.com/linux/debian/gpg下载密钥
解决方案
方案1:使用以下命令检查是否可以访问Docker的官方服务器
curl -fsSL https://download.docker.com/linux/debian/gpg
多尝试几次,在访问成功后立即重新执行设置存储库的命令
方案2:不使用Docker的官方存储库安装Docker Engine,这里不做赘述
配置Docker Hub镜像源
由于国内目前无法直接访问Docker Hub,所以我们要先配置一个可访问的镜像仓库。
1. 找到或创建daemon.json文件
cd /etc/docker
2. 使用你喜欢的文本编辑器(例如 nano 或 vim)打开 daemon.json 文件
以下以 nano 为例展示如何打开文件(如果没有找到文件则会打开一个空文件,并在保存时创建)
sudo nano daemon.json
配置示例:
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://hub.rat.dev",
"https://docker.1panel.live"
]
}
编辑完成后按Ctrl+O回车保存,Ctrl+X退出

3. 保存并重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
配置DNS解析记录
| 域名 | 描述 |
| lobe.example.com | LobeChat服务端域名 |
| auth-api.example.com | Logto 服务端域名 |
| auth-ui.example.com | Logto UI 域名 |
| minio.example.com | MinIO API 域名 |
| minio-ui.example.com | 可选,MinIO UI域名 |
注:顶级域名(example.com)改为你自己的域名
打开腾讯云的云DNS解析,进入域名解析记录管理页面,点击添加记录
添加一条lobe的A记录指向服务器IP,其余为CNAME记录


配置nginx
安装
1. 执行以下命令安装nginx
sudo apt update
sudo apt install nginx
2. 设置开机自动启动服务
sudo systemctl enable nginx
3. 检查服务状态
sudo systemctl status nginx

基础配置
1. 移动到nginx根目录
cd /etc/nginx/sites-available/
2. 创建一个与域名同名的配置文件
sudo nano lobe.example.com
3. 添加基本配置(HTTP版本,稍后会升级到HTTPS)
server {
listen 80;
server_name lobe.example.com;
}
按Ctrl+O,回车保存,然后Ctrl+X退出。
listen 80:监听HTTP的默认端口,统一使用80端口。
server_name:绑定的域名。
剩下几个域名也按照相同的做法进行配置
4. 将配置文件链接到sites-enabled目录来启用配置
sudo ln -s /etc/nginx/sites-available/lobe.example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/auth-api.example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/auth-ui.example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/minio.example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/minio-ui.example.com /etc/nginx/sites-enabled/
5. 检查Nginx配置语法
sudo nginx -t
如果语法无误,会显示syntax is ok和test is successful
6. 重启Nginx
sudo systemctl restart nginx
申请证书
安装Certbot
执行以下语句安装certbot
sudo apt install certbot python3-certbot-nginx
验证安装
certbot --version
打印出certbot的版本号,代表安装正常
使用Certbot申请Let’s Encrypt证书
1. 首先保证80端口为开启状态
进入网页控制台的安全组页面,在入站规则中添加TCP:80端口,因为稍后我们会配置HTTPS,将443端口一并开启


2. 执行以下命令,Certbot会检测Nginx配置,并在创建证书时通过HTTP进行自动验证:
sudo certbot --nginx -d lobe.example.com -d auth-api.example.com -d auth-ui.example.com -d minio.example.com -d minio-ui.example.com
-d:指定需要申请证书的域名,可以多个。
–nginx:告诉Certbot自动修改Nginx配置。
如果想要只申请证书,不自动修改Nginx配置文件,在命令中加上certonly参数
sudo certbot --nginx certonly -d lobe.example.com -d auth-api.example.com -d auth-ui.example.com -d minio.example.com -d minio-ui.example.com
按照提示操作:
输入你的邮箱(用于接收证书到期提醒)。
同意服务条款(输入Y)
拒绝推广(输入N)

3. 重启Nginx服务:
sudo systemctl restart nginx
配置https与端口转发
1. 编辑Nginx配置文件
打开之前创建的域名配置文件:
sudo nano lobe.example.com
可以看到Certbot已经自动帮我们配置好了Https配置
修改配置,示例如下:
server {
listen 80;
server_name lobe.example.com;
# 重定向所有请求到 HTTPS
return 301 https://$server_name$request_uri;
}
# HTTPS 配置
server {
listen 443 ssl http2;
server_name lobe.example.com;
ssl_certificate /etc/letsencrypt/live/lobe.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/lobe.example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
location / {
proxy_pass http://localhost:3002; # 反向代理到3002端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
| 域名 | 端口号 |
| lobe.example.com | 3210 |
| auth-api.example.com | 3001 |
| auth-ui.example.com | 3002 |
| minio.example.com | 9000 |
| minio-ui.example.com | 9001 |
注:顶级域名(example.com)改为你自己的域名
其他几个站点也按照相同方式修改,保留自动创建的证书相关配置,主要差异为server_name的域名和proxy_pass的端口号

2. 检查并重启Nginx服务
sudo nginx -t
sudo systemctl restart nginx

3. 证书自动续期
检查自动续期状态
sudo systemctl status certbot.timer
模拟续期
sudo certbot renew --dry-run
手动续期
sudo certbot renew
至此Nginx配置完成,稍作休息吧。
Docker Compose
前置工作
创建一个系统用户用于运行lobechat
adduser --system --group --no-create-home lobe
创建docker compose文件夹
创建并切换到要存放docker compose的目录,这里以/opt/lobechat为例:
创建用户文件夹并赋权
mkdir -p /opt/lobechat/{data,s3_data}
chown -R lobe:lobe /opt/lobechat
chmod -R 750 /opt/lobechat
cd /opt/lobechat
创建密钥,后面配置中会用到
openssl rand -base64 32
配置Docker Compose
1. 创建并编辑docker-compose.yml文件
sudo nano docker-compose.yml
配置内容示例:
services:
postgresql:
image: pgvector/pgvector:pg16
container_name: lobe-postgres
ports:
- '5432:5432'
volumes:
- './data:/var/lib/postgresql/data'
environment:
- 'POSTGRES_DB=lobe'
- 'POSTGRES_PASSWORD=EHYO2JP6QDjN'
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
ports:
- '9000:9000'
- '9001:9001'
volumes:
- './s3_data:/data'
environment:
- 'MINIO_ROOT_USER=lobechat'
- 'MINIO_ROOT_PASSWORD=L9V4T8X2GPyW'
- 'MINIO_DOMAIN=minio.example.com'
- 'MINIO_API_CORS_ALLOW_ORIGIN=https://lobe.example.com'
command: >
server /data --address ":9000" --console-address ":9001"
restart: always
networks:
- lobe_network
logto:
image: svhd/logto
container_name: lobe-logto
ports:
- '3001:3001'
- '3002:3002'
depends_on:
postgresql:
condition: service_healthy
environment:
- 'TRUST_PROXY_HEADER=1'
- 'DB_URL=postgresql://postgres:EHYO2JP6QDjN@lobe-postgres:5432/logto'
- 'ENDPOINT=https://auth-api.example.com'
- 'ADMIN_ENDPOINT=https://auth-ui.example.com'
entrypoint: ['sh', '-c', 'npm run cli db seed -- --swe && npm start']
restart: always
networks:
- lobe_network
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-database
ports:
- '3210:3210'
depends_on:
- postgresql
- minio
- logto
env_file:
- .env
restart: always
networks:
- lobe_network
volumes:
data:
driver: local
s3_data:
driver: local
networks:
lobe-network:
driver: bridge
此配置包含以下四个必须容器
- LobeChat 数据库版
- 带有 PGVector 插件的 PostgreSQL 数据库
- 受 LobeChat 支持的 SSO 登录鉴权服务:Logto
- 支持 S3 协议的对象存储服务:MinIO
2. 创建并编辑.env文件
sudo nano .env
配置内容示例:
# 必填,LobeChat 域名,用于 tRPC 调用
# 请保证此域名在你的 NextAuth 鉴权服务提供商、S3 服务商的 CORS 白名单中
APP_URL=https://lobe.example.com/
# Postgres 相关,也即 DB 必需的环境变量
# 必填,用于加密敏感信息的密钥,可以使用 openssl rand -base64 32 生成
KEY_VAULTS_SECRET=eUAy1lmSR405te8DaHJ4fWt6axxDfAbgm1h5JRch9kQ=
# 必填,Postgres 数据库连接字符串,用于连接到数据库
# 格式:postgresql://username:password@host:port/dbname,如果你的 pg 实例为 Docker 容器且位于同一 docker-compose 文件中,亦可使用容器名作为 host
DATABASE_URL=postgresql://postgres:EHYO2JP6QDjN@lobe-postgres: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=eUAy1lmSR405te8DaHJ4fWt6axxDfAbgm1h5JRch9kQ=
# 必填,指定鉴权服务提供商,这里以 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=
AUTH_LOGTO_SECRET=
AUTH_LOGTO_ISSUER=https://auth-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=
# 必填,S3 的 Secret Access Key,对于 MinIO 来说,直到在 MinIO UI 中手动创建之前都是无效的
S3_SECRET_ACCESS_KEY=
# 必填,S3 的 Endpoint,用于服务端/客户端连接到 S3 API
S3_ENDPOINT=https://minio.example.com
# 必填,S3 的 Bucket,直到在 MinIO UI 中手动创建之前都是无效的
S3_BUCKET=lobe
# 必填,S3 的 Public Domain,用于客户端通过公开连接访问非结构化数据
S3_PUBLIC_DOMAIN=https://minio.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-ISPexEpr46OGiyZMQAv6KKOp15RKN4OSoNtFkXxSCd8qbOFo
OPENAI_PROXY_URL=https://api.tu-zi.com/v1
OPENAI_MODEL_LIST="+gpt-4o-mini,+gpt-4o-2024-11-20"
GOOGLE_API_KEY=AIzaSyD11b0bDNzDotJmwX5mjZMhqvjqSfhI41Y
DEEPSEEK_API_KEY=sk-c348f7c40ba341bbaad3212f3d89c156
相关问题和解答
Q:S3_ENABLE_PATH_STYLE=1为什么对 MinIO 是必须的?
背景
S3(Simple Storage Service)有两种寻址方式:虚拟主机风格(Virtual-hosted-style,如 `bucket.s3.amazonaws.com`)和路径风格(Path-style,如 `s3.amazonaws.com/bucket`)。主流云服务(如 AWS S3)默认使用虚拟主机风格,但 MinIO 是一个自部署的 S3 兼容服务,默认需要路径风格。
为什么对 MinIO 必须?
MinIO 在本地部署时,通常没有像 AWS 那样的全球 DNS 解析支持,无法通过子域名(如 `bucket.minio.example.com`)直接访问存储桶。因此,MinIO 使用路径风格(`minio.example.com/bucket`)来定位存储桶。设置 `S3_ENABLE_PATH_STYLE=1` 告诉 LobeChat 使用路径风格与 MinIO 交互,否则会导致连接失败。
例外情况
如果你在 MinIO 上配置了自定义域名和 DNS 解析支持虚拟主机风格,可以设为 `0`,但这需要额外的网络配置,对于大多数自部署用户来说并不常见。
启动Docker Compose
docker compose up -d
Docker 会拉取所需的镜像(pgvector/pgvector:pg16, minio/minio, svhd/logto, lobehub/lobe-chat-database),然后启动容器。

完成后,你会看到类似以下输出:

检查容器运行状态
docker ps

问题排查
鉴于每个人的环境不同,启动时可能出现问题,简单说明如何用 `docker logs` 或 `journalctl` 检查问题
docker logs
用于查看 Docker 容器的日志输出,帮助诊断容器启动失败或运行时错误。适合检查 LobeChat、MinIO、Logto 等服务的具体问题。
用法:
docker logs <容器名>
journalctl
用于查看系统服务的日志(如 Nginx 或 Docker 服务本身),适合排查系统级问题。
用法:
journalctl -u <服务名>
Logto
创建管理员账户
1. 在浏览器中访问https://auth-ui.example.com
首次进入时由于还没创建管理员账户,会转到管理员账户创建页面,显示Welcome to Admin Console

2. 点击页面中的Create Account按钮
3. 输入用户名点击注册

4. 输入密码,并点击保存密码按钮

禁用logto密码检查(可选)
在旧版本的logto下会遇到一个问题,logto会调用一个远程API检查密码复杂度,而国内没法直接访问吗,所以在这一步会直接卡住(这在新版本Logto中已解决)
解决方案:
1. 进入postgresql容器并使用用户名 “postgres” 连接到 PostgreSQL 数据库
docker exec -it lobe-postgres psql -U postgres
2. 在logto的BD执行以下SQL禁用密码检查
\c logto
update sign_in_experiences set password_policy='{"rejects": {"pwned": false}}' where tenant_id='admin';
参考issues:https://github.com/logto-io/logto/issues/6577
创建一个Application
1. 在左侧的菜单中选择Applications
2. 在右侧区域中找到Next.js (App Router),点击下方的Start building按钮

3. 在弹出的Create application界面中随意填入一个Application name,我这里填入lobechat,点击Create application按钮

4. 在创建向导的中找到Redirect URI和Post sign-out redirect URI两个文本框并填入内容
- Redirect URI:https://lobe.example.com/api/auth/callback/logto
- Post sign-out redirect URI:https://lobe.example.com/

5. 点击右下角的Finish and done
6. 完成创建,自动转到创建好的Application详情页

7. 在页面中找到App ID和App secrets中的Default secret,记录下来,后面要用到

创建一个用户
1. 在左侧菜单中选择User management,并在右侧面板中点击Add User按钮

2. 填入Username和Name,并点击点击Add User按钮,Username为登录名,Name为显示名

3. 在This user has been successfully created窗口中复制自动生成的密码

MinIO
登录
1. 在浏览器中访问https://minio-ui.example.com
2. 在登录窗口中输入docker-compose.yml中配置的MINIOROOTUSER和MINIOROOTPASSWORD,点击Login按钮

获取密钥
1. 在左侧菜单中选择Access Keys

2. 在右侧面板中可以看到,自动帮我们生成出了Access Key和Secret Key,直接点击Create按钮即可

3. 在弹出的New Access Key Created面板中复制Access Key和Secret Key,记录下来,后面要用到

配置.env文件
1. 打开之前创建的.env文件
sudo nano .env
2. 填入刚刚记录下的App ID、Default secret、Access Key、Secret Key

3. 编辑完成后按Ctrl+O回车保存,Ctrl+X退出
4. 重启docker compose
docker compose up -d
LobeChat
1. 在浏览器中访问https://lobe.example.com
2. 点击左上角的Logo头像,在弹出的模态框中点击登录/注册按钮

3. 自动重定向到https://auth-api.example.com/sign-in页面

4. 在登录界面中填入刚刚创建的Username和自动生成的密码,点击登录按钮
5. 自动重定向回https://lobe.example.com/chat页面
6. 发送你的第一条消息

至此,你已经成功部署了 LobeChat 数据库版本,享受你的聊天之旅吧。