Contents
前言
对于chatgpt,我原本一直在使用mac上的app版,因为其每天有免费使用的额度,对于我这个轻度使用者来说,已经是绰绰有余了,很难用超。
不过,在研究wordpress上的AI插件”AI Engine”的时候,发现其只支持API的使用方式,且只支持如下几个供应商:
在这些供应商之间研究了半天,发现Azure的OpenAI可以白嫖一下下(初次注册第一个月送价值200美金的使用额度,之后每个月按需收费,也就是说不用就不收费),所以就去注册了一个。
不过后来想想,使用免费版的chatgtp虽然基本也够用了,但是不排除以后会有大量使用的时候,这时候Azure的OpenAI可以作为主力手段使用(毕竟不给月租费,用多少给多少,按需收费,很适合我这种屌丝)。但是嘛,Azure的OpenAI就只是提供API,没有可以直接使用的客户端,很不方便,这个问题如何解决呢?所以我不得不在开源大语言模式UI框架中寻找。
开源大语言模型UI框架有很多:Hugging Face Transformers、DeepSpeed、FastChat、LangChain、GPT-NeoX、Lobehub等等,其中,最适合一般个人部署的是Lobehub,因为其有以下优势:
1. 专注于简化本地部署
• 优势: LobeHub 强调简化本地大语言模型的部署和使用流程,为开发者和非技术用户提供易于操作的图形化用户界面(GUI)。这一点使得 LobeHub 尤其适合那些不想依赖云服务、需要在本地控制数据和模型的用户。
• 对比: 类似 Hugging Face 和 DeepSpeed 等框架虽然强大,但大多需要开发者具有较强的技术背景,且它们更专注于模型的微调和训练流程,提供的本地部署支持较少。
2. 用户友好的图形化界面(GUI)
• 优势: LobeHub 提供了直观的用户界面,非技术人员也可以通过可视化的操作界面轻松运行和管理模型。这使得其适用性更广,降低了使用大语言模型的门槛。
• 对比: 像 Hugging Face Transformers 和 GPT-NeoX 主要依赖命令行和 API,虽然功能强大,但需要一定的编程和配置能力。LobeHub 则能吸引那些不想深入代码的用户。
3. 插件和模块化设计
• 优势: LobeHub 支持插件化和模块化的扩展,这意味着用户可以根据自己的需求,轻松添加或移除功能。其灵活的设计允许更容易地集成自定义模型和工具。
• 对比: LangChain 提供了很强的集成外部工具和数据的能力,但它更侧重于复杂的工作流和多步骤推理。LobeHub 则更适合单纯的模型交互和扩展。
4. 本地运行,数据隐私
• 优势: LobeHub 允许用户在本地环境中部署和运行大语言模型,确保了数据的完全控制和隐私保护。对于那些敏感数据不适合上传到云端的应用场景,LobeHub 是一个理想的选择。
• 对比: Hugging Face 和 OpenAI 等框架通常需要依赖云端服务,而 LobeHub 则适合需要在本地处理数据的用户,尤其是在企业或隐私要求严格的场景。
5. 简化模型微调
• 优势: LobeHub 允许用户在已有的大语言模型上进行简单的微调和定制,使得模型更适合具体的业务场景。微调过程在 LobeHub 中较为简便,适合不具备深度学习背景的用户。
• 对比: DeepSpeed 和 GPT-NeoX 也支持大规模模型的训练和微调,但这些框架主要面向有高算力资源和深度学习知识的用户。LobeHub 则专注于降低微调的复杂性,吸引更广泛的用户群体。
6. 支持多种交互模式
• 优势: LobeHub 不仅提供了 Web 界面,还支持命令行接口(CLI)和 API 调用,灵活适应不同开发场景和用户需求。无论是技术人员还是普通用户,都能通过适合自己的方式与大语言模型进行交互。
• 对比: Hugging Face 和 LangChain 等框架虽然支持多种集成方式,但它们的交互方式主要依赖编程接口,GUI 支持较少。
7. 性能优化
• 优势: LobeHub 针对本地运行环境进行了性能优化,支持 GPU 加速,能够根据系统资源智能调整模型的运行方式,确保高效推理,适合资源有限的场景。
• 对比: DeepSpeed 等框架在分布式计算和大规模模型训练上表现突出,但它们对高性能硬件资源有一定依赖。LobeHub 则更适合个人用户或小型团队,在本地设备上实现相对高效的模型推理。
8. 社区驱动和开源扩展
• 优势: LobeHub 是一个开源项目,得到了开源社区的支持,开发者可以共享插件、扩展和解决方案,并进行定制开发。活跃的社区提供了强大的技术支持和资源。
• 对比: Hugging Face 也有活跃的社区和庞大的模型库,但更注重云端生态。LobeHub 则聚焦于本地化解决方案,并提供插件扩展的便利。
LobeHub 的最大优势在于其”易用性、数据隐私、本地部署、图形化界面和扩展性”,特别适合那些希望在本地运行和管理大语言模型、但又不愿花费大量精力配置和维护模型的用户。相比 Hugging Face、DeepSpeed 和 LangChain 等更专业化和技术导向的框架,LobeHub 更适合那些不具备深度学习知识但希望快速使用大模型的个人用户和中小企业。
所以,我的开源大语言模式UI框架就选择LobeHub了,而本次文章的主角”Lobechat”是使用 LobeHub 框架开发的具体应用:专注于实现基于大语言模型的对话系统(官网介绍:https://lobehub.com/zh/docs/usage/start)。通过 LobeChat,用户可以直接通过API和Lobechat支持的语言模型供应商进行交互,这就类似于chatgpt本地客户端的使用方式(只不过chatgpt已经绑定了OpenAI的API而已)。
前置知识
Lobechat服务端数据库版和本地部署版
LobeChat分为服务端数据库版和本地部署版两种类型。服务端数据库版是一个基于数据库的聊天机器人服务端,能够统一存储和管理对话记录、用户数据以及配置文件;而本地部署版其实就是一个简单的docker,不需要数据库,所有数据内容都存放在访问的客户端本地。
与本地部署版相比,服务端数据库版的功能更强大,特别适合规模较大的应用场景,两者的主要差别如下:
LobeChat 服务端数据库版:
- 数据存储与管理:
• 依赖于数据库(如 PostgreSQL、MySQL 等)来存储对话记录、用户信息、日志和配置。
• 支持多用户、多租户管理,适合企业或开发者团队使用。
• 提供持久化的数据存储和高级查询功能,适合分析和统计。
- 对象存储支持:
• 需要 S3 兼容的对象存储(如 MinIO 或 AWS S3)来管理上传的文件、模型配置和静态资源。
• 适合需要大量存储空间的场景,如文件共享、模型存储等。
- 扩展性与可维护性:
• 数据库版可与云服务和本地服务器进行混合部署,支持更大规模的应用场景。
• 易于备份、恢复、迁移数据,适合需要长期运行和维护的系统。
- 适用场景:
• 中大型企业,SaaS 应用开发。
• 需要复杂身份验证、权限管理和持久化数据存储的项目。
LobeChat 本地部署版:
- 轻量级:
• 不依赖于外部数据库或对象存储,数据通常存储在本地文件系统中。
• 适合小型项目或个人使用,不涉及多租户或复杂的用户管理。
- 简单部署:
• 更加轻量、易于安装,不需要复杂的数据库配置或对象存储。
• 部署更快捷,适合短期项目或实验性应用。
- 扩展性较弱:
• 由于缺少数据库的支持,难以管理大量用户、复杂数据或进行数据备份和分析。
• 适用于规模较小、数据量较少的应用。
简单来说,如果没有跨设备访问的需求(比如手机端访问和电脑端内容同步),lobechat本地部署版理论上也够了,但是如果要跨设备使用并且还想保留聊天上下文,或者多用户一起使用,就只能选择服务端数据库版了。
本着”有困难要上,没有困难创造困难也要上”的精神,我当然选择服务端数据库版了。
服务端数据库版组件介绍
PostgreSQL 数据库
PostgreSQL 是一种强大的开源关系型数据库管理系统,具备高度扩展性和标准 SQL 支持。它提供了丰富的数据类型、并发处理、数据完整性、安全性及可编程性,适用于复杂应用和大规模数据管理。
在本文的lobechat服务端数据库版的部署中,由于支持了文件对话 / 知识库对话的能力,所以需要为PostgreSQL数据库安装PGVector 插件(该插件为 Postgres 提供了向量搜索的能力,是 LobeChat 实现 RAG 的重要构件之一),且该数据库除了lobechat本身使用,用户认证相关的logto也需要使用。
MinIo COS(对象存储)
MinIO 是一个高性能的对象存储系统,完全开源,兼容 Amazon S3 API,旨在简化私有云、混合云和边缘环境中的大规模数据存储和管理,最关键的是,支持本地化部署。
由于lobechat服务端数据库版需要S3存储来支持多模态AI会话(用户在聊天过程中可能会上传文件、图片、文档等),所以需要一个可用的S3兼容的存储,最方便的就是使用minio自建一个(cloudflare R2是我用来当图床使用的,不想占用宝贵的10G免费空间~),当然,其他S3兼容的对象存储都可以,喜欢用哪个都行。
logto
Logto 是一个开源的身份和访问管理(IAM)平台,设计用于帮助开发者轻松地集成和管理用户身份验证、授权和单点登录(SSO)等功能。它能够支持多种认证方式,如 OAuth 2.0、OIDC(OpenID Connect)等标准协议,简化了开发人员在应用中添加用户认证的流程。
lobeChat推荐使用nextauth:一个灵活且强大的身份验证库,支持多种身份验证方式,包括 OAuth、邮件登录、凭证登录等,其可以支持多种ldP(身份提供商,例如 Google、GitHub、Email 等,也可以包括自定义解决方案,如logto),本文中将采用logot的本地化部署方式(其实logot也有SaaS型的在线服务,不过我看要填的信息比较多,就没去折腾了,貌似也有适合个人的免费版,大家有兴趣可以试试)。
注:还可以可以使用 auth0、Azure AD、Authentik、zitadel等身份验证方式。
部署lobechat
准备工作
准备5个域名:
- lobe.tangwudi.com用于访问lobechat
- lobe-s3-ui.tangwudi.com、lobe-s3-api.tangwudi.com分别用于访问自建的minio对象存储的webUI和API调用
- lobe-auth-ui.tangwudi.com、lobe-auth-api.tangwudi.com分别用于访问logto的webUI和API调用
注:大家根据自己的实际情况确定域名。
创建并进入工作目录
mkdir -p /docker/lebohub
cd /docker/lebohub
注:大家根据自己实际环境修改路径。
配置文件注释
官方提供的docker-compose.yml文配置件选项较多,且还有专门的环境变量文件”.env”。为了便于不太熟悉的朋友能够理解,我把”.env”文件的参数都集成到了docker-compose.yml里,并添加了注释,注释版内容可以直接使用(将相关参数根据实际环境进行替换即可)。
docker-compose.yml:
services:
# 部署postgres数据库
postgresql:
image: pgvector/pgvector:pg16 # 镜像地址
container_name: lobe-postgres # 容器名称,logto和lobechat都需要用容器名称调用数据库
ports:
- '5432:5432' # 映射宿主机端口(左)到容器内部的相同端口,宿主机端口可按需修改。另,除了"ports",如果是vps部署且采用公网地址回源,可以使用"expose"的方式进行替代。
volumes:
- './data:/var/lib/postgresql/data' # 定义宿主机的挂载目录(:左)
environment:
- 'POSTGRES_DB=lobe'
- 'POSTGRES_PASSWORD=password' # 可按需修改,这两项需要在下面的lobe中引用
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U postgres'] #数据库健康检查
interval: 5s
timeout: 5s
retries: 5
restart: always # 容器保持开启
# 部署minio,这一部分并不是必须的,如果采用其他S3兼容的对象存储或者有现成的minio,就只需要在最后部署lobechat时在参数中进行设置
minio:
image: minio/minio # 镜像地址
container_name: lobe-minio # 容器名称
ports:
- '9000:9000'
- '9001:9001' # 映射宿主机端口(左)到容器内部的相同端口,宿主机端口可按需修改
volumes:
- './s3_data:/etc/minio/data' # 定义宿主机的挂载目录(:左)
environment:
- 'MINIO_ROOT_USER=root' # minio的root用户名,可按需修改
- 'MINIO_ROOT_PASSWORD=password' # minio root用户密码,可按需修改
- 'MINIO_DOMAIN=lobe-s3-api.tangwudi.com' # 定义minio的api调用地址
- 'MINIO_API_CORS_ALLOW_ORIGIN=https://lobe.tangwudi.com' # 为lobechat的地址配置CORS的访问权限
restart: always # 容器保持开启
command: >
server /etc/minio/data --address ":9000" --console-address ":9001"
# 部署logto,这一部分不是必须的,如果采用其他的身份验证方式,就只需要在最后部署lobechat时在参数中进行设置
logto:
image: svhd/logto # 镜像地址
container_name: lobe-logto # 容器名称
ports:
- '3001:3001' # logto api
- '3002:3002' # logto ui
depends_on: # 指定logto容器启动的依赖关系,这里表示需要service postgresql先启动
postgresql:
condition: service_healthy # logto容器启动的前置条件是postgresql容器通过健康检查,相当于在postgresql先启动之外又加了一个条件
environment:
- 'TRUST_PROXY_HEADER=1'
- 'DB_URL=postgresql://postgres:password@lobe-postgres:5432/logto' # 设置数据库地址URL,注意这里的5432是容器内部端口
- 'ENDPOINT=https://lobe-auth-api.tangwudi.com' # 设置logto api的地址
- 'ADMIN_ENDPOINT=https://lobe-auth-ui.tangwudi.com' # 设置logto ui的地址
entrypoint: ['sh', '-c', 'npm run cli db seed -- --swe && npm start'] # 为logto初始化数据库
# 部署lobechat
lobe:
image: lobehub/lobe-chat-database # 镜像地址
container_name: lobe-database # 容器名称
ports:
- '3210:3210' # 映射宿主机端口(左)到容器内部的相同端口,宿主机端口可按需修改
environment:
# lobechat链接数据库的具体地址
- 'DATABASE_URL=postgresql://postgres:password@lobe-postgres:5432/lobe'
- 'KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ=' # 数据库密钥
- 'APP_URL=https://lobe.tangwudi.com/' # 必填LobeChat 域名,用于tRPC调用,请保证此域名在你的 NextAuth 鉴权服务提供商、S3 服务商的 CORS 白名单中
- 'NEXT_AUTH_SSO_PROVIDERS=logto' # 必填,指定鉴权服务提供商,这里以 Logto 为例
- 'NEXT_AUTH_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ=' # 必填,用于NextAuth的密钥,可以使用openssl rand -base64 32 生成
- 'NEXTAUTH_URL=https://lobe.tangwudi.com/api/auth' # 必填,NextAuth 的 URL,用于 NextAuth 的回调
- 'LOGTO_ISSUER=https://lobe-auth-api.tangwudi.com/oidc' # 指定Logto身份验证提供商(Identity Provider, IdP)的"授权服务器地址"
- 'LOGTO_CLIENT_ID=xxxxxxxxx' # 需要登录logto创建应用后获取
- 'LOGTO_CLIENT_SECRET=1IuPFNm08E5pdEk1Fd7OQWbmw05GM53n' # 同上
- 'S3_ENDPOINT=https://lobe-s3-api.tangwudi.com' # 必填,S3的Endpoint,用于服务端/客户端连接到 S3 API
- 'S3_BUCKET=lobe' # 必填,S3的Bucket,直到在MinIO UI中手动创建之前都是无效的
- 'S3_PUBLIC_DOMAIN=https://lobe-s3-api.tangwudi.com' # 必填,S3的Public Domain,用于客户端通过公开连接访问非结构化数据
- 'S3_ACCESS_KEY_ID=xxxxxxxxxx' # 需要登录minio后手动创建
- 'S3_SECRET_ACCESS_KEY=xxxxxxxxxxxx' # 同上
- 'S3_ENABLE_PATH_STYLE=1' # 对于主流 S3 Cloud 服务商,一般填 0 即可;对于自部署的 MinIO,请填 1
depends_on: # 指定lobe启动的依赖关系,需要在其他3个service启动之后再启动
- postgresql
- minio
- logto
restart: always # 容器保持开启
volumes:
data:
driver: local
s3_data:
driver: local
注1:文件中的logto或者S3部分的一些参数,如果是自建(logto和minio)是需要应用拉起来之后在对应的UI里设置才有的,所以lobechat服务端数据库版不是一次”docker-compose up -d”拉起所有应用就能设置完,需要初次拉起所有应用之后,对部分应用进行相关设置获取这些参数并补全之后,重新使用”docker-compose down && docker-compose up -d”命令进行正式部署,所以至少需要运行2次”docker-compose up -d”命令。
注2:正式开始部署之前,需要完成5个域名相关的准备工作,如下:
- 1、完成5个域名的解析
- 2、根据docker-compose.yml配置文件中各组件在宿主机上对应的端口,配置好反向代理以确保以下URL可用:
https://lobe.tangwudi.com --> http://lobe-database:3210
https://lobe-s3-ui.tangwudi.com/ --> http://lobe-minio:9001
https://lobe-s3-api.tangwudi.com --> http://lobe-minio:9000
https://lobe-auth-ui.tangwudi.com/.tangwudi.com --> http://lobe-logto:3002
https://lobe-auth-api.tangwudi.com --> http://lobe-logto:3001
注3:反向代理的设置需要大家根据自己平时习惯的反向代理软件进行对应的设置,如果是使用NPM或者宝塔面板配置反向代理,可以参考我之前的文章:docker系列 使用docker基于NPM搭建自己的反向代理以及linux面板系列 配置反向代理并使用非443端口进行发布。
注4:如果是使用cloudflare tunnel建站,就方便很多了,直接在对应的tunnel里的”Public hostnames”部分直接配置即可,详细配置步骤可以参考文章:家庭数据中心系列 通过tunnel技术,让无公网IP的家庭宽带也能白嫖cloudflare实现快速建站(推荐)。不过采用cloudflare tunnel方式也有隐患,无法设置cloudflare回源时的行为(不像nginx的反向代理可以配置很多选项),可能会引起logto工作异常(这时可能需要再加个nginx做反代?算了,太折腾)。
正式部署
拉起所有应用
cd /docker/lobehub
vim docker-compose.yml # 将上节中的配置文件内容粘贴进来并保存
docker-compose up -d # 拉起所有应用
注:请自行删除上面内容中”#”及之后的注释内容。
正常应该是所有容器状态都正常:
设置logto和minio
logto
使用链接https://lobe-auth-ui.tangwudi.com
登录logto,首次登陆需要创建一个管理员账号:
右上角可设置语言:
创建Next.js应用:
注意下图红框中的内容:
重定向URIs部分的代码如下,域名部分请使用自己实际的lobechat的域名进行替换:
https://lobe.tangwudi.com/api/auth/callback/logto
下图中”应用ID”和”App secrets”的内容记录下来,之后要补填到docker-compose.yml文件中:
minio
使用https://lobe-s3-ui.tangwudi.com/
登陆minio:
配置按照以下的图片内容进行:
上图中的访问策略如下(假定桶名是”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"
}
接下来创建minio的API key:
直接点击”Create”创建即可:
记录好实际操作时下图中的Access Key和Secret Key的内容:
重新部署
删除之前的Stacks,在docker-compose.yml中的lobechat-database部分补填完前面获取的S3和logto的相关内容后,使用完整的docker-compose.yml文件重新拉起所有应用:
docker-compose down
docker-compose up -d
使用如下命令查看lobechat状态:
docker logs -f lobe-database
如下显示则说明正常启动:
更多场景的部署可以直接参考官方文档:https://lobehub.com/zh/docs/self-hosting/start,虽然坑比较多,但是也还算是详细,可以参考。
附加内容1:使用github替代logto
logto的相关设置有点多,并且在部署的时候需要使用反向代理,一旦配置不当会导致访问出现问题(比如没有在nginx的反向代理中添加设置:”proxy_set_header X-Forwarded-Proto https;”)。对于一些本来就只有自己用的朋友来说,为配置logto花费太多时间和精力其实并不划算,所以单独再加上使用github作为身份验证的内容(当然,前提是有github账号~)。
详细设置github步骤参见下面的图文教程。
首先点击链接开始添加github app:https://github.com/settings/apps/new
创建client secret:
记住下图红框的Client ID和Client ID的内容,需要在docker-compose.yml中添加到lobechat-database部分”GITHUB_CLIENT_ID”和”GITHUB_CLIENT_SECRET”两个参数:
然后和前面一样,先配置minio,获取”S3_ACCESS_KEY_ID”和”S3_SECRET_ACCESS_KEY”的值,同样补全到docker-compose.yml文件中lobechat-database对应的参数部分。
最后完整的docker-compose.yml内容如下:
services:
# 部署postgresql数据库
postgresql:
image: pgvector/pgvector:pg16 # 镜像地址
container_name: lobe-postgres # 容器名称,logto和lobechat都需要用容器名称调用数据库
expose:
- '5432' # 映射宿主机端口(左)到容器内部的相同端口,宿主机端口可按需修改。另,除了"ports",如果是vps部署且采用公网地址回源,可以使用"expose"的方式进行替代。
volumes:
- './data:/var/lib/postgresql/data' # 定义宿主机的挂载目录(:左)
environment:
- 'POSTGRES_DB=lobe'
- 'POSTGRES_PASSWORD=password' # 可按需修改,这两项需要在下面的lobe中引用
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U postgres'] #数据库健康检查
interval: 5s
timeout: 5s
retries: 5
restart: always # 容器保持开启
# 部署minio,这一部分并不是必须的,如果采用其他S3兼容的对象存储或者有现成的minio,就只需要在".env"文件中进行设置
minio:
image: minio/minio # 镜像地址
container_name: lobe-minio # 容器名称
ports:
- '9000:9000'
- '9001:9001' # 映射宿主机端口(左)到容器内部的相同端口,宿主机端口可按需修改
volumes:
- './s3_data:/etc/minio/data' # 定义宿主机的挂载目录(:左)
environment:
- 'MINIO_ROOT_USER=root' # minio的root用户名,可按需修改
- 'MINIO_ROOT_PASSWORD=password' # minio root用户密码,可按需修改
- 'MINIO_DOMAIN=lobe-s3-api.tangwudi.com'
- 'MINIO_API_CORS_ALLOW_ORIGIN=https://lobe.tangwudi.com' # 为lobechat的地址配置CORS的访问权限
restart: always # 容器保持开启
command: >
server /etc/minio/data --address ":9000" --console-address ":9001"
# 部署lobechat服务端数据库版
lobe:
image: lobehub/lobe-chat-database # 镜像地址
container_name: lobe-database # 容器名称
ports:
- '3210:3210' # 映射宿主机端口(左)到容器内部的相同端口,宿主机端口可按需修改
environment:
- 'DATABASE_URL=postgresql://postgres:password@lobe-postgres:5432/lobe'
- 'KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ='
- 'APP_URL=https://lobe.tangwudi.com/' # 必填LobeChat 域名,用于tRPC调用,请保证此域名在你的 NextAuth 鉴权服务提供商、S3 服务商的 CORS 白名单中
- 'NEXT_AUTH_SSO_PROVIDERS=github' # 必填,指定鉴权服务提供商,这里改为github
- 'NEXT_AUTH_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ=' # 必填,用于NextAuth的密钥,可以使用openssl rand -base64 32 生成
- 'NEXTAUTH_URL=https://lobe.tangwudi.com/api/auth' # 必填,NextAuth 的 URL,用于 NextAuth 的回调
- 'GITHUB_CLIENT_ID=xxxx' # 前面获取的GITHUB_CLIENT_ID的内容
- 'GITHUB_CLIENT_SECRET=xxxxx' # 前面获取的GITHUB_CLIENT_SECRET的内容
- 'S3_ENDPOINT=https://lobe-s3-api.tangwudi.com' # 必填,S3 的 Endpoint,用于服务端/客户端连接到 S3 API
- 'S3_BUCKET=lobe' # 必填,S3 的 Bucket,直到在MinIO UI中手动创建之前都是无效的
- 'S3_PUBLIC_DOMAIN=https://lobe-s3-api.tangwudi.com' # 必填,S3 的 Public Domain,用于客户端通过公开连接访问非结构化数据
- 'S3_ACCESS_KEY_ID=xxxxxxxxxx'
- 'S3_SECRET_ACCESS_KEY=xxxxxxxxxxxx'
- 'S3_ENABLE_PATH_STYLE=1' # 对于主流 S3 Cloud 服务商,一般填 0 即可;对于自部署的 MinIO,请填 1
depends_on: # 指定lobe启动的依赖关系,需要在其他3个service启动之后再启动
- postgresql
- minio
restart: always # 容器保持开启
volumes:
data:
driver: local
s3_data:
driver: local
注:仍旧需要运行2次”docker-compose up -d”,不过,如果是直接使用第三方的对象存储,比如cloudflare R2,加上又使用了第三方的身份验证方式github,就只需要填完相关参数之后,运行一次”docker-compose up -d”命令即可。
附加内容2:docker run方式部署
本来,对于这种有多个关联性的容器的项目,使用docker-compose的方式部署最方便,不过,分开部署也有分开部署的好处,这样在需要时单独维护某个容器的时候更方面,并且也方便部署有问题时进行排错,所以我还是把每个容器的docker run格式命令发一下,方便大家有需要的时候使用。
创建工作目录:
mkdir -p /docker/lobehub
cd /docker/lobehub
mkdir -p postgres/data
mkdir s3_data
创建docker network:
docker network create public-net
postgres:
docker run --name lobe-postgres -d --restart=always --net=public-net \
-e POSTGRES_DB=lobe \
-e POSTGRES_PASSWORD=password \
-p 5432:5432 \
-v /docker/lobehub/postgres/data:/var/lib/postgresql/data \
pgvector/pgvector:pg16
logto:
docker run --name lobe-logto -d --restart=always --net=public-net \
-e POSTGRES_PASSWORD=password \
-p 3001:3001 \
-p 3002:3002 \
-e TRUST_PROXY_HEADER=1 \
-e DB_URL=postgresql://postgres:password@lobe-postgres:5432/logto \
-e ENDPOINT=https://lobe-auth-api.tangwudi.com \
-e ADMIN_ENDPOINT=https://lobe-auth-ui.tangwudi.com \
--entrypoint sh \
svhd/logto -c 'npm run cli db seed -- --swe && npm start'
minio:
docker run --name lobe-minio -d --restart=always --net=public-net \
-p 9000:9000 \
-p 9001:9001 \
-v /docker/lobehub/s3_data:/etc/minio/data \
-e MINIO_ROOT_USER=root \
-e MINIO_ROOT_PASSWORD=password \
-e MINIO_DOMAIN=lobe-s3-api.tangwudi.com \
-e MINIO_API_CORS_ALLOW_ORIGIN=https://lobe.tangwudi.com \
--restart always \
minio/minio server /etc/minio/data --address ":9000" --console-address ":9001"
lobechat-database:
docker run --name lobe-database -d --restart=always --net=public-net \
-p 3210:3210 \
-e DATABASE_URL=postgresql://postgres:password@lobe-postgres:5432/lobe \
-e KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ= \
-e APP_URL=https://lobe.tangwudi.com/ \
-e NEXT_AUTH_SSO_PROVIDERS=logto \
-e NEXT_AUTH_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ= \
-e NEXTAUTH_URL=https://lobe.tangwudi.com/api/auth \
-e LOGTO_ISSUER=https://lobe-auth-api.tangwudi.com/oidc \
-e S3_ENDPOINT=https://lobe-s3-api.tangwudi.com \
-e S3_BUCKET=lobe \
-e S3_PUBLIC_DOMAIN=https://lobe-s3-api.tangwudi.com \
-e S3_ENABLE_PATH_STYLE=1 \
--env-file .env \
lobehub/lobe-chat-database
顺便也发一下lobechat本地部署版的命令,对于不想折腾且又只在本地使用的朋友来说这个也是基本够用的:
docker run --name lobe-chat -d --restart=always \
-p 3210:3210 \
-e ACCESS_CODE=xxx \
lobehub/lobe-chat
其他的配置直接进lobechat本地部署版中进行设置即可。
lobechat基本设置
使用lobechat域名登陆
使用地址https://lobe.tangwudi.com
登陆lobechat:
然后按照正常的流程注册登陆:
如果是使用github进行身份验证,则需要手动确认:
注1:如果有waf且部署了防盗链之类的策略,需要将”github.com“加入访问白名单。
注2:如果使用了logto和minio,要注意这两者CORS相关的设置。
修改显示语言
按照如下步骤即可修改:
配置语言模型
lobechat支持多种语言模型:
以Azure OpenAI为例:
其他常用内容速览
系统助手:
会话:
文件:
发现:
以上只是介绍了一下Lobechat最基本的界面,其实里面的道道还有很多,我自己都只是刚装起来,还没正式用,所以细节部分也不清楚,等我自己使用一段时间之后,再看看要不要专门写一个Lobechat使用方面的文章吧。
总结
这次部署中坑很多,特别是logto,运气不好会遇到一堆莫名其妙的问题(什么登录进去就遇到内部错误、创建Next.js应用时转圈无法创建等,反正github上各种报bug~),感觉大部分时间都耗在这上面了(因为相关链接必须是https,所以又要涉及到反向代理的配置),我还遇到只要lobechat-database容器一启动logto就报错退出的怪问题,最后折腾一通后怎么好的我自己都不知道。
lobechat服务端数据库版的身份验证本质上来说,就是把登录请求丢到第三方身份验证服务去验证,通过验证之后第三方身份验证服务再把访问请求丢回给lobechat,如果配置不当,要么丢不过去(CORS策略没有配好),要么丢不回来(被防盗链策略拦截),不外乎就这两种情况,大家遇到问题排错的时候注意这一点。
举例说明:我在使用github进行认证的时候无法成功,后来发现是我在cloudflare WAF上设置的防盗链策略,直接导致github在回调的时候被WAF拦截了:
之后在防盗链设置中将referer包含”github.com”字段的请求加入防盗链白名单就好了。
最后,我建议尽量简化需要部署的组件,比如S3对象存储用第三方的(比如cloudflare R2、Amazon的S3),身份验证也使用自己最适合的第三方IdP(比如github),这样一来,需要本地部署的组件就只剩postgres数据库和lobechat了,出问题的几率就会大大下降。
另:评论区有朋友发了一张用AI绘制的文章的流程图,很有意思,我盗图发一下:
博主的网站设计的在我心巴上,问一下用的什么技术站或模板?
0成本,docker部署的wordpress+免费开源的argon主题就可以了,具体可以参考以下这篇文章:家庭数据中心系列 WordPress极速搭建个人博客之零基础新人直升大礼包。
自建lobehube出问题自闭48小时后的一篇开悟文章
lobechat服务端数据库版其实部署不复杂,就是可选项太多,如果一来就选择最适合的可选项,其实很简单,官方的部署教程涉及太多场景,容易把人搞晕。
查看图片
换一种图
可以可以,这个也排到我之后准备研究的实用技术的列表里。
查看图片
ai绘制了一下你的文章,效果还行
这个功能不错啊。
我盗一下你这张图,放到文章里去。