Lobe Chat快速本地部署教程

本人致力于提供高质量原创技术内容,本不愿撰写类似低原创含量的教程文章。然而,Lobe Chat的部署复杂度和文档提供的多分支选项确实让人眼花缭乱并存在选择陷阱,完全吃透并成功自行搭建需要耗费大量精力。故将部署过程整理简化出来,避免重复耗费后人的精力。

背景

Lobe Chat是现代化设计的开源 ChatGPT/LLMs 聊天应用与开发框架,支持语音合成、多模态、可扩展的(function call)插件系统。

Lobe Chat主要优势:

  • 多端同步(vs NextChat)
  • 对话内容修改/重新生成(vs Dify)
  • 多用户的API Key相互隔离(vs Dify)
  • 支持多提供商接口而非仅OpenAI-Compatible接口(vs Open WebUI)

方案简介

如图,采用Lobe Chat数据库版 + PostgreSQL + MinIO本地部署,认证服务使用Auth0。

需要2个子域名lobechat.mydomain.coms3-lobechat.mydomain.com分别用于Lobe Chat访问和S3读写,MinIO管理面板可选在内网映射域名。

准备

  • 一个Cloudflare免费帐号
  • 一个域名,并将Name Server解析至Cloudflare,本文以*.mydomain.com指代
  • Cloudflare Tunnel已经运行在服务器上,用于后续将本地端口穿透至公网,如已有公网IP可自行映射域名
  • 一台可以运行Docker Compose的x86服务器/NAS,不少于600MiB的可用RAM空间
  • 一个服务器可以访问的HTTP_PROXY代理(Clash等),本文以http://mydomain.com:7890指代;由于在容器中部署不能使用localhost/127.0.0.1,根据实际情况可替换为服务器/NAS的IP(形如http://192.168.1.XXX:7890

常见问题

  • 为什么不使用不需要服务器还免费的Vercel + Cloudflare R2部署?
    经过搭建验证,Vercel上部署的Lobe Chat实例运行速度过慢,严重影响用户体验;
    另外,Vercel对免费Hobby账户有100,000次调用/月的Serverless function调用次数限制[1],而Lobe Chat实例会大量消耗调用次数,单人轻度使用半日约消耗2000次,完全无法支撑单人甚至多人整月使用

  • 为什么不使用文档默认的Clerk而使用Auth0作为认证服务?
    Lobe Chat的Clerk部分介绍存在误导,实际使用Clerk只能以Deployment模式[2]运行,而Production模式需要至少绑定clerk.lobechat.mydomain.com, accounts.lobechat.mydomain.com两个域名到Clerk;
    而Auth0可以无需绑定域名使用。

  • Lobe Chat本地部署的配置需求?
    Next.JS技术栈主要的资源占用瓶颈是RAM。根据本方案部署的本地实例有3个容器运行:

    容器RAM开销/MiB
    lobe-chat-database~400
    pgvector~5~100
    minio~100

    因此,建议保留600MiB以上的可用RAM空间。

  • 为什么不使用客户端数据库版Lobe Chat?
    客户端数据库版无法多端同步。

  • 为什么必需代理?
    经过搭建验证,目前Lobe Chat存在缺陷,如果访问Github ChangeLog不通则首页加载不完全,无法使用。因此目前必须提供代理才能在大陆正常使用;
    另外,如OpenAI官方API等也需要代理才能在大陆正常访问。

部署教程

按照如下方式,新建一个独立的目录并建立文件:

1
2
3
4
5
lobechat
├── db_data # 空目录
├── s3_data # 空目录
├── .env
└── docker-compose.yaml
docker-compose.yaml
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
services:
minio:
image: minio/minio:RELEASE.2025-01-20T14-49-07Z
container_name: lobechat-minio
ports:
- 9000:9000 # API口,映射到https://s3-lobechat.mydomain.com
- 9001:9001 # 管理口,[可选]映射到内网https://s3-ui-lobechat.mydomain.com
volumes:
- ./s3_data:/etc/minio/data
environment:
- MINIO_ROOT_USER=${MINIO_ROOT_USER}
- MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD}
- MINIO_API_CORS_ALLOW_ORIGIN=${APP_URL}
restart: always
command: >
server /etc/minio/data --address ":9000" --console-address ":9001"
db:
image: pgvector/pgvector:0.8.0-pg17
container_name: lobechat-db
volumes:
- ./db_data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=${DB_NAME}
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U ${DB_USER} -d ${DB_NAME}']
interval: 10s
timeout: 5s
retries: 5
restart: always

lobe:
image: lobehub/lobe-chat-database:v1.49.5
container_name: lobechat
ports:
- 3210:3210 # 前端入口,映射到https://lobechat.mydomain.com
depends_on:
- db
environment:
- HTTP_PROXY=${HTTP_PROXY}
- HTTPS_PROXY=${HTTP_PROXY}
- DATABASE_URL=postgresql://${DB_USER}:${DB_PASSWORD}@db:5432/${DB_NAME}
- APP_URL=${APP_URL}
- KEY_VAULTS_SECRET=${KEY_VAULTS_SECRET}
- NEXT_AUTH_SECRET=${KEY_VAULTS_SECRET}
- NEXT_AUTH_SSO_PROVIDERS=auth0
- NEXTAUTH_URL=${APP_URL}/api/auth
- AUTH_AUTH0_ID=${AUTH_AUTH0_ID}
- AUTH_AUTH0_SECRET=${AUTH_AUTH0_SECRET}
- AUTH_AUTH0_ISSUER=${AUTH_AUTH0_ISSUER}
- S3_ENABLE_PATH_STYLE=1
- S3_PUBLIC_DOMAIN=${S3_PUBLIC_DOMAIN}
- S3_ENDPOINT=${S3_PUBLIC_DOMAIN}
- S3_BUCKET=${S3_BUCKET}
- S3_ACCESS_KEY_ID=${S3_ACCESS_KEY_ID}
- S3_SECRET_ACCESS_KEY=${S3_SECRET_ACCESS_KEY}
restart: always
.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
# 本文件进行了大幅调整优化
# 如果需要调整,请参考Lobe Chat官方文档,并在docker-compose.yaml中手动注入相关容器的环境变量

