部署Lobe Chat Database版本(私有化部署)

项目地址:GitHub

官方文档:构建属于自己的 LobeChat – 自选部署平台 · LobeChat… · LobeHub

前言

LobeChat 是一款开源的聊天工具,支持多种AI模型、SSO登录和云同步功能。相比基础版,数据库版本通过集成 PostgreSQL、MinIO 和 Logto,带来了账户管理、知识库和子话题等高级特性。

由于官方文档省略了很多细节,各位在部署时难免踩坑。本文将带领你从零开始部署LobeChat数据库版本,让小白也能轻松玩转自部署。

环境

云服务商:腾讯云

系统:Debian12

本文涉及的技术

  • Docker
  • Nginx
  • Docker Compose
  • Auth:Logto
  • S3:Minio

Docker

安装Docker Engine

参考文档:https://docs.docker.com/engine/install

安装步骤

以下是Docker官方给出的安装步骤

1. 执行以下命令设置 Docker 的官方 GPG 密钥和存储库

sudo apt-get update && \
sudo apt-get install -y ca-certificates curl && \
sudo install -m 0755 -d /etc/apt/keyrings && \
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc && \
sudo chmod a+r /etc/apt/keyrings/docker.asc && \
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null && \
sudo apt-get update

2. 执行apt命令安装Docker软件包

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

3. 通过运行映像来验证安装是否成功

sudo docker run hello-world

可能遇到的问题

因为国内网络问题,无法从https://download.docker.com/linux/debian/gpg下载密钥

解决方案

方案1:使用以下命令检查是否可以访问Docker的官方服务器

curl -fsSL https://download.docker.com/linux/debian/gpg

多尝试几次,在访问成功后立即重新执行设置存储库的命令

方案2:不使用Docker的官方存储库安装Docker Engine,这里不做赘述

配置Docker Hub镜像源

由于国内目前无法直接访问Docker Hub,所以我们要先配置一个可访问的镜像仓库。

1. 找到或创建daemon.json文件

cd /etc/docker

2. 使用你喜欢的文本编辑器(例如 nano 或 vim)打开 daemon.json 文件

以下以 nano 为例展示如何打开文件(如果没有找到文件则会打开一个空文件,并在保存时创建)

sudo nano daemon.json

配置示例:

{   
    "registry-mirrors": [
        "https://docker.1ms.run",
        "https://hub.rat.dev",
        "https://docker.1panel.live"
        ]
}

编辑完成后按Ctrl+O回车保存,Ctrl+X退出

3. 保存并重启docker

sudo systemctl daemon-reload
sudo systemctl restart docker

配置DNS解析记录

域名描述
lobe.example.comLobeChat服务端域名
auth-api.example.comLogto 服务端域名
auth-ui.example.comLogto UI 域名
minio.example.comMinIO API 域名
minio-ui.example.com可选,MinIO UI域名

注:顶级域名(example.com)改为你自己的域名

打开腾讯云的云DNS解析,进入域名解析记录管理页面,点击添加记录

添加一条lobe的A记录指向服务器IP,其余为CNAME记录

配置nginx

安装

1. 执行以下命令安装nginx

sudo apt update
sudo apt install nginx

2. 设置开机自动启动服务

sudo systemctl enable nginx

3. 检查服务状态

sudo systemctl status nginx

基础配置

1. 移动到nginx根目录

cd /etc/nginx/sites-available/

2. 创建一个与域名同名的配置文件

sudo nano lobe.example.com

3. 添加基本配置(HTTP版本,稍后会升级到HTTPS)

server {
    listen 80;
    server_name lobe.example.com;
}

按Ctrl+O,回车保存,然后Ctrl+X退出。
listen 80:监听HTTP的默认端口,统一使用80端口。
server_name:绑定的域名。

剩下几个域名也按照相同的做法进行配置

4. 将配置文件链接到sites-enabled目录来启用配置

