【OCI VPS体验】把 LobeChat 搬上云端,解锁完整功能的数据库版
编辑
在众多开源 AI 对话平台中,我进行了一番细致的对比和体验,最终选择了
LobeChat,并惊喜地发现其服务端数据库版本比默认的本地版本功能更为完善。本文记录了我在OCI VPS上折腾 LobeChat 的过程,从部署到体验完整功能的数据库版,一路踩坑也收获颇多
在寻找理想的私有化 AI 对话平台时,我的核心诉求是能完美且流畅地支持 Google Gemini 模型。为此,我考察了市面上几款主流的开源项目:LobeChat、LibreChat、Chatnio 以及 OpenWebUI。
🤔选型过程
LibreChat: 初步研究时,我发现它的
Docker Compose部署方案涉及的服务较多,看起来有些复杂,这在一开始就劝退了我。我更倾向于一个相对简洁、能快速上手的方案。Chatnio 和 OpenWebUI: 我实际安装并试用了这两个平台。尽管它们也都是优秀的项目,但在对接
Gemini模型时,我都遇到了一些或大或小的波折。LobeChat: 轮到 LobeChat 时,一切都变得异常顺利。它不仅 UI 设计现代化,更重要的是与
Gemini的对接几乎是开箱即用,没有任何阻碍。
这次经历让我深刻体会到,即便其他平台的问题可能通过正确的配置得以解决,但 LobeChat “默认就好用” 的特性,恰恰是其最大的优势之一 。它为用户节省了大量的调试时间和精力,将复杂性留给了自己,将简洁的体验留给了用户。因此 LobeChat 成为了我的最终选择,而后续发现的服务端数据库版本,更是锦上添花!让我坚信这个选择是完全正确的。
✨服务端版
LobeChat 默认采用客户端数据库 (IndexedDB) 方案,所有会话数据都存储在用户的浏览器中。 这种模式简单快捷,但存在一些明显的局限性:
数据无法跨设备同步: 聊天记录和设置无法在电脑和手机之间同步,造成了使用上的不便。
功能受限: 不支持知识库、文件管理等需要服务端存储的高级功能。
相比之下,服务端数据库版本则解决了这些痛点。通过将数据集中存储在服务器的 PostgreSQL 数据库中,它实现了:
多端数据同步: 无论在哪台设备上登录,都能无缝访问所有聊天记录和配置。
完整功能体验: 解锁了包括文件上传、知识库构建和向量检索 (RAG) 在内的所有高级功能。
数据持久化与安全: 数据存储在自己的服务器上,更加安全可控。
正是这些优势,让我决定立刻着手部署服务端数据库版本。
🐳Docker Compose 部署
服务端数据库版的部署虽然比本地版复杂,但通过官方提供的 Docker Compose 方案,整个过程也变得相当清晰和高效。 部署服务端数据库版本需要配置三个核心模块:数据库 (PostgreSQL)、身份验证服务以及 S3 存储服务。
不过,在本次实践中我并没有完全采用本地化部署,而是选择了采取一种更灵活的混合部署模式,将部分组件替换为成熟的云服务,以减轻维护负担:
身份验证服务: 使用
Logto Cloud的托管服务。S3 存储服务: 使用
Cloudflare R2,它提供了慷慨的免费额度。数据库: 依然通过 Docker Compose 部署
PostgreSQL。
☁️第一步:配置云服务
在修改配置文件之前,我们首先需要从 Logto 和 Cloudflare R2 获取必要的凭证信息。
1. 配置 Logto Cloud
你需要注册并登录 Logto Cloud,创建一个新的 Application。在配置过程中,你需要记下后续步骤中会用到的几个关键信息 App ID 、App Secret 和 Issure endpoint 。
2. 配置 Cloudflare R2
你需要登录 Cloudflare 控制台,创建一个 R2 存储桶 (Bucket),并为该存储桶创建一个具有读写权限的 API 令牌。你需要记下以下信息:Endpoint 、Bucket Name 、Access Key ID 和 Secret Access Key。
完成以上步骤并拿到所有凭证后,我们就可以开始配置部署文件了。
⬇️第二步:Docker Compose 配置
由于使用外部的认证和存储服务,因此官方的 docker-compose.yml 文件需要进行精简,只保留 lobe-chat 和 postgres 两个服务。
version: '3.8'
networks:
lobechat-network:
name: lobechat-network
driver: bridge
services:
postgresql:
image: pgvector/pgvector:pg17
container_name: chat-postgres
ports:
- '5432:5432'
volumes:
- './data:/var/lib/postgresql/data'
environment:
- 'POSTGRES_DB=${LOBE_DB_NAME}'
- 'POSTGRES_PASSWORD=${POSTGRES_PASSWORD}'
networks:
- lobechat-network
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U postgres']
interval: 5s
timeout: 5s
retries: 5
restart: always
lobe-chat:
image: lobehub/lobe-chat-database
container_name: chat-lobechat
restart: always
depends_on:
postgresql:
condition: service_healthy
ports:
- '3210:3210'
environment:
TZ: Asia/Shanghai
networks:
- lobechat-network
env_file:
- .env
🔑第三步:配置环境变量
新建 .env 文件,根据你在第一步中获取的信息,修改以下关键配置。
应用 URL
APP_URL: 你的 LobeChat 主服务访问域名,例如
https://chat.your-domain.com。
身份验证配置
NEXT_AUTH_SSO_PROVIDERS:logto
NEXT_AUTH_SECRET:用于加密
Auth.js会话令牌的密钥。您可以使用以下命令生成秘钥:openssl rand -base64 32。NEXTAUTH_URL:该 URL 用于指定
Auth.js在执行 OAuth 验证时的回调地址,当默认生成的重定向地址发生不正确时才需要设置。https://chat.your-domain.com/api/authAUTH_LOGTO_ISSUER:Logto Cloud
Issure endpoint地址。AUTH_LOGTO_ID:Logto Cloud 创建的应用
App ID。AUTH_LOGTO_SECRET:Logto Cloud 创建的应用
App Secret。
数据库配置
POSTGRES_PASSWORD:PostgreSQL 数据库密码。
DATABASE_URL:Postgres 数据库连接字符串。
LOBE_DB_NAME:自定义数据库名称。
Cloudflare R2 (S3) 配置
S3_PUBLIC_DOMAIN:S3 的公共域名。
S3_ENDPOINT:R2
Endpoint地址。S3_REGION:一般填写
auto。S3_ACCESS_KEY_ID:R2
Access Key ID。S3_SECRET_ACCESS_KEY:R2
Secret Access Key。S3_BUCKET:R2 存储桶名称。
安全密钥
KEY_VAULTS_SECRETNEXT_AUTH_SECRET :加密敏感信息的密钥,可以使用
openssl rand -base64 32命令生成新的随机值以确保安全。
# 必填,LobeChat 域名,用于 tRPC 调用
# 请保证此域名在你的 NextAuth 鉴权服务提供商、S3 服务商的 CORS 白名单中
APP_URL=https://chat.your-domain.com
# 用于加密敏感信息的密钥,可以使用 openssl rand -base64 32 生成
KEY_VAULTS_SECRET='RUffV130d0vl7l96JMERIV5km3FyBkpu4+y7YHJMZec='
# DB 必须的环境变量
LOBE_DB_NAME=lobechat
POSTGRES_PASSWORD=PostgreSQL 数据库密码
# Postgres 数据库连接字符串
# 格式:postgres://username:password@host:port/dbname,如果你的 pg 实例为 Docker 容器,请使用容器名
DATABASE_URL=postgres://postgres:password@chat-postgres:5432/lobechat
# NEXT_AUTH 相关,可以使用 auth0、Azure AD、GitHub、Authentik、zitadel 等,如有其他接入诉求欢迎提 PR
NEXT_AUTH_SECRET=RUffV130d0vl7l96JMERIV5km3FyBkpu4+y7YHJMZec=
NEXTAUTH_URL=https://chat.your-domain.com/api/auth
#Logto
NEXT_AUTH_SSO_PROVIDERS=logto
AUTH_LOGTO_ID=Logto Cloud 创建的应用 App ID
AUTH_LOGTO_SECRET=Logto Cloud 创建的应用 App Secret
AUTH_LOGTO_ISSUER=Logto Cloud Issure endpoint 地址
# S3 相关
S3_ACCESS_KEY_ID=R2 Access Key ID
S3_SECRET_ACCESS_KEY=R2 Secret Access Key
# 用于 S3 API 访问的域名
S3_ENDPOINT=R2 Endpoint 地址
S3_BUCKET=R2 存储桶名称
# 用于外网访问 S3 的公共域名,需配置 CORS
S3_PUBLIC_DOMAIN=https://example.com
# 如果需要指定地域
S3_REGION=auto
# 其他环境变量,视需求而定
#嵌入式模型,用于处理知识库 支持的模型提供商:zhipu/github/openai/bedrock/ollama
#DEFAULT_FILES_CONFIG=embedding_model=openai/xxx
# OPENAI_API_KEY=sk-xxxx
# OPENAI_PROXY_URL=https://api.openai.com/v1
# OPENAI_MODEL_LIST=...
# ...🌐第四步:配置反向代理
为了通过域名访问并启用 HTTPS,你需要配置一个反向代理服务器(如 Nginx)。为 lobe-chat 服务配置域名代理规则即可。
🚀第五步:启动服务
完成所有配置后,在 docker-compose.yml 同目录下执行以下命令启动服务:
docker compose up -d🎉第六步:访问并使用
现在,你可以通过你的主服务域名 https://chat.your-domain.com 访问 LobeChat 了。点击登录,页面将跳转至 Logto Cloud 进行认证,之后便可开始享受功能齐全、数据私有的 AI 对话体验。

