之前用的是客户端数据库版,客户端数据库模式下数据保留在用户本地,不会跨多端同步,也不支持文件上传、知识库等进阶功能。自用也挺不方便,今天抽空重新部署服务端DB版。
需要运行以下服务:
- LobeChat 数据库版本自身
- 带有 PGVector 插件的 PostgreSQL 数据库
- 支持 S3 协议的对象存储服务 – 这里使用minio
- 受 LobeChat 支持的 SSO 登录鉴权服务 – 这里使用Logto
- 用于反代和配置ssl的nginx – 这里使用nginx proxy manager
docker配置
安装docker、npm
docker-compose和.env配置文件
这里将lobe、数据库、鉴权、存储整合到一个配置文件。如果需要分离部署的项目,自行删改即可。
mkdir docker/lobedb
cd docker/lobedb
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
配置文件包括 .env
和 docker-compose.yml
两个文件,其中 .env
文件用于配置 LobeChat 的环境变量,docker-compose.yml
文件用于配置 Postgres、MinIO 和 Logto 服务。
修改域名和账号密码等敏感信息,其他配置项按照默认值进行配置即可,示例:
- docker-compose.yml
name: lobe-chat-database
services:
postgresql:
image: pgvector/pgvector:pg16
container_name: lobe-postgres
ports:
- '5432:5432'
volumes:
- './sqldata:/var/lib/postgresql/data'
environment:
- 'POSTGRES_DB=lobe'
- 'POSTGRES_PASSWORD=uWNZugjBqixf8dxC' # 修改
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U postgres']
interval: 5s
timeout: 5s
retries: 5
restart: always
minio:
image: minio/minio
container_name: lobe-minio
ports:
- '9000:9000'
- '9001:9001'
volumes:
- './miniodata:/etc/minio/data'
environment:
- 'MINIO_ROOT_USER=YOUR_MINIO_USER' # 修改
- 'MINIO_ROOT_PASSWORD=YOUR_MINIO_PASSWORD' # 修改
- 'MINIO_DOMAIN=lobe-s3-api.example.com' # 修改
- 'MINIO_API_CORS_ALLOW_ORIGIN=https://lobe.example.com' # Your LobeChat's domain name.
restart: always
command: >
server /etc/minio/data --address ":9000" --console-address ":9001"
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:uWNZugjBqixf8dxC@postgresql:5432/logto' # 修改
- 'ENDPOINT=https://lobe-auth-api.example.com' # 修改
- 'ADMIN_ENDPOINT=https://lobe-auth-ui.example.com' # 修改
entrypoint: ['sh', '-c', 'npm run cli db seed -- --swe && npm start']
lobe:
image: lobehub/lobe-chat-database
container_name: lobe-chat-db
ports:
- '3210:3210'
depends_on:
- postgresql
- minio
- logto
env_file:
- .env
restart: always
volumes:
sqldata:
driver: local
miniodata:
driver: local
networks:
default:
external: true
name: dockernetwork
- .env
# 必填,LobeChat 域名,用于 tRPC 调用
# 请保证此域名在你的 NextAuth 鉴权服务提供商、S3 服务商的 CORS 白名单中
APP_URL=https://lobe.example.com/
# Postgres 相关,也即 DB 必需的环境变量
# 必填,用于加密敏感信息的密钥,可以使用 openssl rand -base64 32 生成
KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ=
# 必填,Postgres 数据库连接字符串,用于连接到数据库
# 格式:postgresql://username:password@host:port/dbname,如果你的 pg 实例为 Docker 容器且位于同一 docker-compose 文件中,亦可使用容器名作为 host
DATABASE_URL=postgresql://postgres:uWNZugjBqixf8dxC@postgresql: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=NX2kaPE923dt6BL2U8e9oSre5RfoT7hg
# 必填,指定鉴权服务提供商,这里以 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_CLIENT_ID=YOUR_LOGTO_CLIENT_ID
AUTH_LOGTO_CLIENT_SECRET=YOUR_LOGTO_CLIENT_SECRET
AUTH_LOGTO_ISSUER=https://lobe-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=YOUR_S3_ACCESS_KEY_ID
# 必填,S3 的 Secret Access Key,对于 MinIO 来说,直到在 MinIO UI 中手动创建之前都是无效的
S3_SECRET_ACCESS_KEY=YOUR_S3_SECRET_ACCESS_KEY
# 必填,S3 的 Endpoint,用于服务端/客户端连接到 S3 API
S3_ENDPOINT=https://lobe-s3-api.example.com
# 必填,S3 的 Bucket,直到在 MinIO UI 中手动创建之前都是无效的
S3_BUCKET=lobe
# 必填,S3 的 Public Domain,用于客户端通过公开连接访问非结构化数据
S3_PUBLIC_DOMAIN=https://lobe-s3-api.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-xxxx
# OPENAI_PROXY_URL=https://api.openai.com/v1
# OPENAI_MODEL_LIST=...
启动
docker compose up -d
在npm进行反代:
域名和配套服务端口说明如下:
域名 | 默认端口 | docker names | 备注 |
lobe.example.com | 3210 | lobe-chat-db | LobeChat 服务端 |
lobe-auth-api.example.com | 3001 | lobe-logto | Logto 服务端 |
lobe-auth-ui.example.com | 3002 | lobe-logto | Logto UI |
lobe-s3-api.example.com | 9000 | lobe-minio | MinIO API |
lobe-s3-ui.example.com | 9001 | lobe-minio | MinIO UI |
参考设置:
不进行反向代理的服务端口:
postgresql
:你的 PostgreSQL 数据库服务端口,默认为5432
请务必注意,CORS 跨域是在 MinIO / Logto 服务端内部配置的,请勿在你的反向代理中额外配置 CORS,这会导致错误。
对于 minio 非 443 端口时,Host 必须是$http_host
(带端口号),否则会 403 错误:proxy_set_header Host $http_host
。
如果你需要配置 SSL 证书,请统一在外层的 Nginx 反向代理中配置,而不是在 MinIO 中配置。
Postgres 数据库配置
检查日志:
docker logs -f lobe-database
如果你在建表的时候出现了问题,你可以尝试使用如下命令强制移除数据库容器并重新启动:
docker compose down # 停止服务
sudo rm -rf ./sqldata # 移除挂载的数据库数据
docker compose up -d # 重新启动
登录鉴权服务配置
打开https://lobe-auth-ui.example.com 进行配置
- 注册一个新账户,首个注册的账户将自动成为管理员
- 在
Applications
里创建一个Next.js (App Router)
应用,名称随意 - 配置
Redirect URI
为https://lobe.example.com/api/auth/callback/logto
,Post sign-out redirect URI
为https://lobe.example.com/
- 配置
CORS allowed origins
为https://lobe.example.com
5. 获取 App ID
和 App secrets
,填入你的 .env
文件中的 AUTH_LOGTO_ID
和 AUTH_LOGTO_SECRET
中
6. 配置你的 .env
文件中 AUTH_LOGTO_ISSUER
为 https://lobe-auth-api.example.com/oidc
7. 可选,在左侧 Sign-in experience
面板的 Sign-up and sign-in - Advanced Options
中关闭 Enable user registration
,禁止用户自行注册。如果你禁止了用户自行注册,那么你只能在左侧 User Management
里手动添加用户。
8. 重启 LobeChat 服务:
docker compose up -d
S3 对象存储服务配置
打开 https://lobe-s3-ui.example.com
- 在登录界面输入你设置的
MINIO_ROOT_USER
和MINIO_ROOT_PASSWORD
,然后点击登录 - 在左侧面板 Administer / Buckets 中点击
Create Bucket
,输入lobe
(对应你的S3_BUCKET
环境变量),然后点击Create
3. 选中你的桶,点击 Summary – Access Policy,编辑,选择 Custom
,输入以下内容并保存(同样默认你的桶名为 lobe
):
{
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": ["*"]
},
"Action": ["s3:GetBucketLocation"],
"Resource": ["arn:aws:s3:::lobe"]
},
{
"Effect": "Allow",
"Principal": {
"AWS": ["*"]
},
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::lobe"],
"Condition": {
"StringEquals": {
"s3:prefix": ["files/*"]
}
}
},
{
"Effect": "Allow",
"Principal": {
"AWS": ["*"]
},
"Action": ["s3:PutObject", "s3:DeleteObject", "s3:GetObject"],
"Resource": ["arn:aws:s3:::lobe/files/**"]
}
],
"Version": "2012-10-17"
}
4. 在左侧面板 User / Access Keys 处,点击 Create New Access Key
,无需额外修改,将生成的 Access Key
和 Secret Key
填入你的 .env
文件中的 S3_ACCESS_KEY_ID
和 S3_SECRET_ACCESS_KEY
中
5. 重启 LobeChat 服务:
docker compose up -d
至此,LobeChat 数据库版本已成功部署,可以通过 https://lobe.example.com
访问LobeChat 服务。
Postgres 数据库配置
你可以使用下述指令检查日志:
docker logs -f lobe-database
在我们官方的 Docker 镜像中,会在启动镜像前自动执行数据库 schema 的 migration ,我们的官方镜像承诺「空数据库 -> 完整表」这一段自动建表的稳定性。因此我们建议你的数据库实例使用一个空表实例,进而省去手动维护表结构或者 migration 的麻烦。
如果你在建表的时候出现了问题,你可以尝试使用如下命令强制移除数据库容器并重新启动:
sh
docker compose down # 停止服务
sudo rm -rf ./data # 移除挂载的数据库数据
docker compose up -d # 重新启动
参考
https://lobehub.com/zh/docs/self-hosting/server-database/
https://github.com/lobehub/lobe-chat