sudo ln -s /etc/nginx/sites-available/lobe.example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/auth-api.example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/auth-ui.example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/minio.example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/minio-ui.example.com /etc/nginx/sites-enabled/

5. 检查Nginx配置语法

sudo nginx -t

如果语法无误,会显示syntax is ok和test is successful

6. 重启Nginx

sudo systemctl restart nginx

申请证书

安装Certbot

执行以下语句安装certbot

sudo apt install certbot python3-certbot-nginx

验证安装

certbot --version

打印出certbot的版本号,代表安装正常

使用Certbot申请Let’s Encrypt证书

1. 首先保证80端口为开启状态

进入网页控制台的安全组页面,在入站规则中添加TCP:80端口,因为稍后我们会配置HTTPS,将443端口一并开启

2. 执行以下命令,Certbot会检测Nginx配置,并在创建证书时通过HTTP进行自动验证:

sudo certbot --nginx -d lobe.example.com -d auth-api.example.com -d auth-ui.example.com -d minio.example.com -d minio-ui.example.com

-d:指定需要申请证书的域名,可以多个。
–nginx:告诉Certbot自动修改Nginx配置。

如果想要只申请证书,不自动修改Nginx配置文件,在命令中加上certonly参数

sudo certbot --nginx certonly -d lobe.example.com -d auth-api.example.com -d auth-ui.example.com -d minio.example.com -d minio-ui.example.com

按照提示操作:
输入你的邮箱(用于接收证书到期提醒)。
同意服务条款(输入Y)
拒绝推广(输入N)

3. 重启Nginx服务:

sudo systemctl restart nginx

配置https与端口转发

1. 编辑Nginx配置文件

打开之前创建的域名配置文件:

sudo nano lobe.example.com

可以看到Certbot已经自动帮我们配置好了Https配置

修改配置,示例如下:

server {
    listen 80;
    server_name lobe.example.com;
    
    # 重定向所有请求到 HTTPS
    return 301 https://$server_name$request_uri;
}