DB_NAME=lobechat
DB_USER=<替换为你的DB用户名>
DB_PASSWORD=<替换为你的DB密码>

# 必填,LobeChat 域名,用于 tRPC 调用
# 请保证此域名在你的 NextAuth 鉴权服务提供商、S3 服务商的 CORS 白名单中
APP_URL=https://lobechat.mydomain.com

# Postgres 相关,也即 DB 必需的环境变量
# 必填,用于加密敏感信息的密钥,可以使用 openssl rand -base64 32 生成
KEY_VAULTS_SECRET=<敏感信息加密密钥>

# NEXT_AUTH 相关,也即鉴权服务必需的环境变量
AUTH_AUTH0_ID=<替换为你的ID>
AUTH_AUTH0_SECRET=<替换为你的SECRET>
AUTH_AUTH0_ISSUER=https://<替换为你的ISSUER>.auth0.com

# 代理相关,如果需要的话(比如使用 GitHub 作为鉴权服务提供商)
HTTP_PROXY=http://mydomain.com:7890

# S3 相关,也即非结构化数据(文件、图片等)存储必需的环境变量
S3_ACCESS_KEY_ID=
S3_SECRET_ACCESS_KEY=
# 必填,S3 的 Bucket
S3_BUCKET=lobechat
# 必填,S3 的 Public Domain,用于客户端通过公开连接访问非结构化数据
S3_PUBLIC_DOMAIN=https://s3-lobechat.mydomain.com

MINIO_ROOT_USER=<替换为你的minio用户名>
MINIO_ROOT_PASSWORD=<替换为你的minio密码>

替换.env文件中的字段为真实的值。

其中,KEY_VAULTS_SECRET可以用openssl rand -base64 32自行生成,或使用Lobe Chat官方文档预设的值:

1
KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ=

Auth0的变量需要先注册Auth0账户

  1. 区域建议选择日本JP,离大陆更近
  2. Dashboard -> Settings -> Environment Tag -> 设为Production -> Save
  3. Dashboard -> Applications -> Create Application -> Name和类型任选 -> (Application) Settings -> Application URIs -> Allowed Callback URLs填写https://lobechat.mydomain.com/api/auth/callback/auth0 -> Save Changes
  4. 复制该页面顶端的信息到.env
  • Domain -> AUTH_AUTH0_ISSUER
  • Client ID -> AUTH_AUTH0_ID
  • Client Secret -> AUTH_AUTH0_SECRET
  1. Dashboard -> Actions -> Triggers -> pre-user-registration -> Add Action -> Custom -> Create Action -> Name任选 -> 在Action的代码编辑页面,将代码替换为如下:
    1
    2
    3
    4
    5
    6
    7
    8
    // 这里填写允许注册的邮箱列表
    const allowList = ['[email protected]', '[email protected]'];

    exports.onExecutePreUserRegistration = async (event, api) => {
    if (!allowList.includes(event.user.email)) {
    api.access.deny("Your email address is not in the allowList.");
    }
    };
  2. Deploy -> Back to triggers -> 将刚刚部署的Action添加到流程图中间 -> Apply

如果希望开放任何人注册使用Lobe Chat,则上述添加Action白名单的步骤可以省略。

S3相关环境变量先留空,启动Docker Compose:

1
2
cd path/to/your/lobechat
docker-compose up -d

等待minio启动成功后,通过管理端口:9001访问管理页,用户名/密码参考.env

  1. Buckets -> Create Bucket -> Bucket Name填写lobechat -> Create Bucket
  2. lobechat Bucket的Access Policy改为Public,保存
  3. 再将lobechat Bucket的Access Policy改为Custom,并在下面的文本框内删除ListBucket Action,保存
  4. Access Keys -> Create Access Key,将关键信息添加到.env后点击Create:
  • Access Key -> S3_ACCESS_KEY_ID
  • Secret Key -> S3_SECRET_ACCESS_KEY

之后重启Lobe Chat服务:

1
2
docker-compose down
docker-compose up -d

使用Cloudflare Tunnel,将下面的服务器端口映射到域名:

  • 3210 -> https://lobechat.mydomain.com
  • 9000 -> https://s3-lobechat.mydomain.com
  • 9001 -> [可选]映射到内网https://s3-ui-lobechat.mydomain.com

测试:访问https://lobechat.mydomain.com,点击左上角登录正常,上传PDF知识库正常,则部署成功。

登录用户可以是Auth0邮箱+密码,也可以在登录页面自行注册,注册邮箱需要包含在Action白名单。


  1. 1.Manage and optimize usage for Serverless Functions - Vercel
  2. 2.Deployments & Migrations: Instances / Environments - Clerk