Docker搭建服务端数据库版LobeChat

之前用的是客户端数据库版,客户端数据库模式下数据保留在用户本地,不会跨多端同步,也不支持文件上传、知识库等进阶功能。自用也挺不方便,今天抽空重新部署服务端DB版。

需要运行以下服务:

  • LobeChat 数据库版本自身
  • 带有 PGVector 插件的 PostgreSQL 数据库
  • 支持 S3 协议的对象存储服务 – 这里使用minio
  • 受 LobeChat 支持的 SSO 登录鉴权服务 – 这里使用Logto
  • 用于反代和配置ssl的nginx – 这里使用nginx proxy manager

docker配置

安装docker、npm

docker-compose和.env配置文件

这里将lobe、数据库、鉴权、存储整合到一个配置文件。如果需要分离部署的项目,自行删改即可。

mkdir docker/lobedb
cd docker/lobedb
curl -fsSL https://raw.githubusercontent.com/lobehub/lobe-chat/HEAD/docker-compose/production/logto/docker-compose.yml > docker-compose.yml
curl -fsSL https://raw.githubusercontent.com/lobehub/lobe-chat/HEAD/docker-compose/production/logto/.env.zh-CN.example > .env

配置文件包括 .env 和 docker-compose.yml 两个文件,其中 .env 文件用于配置 LobeChat 的环境变量,docker-compose.yml 文件用于配置 Postgres、MinIO 和 Logto 服务。

修改域名和账号密码等敏感信息,其他配置项按照默认值进行配置即可,示例:

  • docker-compose.yml
name: lobe-chat-database
services:
  postgresql:
    image: pgvector/pgvector:pg16
    container_name: lobe-postgres
    ports:
      - '5432:5432'
    volumes:
      - './sqldata:/var/lib/postgresql/data'
    environment:
      - 'POSTGRES_DB=lobe'
      - 'POSTGRES_PASSWORD=uWNZugjBqixf8dxC'  # 修改
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U postgres']
      interval: 5s
      timeout: 5s
      retries: 5
    restart: always

  minio:
    image: minio/minio
    container_name: lobe-minio
    ports:
      - '9000:9000'
      - '9001:9001'
    volumes:
      - './miniodata:/etc/minio/data'
    environment:
      - 'MINIO_ROOT_USER=YOUR_MINIO_USER'  # 修改
      - 'MINIO_ROOT_PASSWORD=YOUR_MINIO_PASSWORD'  # 修改
      - 'MINIO_DOMAIN=lobe-s3-api.example.com'  # 修改
      - 'MINIO_API_CORS_ALLOW_ORIGIN=https://lobe.example.com' # Your LobeChat's domain name.
    restart: always
    command: >
      server /etc/minio/data --address ":9000" --console-address ":9001"


  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:uWNZugjBqixf8dxC@postgresql:5432/logto'  # 修改
      - 'ENDPOINT=https://lobe-auth-api.example.com'  # 修改
      - 'ADMIN_ENDPOINT=https://lobe-auth-ui.example.com'  # 修改
    entrypoint: ['sh', '-c', 'npm run cli db seed -- --swe && npm start']

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

volumes:
  sqldata:
    driver: local
  miniodata:
    driver: local

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

# Postgres 相关,也即 DB 必需的环境变量
# 必填,用于加密敏感信息的密钥,可以使用 openssl rand -base64 32 生成
KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ=
# 必填,Postgres 数据库连接字符串,用于连接到数据库
# 格式:postgresql://username:password@host:port/dbname,如果你的 pg 实例为 Docker 容器且位于同一 docker-compose 文件中,亦可使用容器名作为 host
DATABASE_URL=postgresql://postgres:uWNZugjBqixf8dxC@postgresql: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=NX2kaPE923dt6BL2U8e9oSre5RfoT7hg
# 必填,指定鉴权服务提供商,这里以 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_CLIENT_ID=YOUR_LOGTO_CLIENT_ID
AUTH_LOGTO_CLIENT_SECRET=YOUR_LOGTO_CLIENT_SECRET
AUTH_LOGTO_ISSUER=https://lobe-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=YOUR_S3_ACCESS_KEY_ID
# 必填,S3 的 Secret Access Key,对于 MinIO 来说,直到在 MinIO UI 中手动创建之前都是无效的
S3_SECRET_ACCESS_KEY=YOUR_S3_SECRET_ACCESS_KEY
# 必填,S3 的 Endpoint,用于服务端/客户端连接到 S3 API
S3_ENDPOINT=https://lobe-s3-api.example.com
# 必填,S3 的 Bucket,直到在 MinIO UI 中手动创建之前都是无效的
S3_BUCKET=lobe
# 必填,S3 的 Public Domain,用于客户端通过公开连接访问非结构化数据
S3_PUBLIC_DOMAIN=https://lobe-s3-api.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-xxxx
# OPENAI_PROXY_URL=https://api.openai.com/v1
# OPENAI_MODEL_LIST=...

启动

docker compose up -d

在npm进行反代:

域名和配套服务端口说明如下:

