Tim's Blog

Tim's Blog

【OCI VPS体验】把 LobeChat 搬上云端,解锁完整功能的数据库版

2025-08-19
【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 IDApp SecretIssure endpoint

https://lobehub.com/zh/docs/self-hosting/advanced/auth/next-auth/logto

2. 配置 Cloudflare R2

你需要登录 Cloudflare 控制台,创建一个 R2 存储桶 (Bucket),并为该存储桶创建一个具有读写权限的 API 令牌。你需要记下以下信息:EndpointBucket NameAccess Key IDSecret Access Key

https://lobehub.com/zh/docs/self-hosting/advanced/s3/cloudflare-r2

完成以上步骤并拿到所有凭证后,我们就可以开始配置部署文件了。

⬇️第二步:Docker Compose 配置

由于使用外部的认证和存储服务,因此官方的 docker-compose.yml 文件需要进行精简,只保留 lobe-chatpostgres 两个服务。

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/auth

  • AUTH_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 对话体验。

doc_lobechat1.webp

🚧 踩坑记录

在享受 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代理
https://lobehub.com/zh/docs/self-hosting/advanced/knowledge-base#5-%E8%87%AA%E5%AE%9A%E4%B9%89-embedding%EF%BC%88%E5%8F%AF%E9%80%89%EF%BC%89

知识库文件向量化

在使用某些较新的嵌入模型进行知识库文件向量化时,可能会遇到类似 [EmbeddingError](code 22000, routine "CheckExpectedDim") 的错误。
问题原因:

LobeChat 在默认的 pglite/pgvector 配置下,其 PostgreSQL 数据库表结构可能默认将嵌入向量维度设定为 1024。然而,很多新模型(如 OpenAI text-embedding-3 系列、ZhipuLM-studio 等)输出的维度是 768、1536 或 3072,这就会触发此错误。

解决方案:修改数据库表结构

为了解决这个问题,你需要手动修改 PostgreSQL 数据库中 embeddings 表的结构,将其 embeddings 列的向量维度调整为你的嵌入模型实际输出的维度。

--gemini-embedding-001 的维度是3072
alter table embeddings alter column embeddings type vector(3072);
https://github.com/lobehub/lobe-chat/issues/8343

知识库文件预览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 平台的绝佳选择!