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.com
和s3-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 | lobechat |
1 | services: |
1 | # 本文件进行了大幅调整优化 |
替换.env
文件中的字段为真实的值。
其中,KEY_VAULTS_SECRET
可以用openssl rand -base64 32
自行生成,或使用Lobe Chat官方文档预设的值:
1 | KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ= |
Auth0的变量需要先注册Auth0账户:
- 区域建议选择日本JP,离大陆更近
- Dashboard -> Settings -> Environment Tag -> 设为Production -> Save
- Dashboard -> Applications -> Create Application -> Name和类型任选 -> (Application) Settings -> Application URIs -> Allowed Callback URLs填写
https://lobechat.mydomain.com/api/auth/callback/auth0
-> Save Changes - 复制该页面顶端的信息到
.env
:
- Domain ->
AUTH_AUTH0_ISSUER
- Client ID ->
AUTH_AUTH0_ID
- Client Secret ->
AUTH_AUTH0_SECRET
- 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.");
}
}; - Deploy -> Back to triggers -> 将刚刚部署的Action添加到流程图中间 -> Apply
如果希望开放任何人注册使用Lobe Chat,则上述添加Action白名单的步骤可以省略。
S3相关环境变量先留空,启动Docker Compose:
1 | cd path/to/your/lobechat |
等待minio启动成功后,通过管理端口:9001
访问管理页,用户名/密码参考.env
。
- Buckets -> Create Bucket -> Bucket Name填写
lobechat
-> Create Bucket - 将
lobechat
Bucket的Access Policy改为Public
,保存 - 再将
lobechat
Bucket的Access Policy改为Custom
,并在下面的文本框内删除ListBucket Action,保存 - Access Keys -> Create Access Key,将关键信息添加到
.env
后点击Create:
- Access Key ->
S3_ACCESS_KEY_ID
- Secret Key ->
S3_SECRET_ACCESS_KEY
之后重启Lobe Chat服务:
1 | docker-compose down |
使用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白名单。