域名默认端口docker names备注
lobe.example.com3210lobe-chat-dbLobeChat 服务端
lobe-auth-api.example.com3001lobe-logtoLogto 服务端
lobe-auth-ui.example.com3002lobe-logtoLogto UI
lobe-s3-api.example.com9000lobe-minioMinIO API
lobe-s3-ui.example.com9001lobe-minioMinIO UI
具体的docker names可能和官方默认不同,使用docker ps查询并以实际为准。

参考设置:

图片[1]-Docker搭建服务端数据库版LobeChat-THsInk

不进行反向代理的服务端口:

  • postgresql:你的 PostgreSQL 数据库服务端口,默认为 5432

请务必注意,CORS 跨域是在 MinIO / Logto 服务端内部配置的,请勿在你的反向代理中额外配置 CORS,这会导致错误。
对于 minio 非 443 端口时,Host 必须是 $http_host(带端口号),否则会 403 错误:proxy_set_header Host $http_host
如果你需要配置 SSL 证书,请统一在外层的 Nginx 反向代理中配置,而不是在 MinIO 中配置。

Postgres 数据库配置

检查日志:

docker logs -f lobe-database
图片[2]-Docker搭建服务端数据库版LobeChat-THsInk

如果你在建表的时候出现了问题,你可以尝试使用如下命令强制移除数据库容器并重新启动:

docker compose down  # 停止服务
sudo rm -rf ./sqldata   # 移除挂载的数据库数据
docker compose up -d # 重新启动

登录鉴权服务配置

打开https://lobe-auth-ui.example.com 进行配置

  1. 注册一个新账户,首个注册的账户将自动成为管理员
  2. 在 Applications 里创建一个 Next.js (App Router) 应用,名称随意
  3. 配置 Redirect URI 为 https://lobe.example.com/api/auth/callback/logtoPost sign-out redirect URI 为 https://lobe.example.com/
  4. 配置 CORS allowed origins 为 https://lobe.example.com
图片[3]-Docker搭建服务端数据库版LobeChat-THsInk

5. 获取 App ID 和 App secrets,填入你的 .env 文件中的 AUTH_LOGTO_ID 和 AUTH_LOGTO_SECRET 中

6. 配置你的 .env 文件中 AUTH_LOGTO_ISSUER 为 https://lobe-auth-api.example.com/oidc

    图片[4]-Docker搭建服务端数据库版LobeChat-THsInk

    7. 可选,在左侧 Sign-in experience 面板的 Sign-up and sign-in - Advanced Options 中关闭 Enable user registration,禁止用户自行注册。如果你禁止了用户自行注册,那么你只能在左侧 User Management 里手动添加用户。

    图片[5]-Docker搭建服务端数据库版LobeChat-THsInk

    8. 重启 LobeChat 服务:

    docker compose up -d

    S3 对象存储服务配置

    打开 https://lobe-s3-ui.example.com

    1. 在登录界面输入你设置的 MINIO_ROOT_USER 和 MINIO_ROOT_PASSWORD,然后点击登录
    2. 在左侧面板 Administer / Buckets 中点击 Create Bucket,输入 lobe(对应你的 S3_BUCKET 环境变量),然后点击 Create
    图片[6]-Docker搭建服务端数据库版LobeChat-THsInk

    3. 选中你的桶,点击 Summary – Access Policy,编辑,选择 Custom,输入以下内容并保存(同样默认你的桶名为 lobe):

    图片[7]-Docker搭建服务端数据库版LobeChat-THsInk
    图片[8]-Docker搭建服务端数据库版LobeChat-THsInk
    {
      "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"
    }

    4. 在左侧面板 User / Access Keys 处,点击 Create New Access Key,无需额外修改,将生成的 Access Key 和 Secret Key 填入你的 .env 文件中的 S3_ACCESS_KEY_ID 和 S3_SECRET_ACCESS_KEY 中

    5. 重启 LobeChat 服务:

    docker compose up -d

    至此,LobeChat 数据库版本已成功部署,可以通过 https://lobe.example.com 访问LobeChat 服务。

    Postgres 数据库配置

    你可以使用下述指令检查日志:

    docker logs -f lobe-database

    在我们官方的 Docker 镜像中,会在启动镜像前自动执行数据库 schema 的 migration ,我们的官方镜像承诺「空数据库 -> 完整表」这一段自动建表的稳定性。因此我们建议你的数据库实例使用一个空表实例,进而省去手动维护表结构或者 migration 的麻烦。

    如果你在建表的时候出现了问题,你可以尝试使用如下命令强制移除数据库容器并重新启动:

    sh

    docker compose down  # 停止服务
    sudo rm -rf ./data   # 移除挂载的数据库数据
    docker compose up -d # 重新启动

    参考

    https://lobehub.com/zh/docs/self-hosting/server-database/

    https://github.com/lobehub/lobe-chat

    © 版权声明
    THE END
    喜欢就支持一下吧
    点赞0 分享
    评论 抢沙发
    头像
    欢迎您留下宝贵的见解!无需注册,过短或乱码评论会被屏蔽。
    提交
    头像

    昵称

    取消
    昵称表情代码图片

      暂无评论内容