# HTTPS 配置
server {
    listen 443 ssl http2;
    server_name lobe.example.com;
    
    ssl_certificate /etc/letsencrypt/live/lobe.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/lobe.example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    location / {
        proxy_pass http://localhost:3002; # 反向代理到3002端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
域名端口号
lobe.example.com3210
auth-api.example.com3001
auth-ui.example.com3002
minio.example.com9000
minio-ui.example.com9001

注:顶级域名(example.com)改为你自己的域名

其他几个站点也按照相同方式修改,保留自动创建的证书相关配置,主要差异为server_name的域名和proxy_pass的端口号

2. 检查并重启Nginx服务

sudo nginx -t
sudo systemctl restart nginx

3. 证书自动续期

检查自动续期状态

sudo systemctl status certbot.timer

模拟续期

sudo certbot renew --dry-run

手动续期

sudo certbot renew

至此Nginx配置完成,稍作休息吧。

Docker Compose

前置工作

创建一个系统用户用于运行lobechat

adduser --system --group --no-create-home lobe

创建docker compose文件夹

创建并切换到要存放docker compose的目录,这里以/opt/lobechat为例:
创建用户文件夹并赋权

mkdir -p /opt/lobechat/{data,s3_data}
chown -R lobe:lobe /opt/lobechat
chmod -R 750 /opt/lobechat
cd /opt/lobechat

创建密钥,后面配置中会用到

openssl rand -base64 32

配置Docker Compose

1. 创建并编辑docker-compose.yml文件

sudo nano docker-compose.yml

配置内容示例:

services:
  postgresql:
    image: pgvector/pgvector:pg16
    container_name: lobe-postgres
    ports:
      - '5432:5432'
    volumes:
      - './data:/var/lib/postgresql/data'
    environment:
      - 'POSTGRES_DB=lobe'
      - 'POSTGRES_PASSWORD=EHYO2JP6QDjN'
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U postgres']
      interval: 5s
      timeout: 5s
      retries: 5
    restart: always
    networks:
      - lobe_network

  minio:
    image: minio/minio
    container_name: lobe-minio
    ports:
      - '9000:9000'
      - '9001:9001'
    volumes:
      - './s3_data:/data'
    environment:
      - 'MINIO_ROOT_USER=lobechat'
      - 'MINIO_ROOT_PASSWORD=L9V4T8X2GPyW'
      - 'MINIO_DOMAIN=minio.example.com'
      - 'MINIO_API_CORS_ALLOW_ORIGIN=https://lobe.example.com'
    command: >
      server /data --address ":9000" --console-address ":9001"
    restart: always
    networks:
      - lobe_network


  logto:
    image: svhd/logto
    container_name: lobe-logto
    ports:
      - '3001:3001'
      - '3002:3002'
    depends_on:
      postgresql:
        condition: service_healthy
    environment:
      - 'TRUST_PROXY_HEADER=1'
      - 'DB_URL=postgresql://postgres:EHYO2JP6QDjN@lobe-postgres:5432/logto'
      - 'ENDPOINT=https://auth-api.example.com'
      - 'ADMIN_ENDPOINT=https://auth-ui.example.com'
    entrypoint: ['sh', '-c', 'npm run cli db seed -- --swe && npm start']
    restart: always
    networks:
      - lobe_network

  searxng:
    image: searxng/searxng
    container_name: lobe-searxng
    volumes:
      - './searxng-settings.yml:/etc/searxng/settings.yml'
    environment:
      - 'SEARXNG_SETTINGS_FILE=/etc/searxng/settings.yml'
    restart: always
    networks:
      - lobe-network
    env_file:
      - .env

  lobe:
    image: lobehub/lobe-chat-database
    container_name: lobe-database
    ports:
      - '3210:3210'
    depends_on:
      - postgresql
      - minio
      - logto
    env_file:
      - .env
    restart: always
    networks:
      - lobe_network

volumes:
  data:
    driver: local
  s3_data:
    driver: local

networks:
  lobe-network:
    driver: bridge

此配置包含以下四个必须容器

  • LobeChat 数据库版
  • 带有 PGVector 插件的 PostgreSQL 数据库
  • 受 LobeChat 支持的 SSO 登录鉴权服务:Logto
  • 支持 S3 协议的对象存储服务:MinIO

2. 创建并编辑.env文件

sudo nano .env

配置内容示例:

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

# Postgres 相关,也即 DB 必需的环境变量
# 必填,用于加密敏感信息的密钥,可以使用 openssl rand -base64 32 生成
KEY_VAULTS_SECRET=eUAy1lmSR405te8DaHJ4fWt6axxDfAbgm1h5JRch9kQ=
# 必填,Postgres 数据库连接字符串,用于连接到数据库
# 格式:postgresql://username:password@host:port/dbname,如果你的 pg 实例为 Docker 容器且位于同一 docker-compose 文件中,亦可使用容器名作为 host
DATABASE_URL=postgresql://postgres:EHYO2JP6QDjN@lobe-postgres:5432/lobe

# NEXT_AUTH 相关,也即鉴权服务必需的环境变量
# 可以使用 auth0、Azure AD、GitHub、Authentik、Zitadel、Logto 等,如有其他接入诉求欢迎提 PR
# 目前支持的鉴权服务提供商请参考:https://lobehub.com/zh/docs/self-hosting/advanced/auth#next-auth
# 如果你有 ACCESS_CODE,请务必清空,我们以 NEXT_AUTH 作为唯一鉴权来源
# 必填,用于 NextAuth 的密钥,可以使用 openssl rand -base64 32 生成
NEXT_AUTH_SECRET=eUAy1lmSR405te8DaHJ4fWt6axxDfAbgm1h5JRch9kQ=
# 必填,指定鉴权服务提供商,这里以 Logto 为例
NEXT_AUTH_SSO_PROVIDERS=logto
# 必填,NextAuth 的 URL,用于 NextAuth 的回调
NEXTAUTH_URL=https://lobe.example.com/api/auth

# NextAuth 鉴权服务提供商部分,以 Logto 为例
# 其他鉴权服务提供商所需的环境变量,请参考:https://lobehub.com/zh/docs/self-hosting/environment-variables/auth
AUTH_LOGTO_ID=
AUTH_LOGTO_SECRET=
AUTH_LOGTO_ISSUER=https://auth-api.example.com/oidc

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

# S3 相关,也即非结构化数据(文件、图片等)存储必需的环境变量
# 这里以 MinIO 为例
# 必填,S3 的 Access Key ID,对于 MinIO 来说,直到在 MinIO UI 中手动创建之前都是无效的
S3_ACCESS_KEY_ID=
# 必填,S3 的 Secret Access Key,对于 MinIO 来说,直到在 MinIO UI 中手动创建之前都是无效的
S3_SECRET_ACCESS_KEY=
# 必填,S3 的 Endpoint,用于服务端/客户端连接到 S3 API
S3_ENDPOINT=https://minio.example.com
# 必填,S3 的 Bucket,直到在 MinIO UI 中手动创建之前都是无效的
S3_BUCKET=lobe
# 必填,S3 的 Public Domain,用于客户端通过公开连接访问非结构化数据
S3_PUBLIC_DOMAIN=https://minio.example.com
# 选填,S3 的 Enable Path Style
# 对于主流 S3 Cloud 服务商,一般填 0 即可;对于自部署的 MinIO,请填 1
# 请参考:https://lobehub.com/zh/docs/self-hosting/advanced/s3#s-3-enable-path-style
S3_ENABLE_PATH_STYLE=1

# 其他基础环境变量,视需求而定。注意不要有 ACCESS_CODE
# 请参考:https://lobehub.com/zh/docs/self-hosting/environment-variables/basic
# 请注意,对于服务端版本,其 API 必须支持嵌入(即 OpenAI text-embedding-3-small)模型,否则无法对上传文件进行处理,但你无需在 OPENAI_MODEL_LIST 中指定此模型
OPENAI_API_KEY=sk-ISPexEpr46OGiyZMQAv6KKOp15RKN4OSoNtFkXxSCd8qbOFo
OPENAI_PROXY_URL=https://api.tu-zi.com/v1
OPENAI_MODEL_LIST="+gpt-4o-mini,+gpt-4o-2024-11-20"

GOOGLE_API_KEY=AIzaSyD11b0bDNzDotJmwX5mjZMhqvjqSfhI41Y
DEEPSEEK_API_KEY=sk-c348f7c40ba341bbaad3212f3d89c156

相关问题和解答

Q:S3_ENABLE_PATH_STYLE=1为什么对 MinIO 是必须的?

背景
S3(Simple Storage Service)有两种寻址方式:虚拟主机风格(Virtual-hosted-style,如 `bucket.s3.amazonaws.com`)和路径风格(Path-style,如 `s3.amazonaws.com/bucket`)。主流云服务(如 AWS S3)默认使用虚拟主机风格,但 MinIO 是一个自部署的 S3 兼容服务,默认需要路径风格。

为什么对 MinIO 必须?
MinIO 在本地部署时,通常没有像 AWS 那样的全球 DNS 解析支持,无法通过子域名(如 `bucket.minio.example.com`)直接访问存储桶。因此,MinIO 使用路径风格(`minio.example.com/bucket`)来定位存储桶。设置 `S3_ENABLE_PATH_STYLE=1` 告诉 LobeChat 使用路径风格与 MinIO 交互,否则会导致连接失败。

例外情况
如果你在 MinIO 上配置了自定义域名和 DNS 解析支持虚拟主机风格,可以设为 `0`,但这需要额外的网络配置,对于大多数自部署用户来说并不常见。

启动Docker Compose

docker compose up -d

Docker 会拉取所需的镜像(pgvector/pgvector:pg16, minio/minio, svhd/logto, lobehub/lobe-chat-database),然后启动容器。

完成后,你会看到类似以下输出:

检查容器运行状态

docker ps

问题排查

鉴于每个人的环境不同,启动时可能出现问题,简单说明如何用 `docker logs` 或 `journalctl` 检查问题

docker logs
用于查看 Docker 容器的日志输出,帮助诊断容器启动失败或运行时错误。适合检查 LobeChat、MinIO、Logto 等服务的具体问题。
用法:

docker logs <容器名>

journalctl
用于查看系统服务的日志(如 Nginx 或 Docker 服务本身),适合排查系统级问题。
用法:

journalctl -u <服务名>

Logto

创建管理员账户

1. 在浏览器中访问https://auth-ui.example.com
首次进入时由于还没创建管理员账户,会转到管理员账户创建页面,显示Welcome to Admin Console

2. 点击页面中的Create Account按钮

3. 输入用户名点击注册

4. 输入密码,并点击保存密码按钮

禁用logto密码检查(可选)

在旧版本的logto下会遇到一个问题,logto会调用一个远程API检查密码复杂度,而国内没法直接访问吗,所以在这一步会直接卡住(这在新版本Logto中已解决)

解决方案:

1. 进入postgresql容器并使用用户名 “postgres” 连接到 PostgreSQL 数据库

docker exec -it lobe-postgres psql -U postgres

2. 在logto的BD执行以下SQL禁用密码检查

\c logto
update sign_in_experiences set password_policy='{"rejects": {"pwned": false}}' where tenant_id='admin';

参考issues:https://github.com/logto-io/logto/issues/6577

创建一个Application

1. 在左侧的菜单中选择Applications

2. 在右侧区域中找到Next.js (App Router),点击下方的Start building按钮

3. 在弹出的Create application界面中随意填入一个Application name,我这里填入lobechat,点击Create application按钮

4. 在创建向导的中找到Redirect URIPost sign-out redirect URI两个文本框并填入内容

  • Redirect URI:https://lobe.example.com/api/auth/callback/logto
  • Post sign-out redirect URI:https://lobe.example.com/

5. 点击右下角的Finish and done

6. 完成创建,自动转到创建好的Application详情页

7. 在页面中找到App IDApp secrets中的Default secret记录下来,后面要用到

创建一个用户

1. 在左侧菜单中选择User management,并在右侧面板中点击Add User按钮

2. 填入Username和Name,并点击点击Add User按钮,Username为登录名,Name为显示名

3. 在This user has been successfully created窗口中复制自动生成的密码

MinIO

登录

1. 在浏览器中访问https://minio-ui.example.com

2. 在登录窗口中输入docker-compose.yml中配置的MINIOROOTUSERMINIOROOTPASSWORD,点击Login按钮

获取密钥

1. 在左侧菜单中选择Access Keys

2. 在右侧面板中可以看到,自动帮我们生成出了Access KeySecret Key,直接点击Create按钮即可

3. 在弹出的New Access Key Created面板中复制Access KeySecret Key,记录下来,后面要用到

配置.env文件

1. 打开之前创建的.env文件

sudo nano .env

2. 填入刚刚记录下的App IDDefault secretAccess KeySecret Key

3. 编辑完成后按Ctrl+O回车保存,Ctrl+X退出

4. 重启docker compose

docker compose up -d

LobeChat

1. 在浏览器中访问https://lobe.example.com

2. 点击左上角的Logo头像,在弹出的模态框中点击登录/注册按钮

3. 自动重定向到https://auth-api.example.com/sign-in页面

4. 在登录界面中填入刚刚创建的Username和自动生成的密码,点击登录按钮

5. 自动重定向回https://lobe.example.com/chat页面

6. 发送你的第一条消息

至此,你已经成功部署了 LobeChat 数据库版本,享受你的聊天之旅吧。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