2025/03/22 更新内容
在 .env
文件末尾添加了 Ollama Embedding 模型的支持方法,用于内建知识库的向量检索。
Chapter 0 概要
LobeChat 的社区版本默认使用客户端数据库的方式,缺少多端同步功能,不支持知识库等功能。数据库版本(Database,DB)则支持这些功能,本篇教程适用于 DB 版本的域名模式的 LobeChat 部署。在开始教程之前,默认以下前提条件都以具备:
-
一台具有固定公网 IP 的服务器;
-
服务器已经安装
Docker
、Docker-Compose
、1Panel
以及OpenResty
; -
使用 NPS 作为内网穿透服务(影响不大,代理的原理都是一样的);
-
可以进行二级域名解析的合法域名;
-
已注册的第三方 AI 模型供应商的 API-KEY,例如 SiliconFlow,DeepSeek;
Chapter 1 域名设置
1.1 解析域名
在你的阿里云控制面板,进入到域名管理与解析界面,需要设置下面五个二级域名的解析。
lobe.example.com # LobeChat 服务端域名
lobe-auth-api.example.com # Logto 鉴权服务 API 域名
lobe-auth-ui.example.com # Logto 鉴权服务前端界面域名
lobe-s3-api.example.com # MinIO API 域名
lobe-s3-ui.example.com # MinIO 前端界面域名
如下所示,使用 记录类型A
将上述二级域名解析到公网的服务器。
1.2 NPS 反向代理
如下图所示,在 NPS 的域名解析部分,将刚才的二级域名统一解析到你内网服务器的 OpenResty
服务的 Server-IP:443
地址,用于下一步 https
解析。
Chapter 2 创建 Docker-Compose 安装文件与配置文件
根据你的安装习惯,先进入到一个目录内,再使用下面的命令创建一个 lobechat_db
目录,用于存放配置文件与数据库文件。
mkdir lobechat_db && cd ./lobechat_db
使用下面的指令创建 docker-compose.yml
文件。
vim docker-compose.yml
将下面的内容粘贴至文件内,需要注意的是:
-
⚠️⚠️⚠️==最重要的一条!!!该配置文件中有大量的 Password 敏感字段配置,切勿用于线上生产环境!!!否则一切后果自负!!!==⚠️⚠️⚠️
-
下列内容中所有
example.com
应当替换为你的一级域名; -
下列内容中,
minio
部分MINIO_ROOT_USER
和MINIO_ROOT_PASSWORD
,也就是根用户名和密码需要你进行更改; -
下列内容中,
postgresql
部分的POSTGRES_PASSWORD
需要更改,同时logto
部分的DB_URL
部分需要同步更改。
在做出必要的修改之后,保存该文件。
name: lobe-chat-database
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=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:
- './s3_data:/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']
restart: always
lobe:
image: lobehub/lobe-chat-database
container_name: lobe-chat
ports:
- '3210:3210'
depends_on:
- postgresql
- minio
- logto
env_file:
- .env
restart: always
volumes:
data:
driver: local
s3_data:
driver: local
之后,使用下面的指令创建环境配置文件。
vim .env
将下列的内容粘贴进去,需要注意的是:
- 下列内容中所有
example.com
应当替换为你的一级域名; KEY_VAULTS_SECRET
变量务必更新;DATABASE_URL
变量的密码应当和docker-compose.yml
中的postgresql
相关设置一致;NEXT_AUTH_SECRET
变量务必更新;
在做出必要的修改之后,保存该文件。
# 必填,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_ID=YOUR_LOGTO_ID
AUTH_LOGTO_SECRET=YOUR_LOGTO_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=...
# Ollama Embedding 模型
# OLLAMA_PROXY_URL=http://host:11434
# DEFAULT_FILES_CONFIG="embedding_model=ollama/bge-m3:latest"
Chapter 3 下载容器镜像并启动容器
输入下面的指令
docker compose up -d
检查日志
docker logs -f lobe-chat
如果在日志看到以下的内容,说明已经启动成功
你可以通过内网服务器地址 http://Server-IP:3210
访问 LobeChat 服务。
Chapter 4 OpenResty 代理、SSL 配置与 1Panel 网站设置
4.1 反向代理
在 1Panel
的网站设置页面,点击创建网站
,选择 反向代理
,按照下图的方式将刚才的五个域名依次创建网站,并做好备注,二级域名与代理地址端口的对应表如下表所示。
二级域名 | 端口号 |
---|---|
lobe.example.com | 3210 |
lobe-auth-api.example.com | 3001 |
lobe-auth-ui.example.com | 3002 |
lobe-s3-api.example.com | 9000 |
lobe-s3-ui.example.com | 9001 |
创建完成之后应当如下图所示这样。
4.2 SSL 证书申请
在创建完网站之后,点击左侧的 证书
页面,点击 申请证书
,主域名选择 lobe.example.com
,之后将其他四个域名添加到其他域名的框内,选择 ACME 账户,选择 DNS 账号之后,选择自动续签即可,点击确认后等待申请状态变为正常,如下图所示。
4.3 网站 HTTPS 解析设置
之后,返回到刚才的网站页面,选择刚才新建的一个网站,点击 配置
,点击 HTTPS
,选择启用 HTTPS
,如下这样设置即可,将其余四个也这样设置,证书都选择刚才新建的证书。
Chapter 5 配置鉴权服务
如果你正确配置了内网穿透与反向代理,那么访问 https://lobe-auth-ui.example.com
即可打开 Logto 服务的网站界面。选择注册一个新的账户,该服务的第一个新的账户将成为管理员账户。在首页或者在 Applicaiton
里面创建一个 Next.js (App Router)
。命名随意,直接创建即可。
Redirect URIs
需要填写 https://lobe.example.com/api/auth/callback/logto
;
Post sign-out redirect URIs
需要填写 https://lobe.example.com/
;
CORS allowed origins
需要填写 https://lobe.example.com
。
之后保存设置。
将前文创建的 .env
文件中的 AUTH_LOGTO_ID
设置为 App ID
;将 AUTH_LOGTO_ID
设置为 App secrets
;将 AUTH_LOGTO_ISSUER
设置为 https://lobe-auth-api.example.com/oidc
,记得更改为你的域名。
如果你不想开放注册的话,在左侧的 Sign-in experience
中的 Sign-up and sign-in
下面的 Enable user registration
关闭即可。这样只能在 User Management
手动添加用户。需要注意的是:⚠️⚠️⚠️==管理员账户不等于注册账户,不能用于鉴权登录,你需要新创建一个用户用于鉴权登录==⚠️⚠️⚠️
Chapter 6 S3 对象存储服务配置
如果你正确配置了内网穿透与反向代理,那么访问 https://lobe-s3-ui.example.com
即可打开 MinIO 服务的网站界面。用户名和密码为创建 docker-compose.yml
时设置的 MINIO_ROOT_USER
和 MINIO_ROOT_PASSWORD
。
在左侧的 Administrator/Buckets
中点击 Create Bucket
,名称为 lobe
。
创建之后,点击 Access Policy
编辑,选择 Custom
,将下面的 Json 内容粘贴进去即可。
{
"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/**"]
}
],
"Version": "2012-10-17"
}
之后,点击 Access Keys
,点击 Create access key
创建新的 KEY,将生成的 Access Key
和 Secret Key
填入前文创建的 .env
文件中的S3_ACCESS_KEY_ID
和 S3_SECRET_ACCESS_KEY
位置。
Chapter 7 正式启动服务
首先,先执行下面的指令,停止当前的容器。
docker compose down
之后启动。
docker compose up -d
到此为止,你可以通过 https://lobe.example.com
访问 LobeChat Database Version 了!
话外
本文同步自本人的个人博客站点:
https://blogs.kd-mercury.xyz/archives/4bb48cbe-47f7-4f22-942f-f427f9405d96
个人博客与 CSDN 同步更新。
欢迎大家进群讨论:913211989(小猫不要摸鱼)
进群令牌:fCLobeD