🚧 踩坑记录
在享受 LobeChat 服务端版带来的便利和强大功能时,尤其是在深度探索知识库和多模型集成方面,我遇到了一些值得分享的“坑”,并记录了它们的解决方案。
Gemini 模型与知识库配置
如果在 LobeChat 的知识库功能中使用 Google Gemini 模型进行文件嵌入处理(RAG),则需要额外修改环境变量,以确保 LobeChat 能够正确调用 Gemini 的嵌入能力。LobeChat 在此处采取了一种与 OpenAI 格式兼容的配置方式:
# 嵌入式模型配置:指定 Gemini 作为知识库的嵌入模型
# 支持的模型提供商: zhipu/github/openai/bedrock/ollama
# 注意:这里虽然写的是 "openai/",但实际是允许指定其他兼容OpenAI API规范的模型,如Gemini嵌入模型
DEFAULT_FILES_CONFIG=embedding_model=openai/gemini-embedding-001
OPENAI_API_KEY=sk-xxxx # 凭证
OPENAI_PROXY_URL=https://api.your-openai.com/v1 # Gemini API代理知识库文件向量化
在使用某些较新的嵌入模型进行知识库文件向量化时,可能会遇到类似 [EmbeddingError](code 22000, routine "CheckExpectedDim") 的错误。
问题原因:
LobeChat 在默认的 pglite/pgvector 配置下,其 PostgreSQL 数据库表结构可能默认将嵌入向量维度设定为 1024。然而,很多新模型(如 OpenAI text-embedding-3 系列、Zhipu、LM-studio 等)输出的维度是 768、1536 或 3072,这就会触发此错误。
解决方案:修改数据库表结构
为了解决这个问题,你需要手动修改 PostgreSQL 数据库中 embeddings 表的结构,将其 embeddings 列的向量维度调整为你的嵌入模型实际输出的维度。
--gemini-embedding-001 的维度是3072
alter table embeddings alter column embeddings type vector(3072);知识库文件预览500错误
全部文件里的文件都可以预览,知识库里的文件就会出现500错误:
next auth: undefined
⨯ Error [TRPCError]: UNAUTHORIZED
at <unknown> (.next/server/chunks/12142.js:5127:15)
at callRecursive (.next/server/chunks/61882.js:441:24)
at next (.next/server/chunks/61882.js:447:12)
at <unknown> (.next/server/chunks/12142.js:5152:12)
at callRecursive (.next/server/chunks/61882.js:441:24)
at procedure (.next/server/chunks/61882.js:466:24)
at <unknown> (.next/server/chunks/92249.js:758:19)
at async FilePage (.next/server/app/[variants]/(main)/files/[id]/page.js:1097:18) {
cause: undefined,
code: 'UNAUTHORIZED',
digest: '744841157'
}
目前暂无解决方案,等待官方回复GitHub Issure当前已经解决:GitHub Pull
📖结语
从对比选型到成功部署服务端数据库版本,LobeChat 给我带来了超预期的体验。其出色的设计、强大的功能,尤其是服务端版本带来的数据同步和知识库能力,使其成为个人和团队构建私有化 AI 平台的绝佳选择!
- 0
- 2
-
分享