使用 Docker Compose 将数据版 LobeChat 服务端部署

部署运行你感兴趣的模型镜像

在这里插入图片描述

LobeChat 是一个基于 TypeScript 的开源聊天机器人项目,支持本地部署和接入多个大语言模型。本文介绍如何使用 Docker Compose 将 LobeChat 服务端及其数据库部署到生产环境,让您拥有一个私有化的、可定制的 AI 聊天助手。
在这里插入图片描述

一、部署前准备

  1. 服务器: 一台拥有公网 IP 的服务器,并已安装 Docker 和 Docker Compose。

  2. 域名和 SSL 证书: 准备好以下域名及对应的 SSL 证书 (将 yourdomain.com 替换为您的实际域名)。证书名称需与 nginx.conf 文件中的配置一致,确保证书有效,以避免浏览器安全警告。

    • lobe.yourdomain.com - LobeChat 主应用
    • lobe-auth-api.yourdomain.com - Logto 认证 API
    • lobe-auth-ui.yourdomain.com - Logto 认证 UI

    如果您不打算自部署 MinIO,以下两个域名可以省略:

    • lobe-s3-api.yourdomain.com - MinIO API
    • lobe-s3-ui.yourdomain.com - MinIO UI
  3. MinIO (可选): MinIO 用于存储图片、文件等非结构化数据。您也可以使用阿里云 OSS、腾讯云 COS 等替代方案,如果选择其他方案,请参考 LobeChat 官方文档进行配置。

二、部署步骤

  1. 域名解析: 将上述域名解析到您的服务器 IP 地址。

  2. SSL 证书: 在服务器上创建 ssl 目录,并将所有域名的 SSL 证书文件 (.pem.key) 放入其中。确保文件权限正确。

  3. 配置文件: 将以下三个配置文件 (docker-compose.yml.envnginx.conf) 复制到服务器上的同一目录下。

    docker-compose.yml:

# docker-compose.yml
version: "3.9"
  nginx:
    image: nginx:latest
    container_name: lobe-nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./ssl:/etc/nginx/ssl:ro
    depends_on:
      - lobe
      - logto
      - minio
    restart: always

  postgresql:
    image: pgvector/pgvector:pg16
    container_name: lobe-postgres
    volumes:
      - './data:/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
    volumes:
      - './s3_data:/etc/minio/data'
    environment:
      - 'MINIO_ROOT_USER=admin'
      - 'MINIO_ROOT_PASSWORD=12345678'
      - 'MINIO_DOMAIN=lobe-s3-api.xxxxxx.com'
      - 'MINIO_API_CORS_ALLOW_ORIGIN=https://lobe.xxxxx.com'
    ports:
      - "9000:9000"
      - "9001:9001"
    restart: always
    command: server /etc/minio/data --address ":9000" --console-address ":9001"

  logto:
    image: svhd/logto:1.19.0
    # 或 image: svhd/logto@sha256:3368f164d9147ed74b47b718241ccd844282908245262cf87be84bbb3d6bf62f
    container_name: lobe-logto
    depends_on:
      postgresql:
        condition: service_healthy
    environment:
      - 'TRUST_PROXY_HEADER=1'
      - 'DB_URL=postgresql://postgres:uWNZugjBqixf8dxC@postgresql:5432/logto'
      - 'ENDPOINT=https://lobe-auth-api.xxxxxx.com'
      - 'ADMIN_ENDPOINT=https://lobe-auth-ui.xxxxxx.com'
    entrypoint: ['sh', '-c', 'npm run cli db seed -- --swe && npm start']

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

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

**`.env`**:
# .env

# 必填,LobeChat 域名,用于 tRPC 调用
# 请保证此域名在你的 NextAuth 鉴权服务提供商、S3 服务商的 CORS 白名单中
APP_URL=https://uiuiapi.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.xxxxxxx.com/api/auth

# NextAuth 鉴权服务提供商部分,以 Logto 为例
# 其他鉴权服务提供商所需的环境变量,请参考:https://lobehub.com/zh/docs/self-hosting/environment-variables/auth
LOGTO_CLIENT_ID=YOUR_LOGTO_CLIENT_ID
LOGTO_CLIENT_SECRET=YOUR_LOGTO_CLIENT_SECRET
LOGTO_ISSUER=https://lobe-auth-api.xxxxxxx.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.xxxxxxx.com
# 必填,S3 的 Bucket,直到在 MinIO UI 中手动创建之前都是无效的
S3_BUCKET=lobe
# 必填,S3 的 Public Domain,用于客户端通过公开连接访问非结构化数据
S3_PUBLIC_DOMAIN=https://lobe-s3-api.xxxxxxxx.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://api1.uiuiapi.com/v1  #我用的是第三方需要使用openai就改成 https://api.openai.com/v1
# OPENAI_MODEL_LIST=...

**`nginx.conf`**:
# nginx.conf

events {
    worker_connections 1024;
}

http {
    server {
        listen 80;
        server_name lobe.xxxxxx.com;
        return 301 https://$server_name$request_uri;
    }

    server {
        listen 443 ssl;
        server_name lobe.lovehxy.com;

        ssl_certificate /etc/nginx/ssl/lobe.xxxxxx.com.pem;
        ssl_certificate_key /etc/nginx/ssl/lobe.xxxxxxcom.key;

        location / {
            proxy_pass http://lobe:3210;
            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;
        }
    }

    server {
        listen 80;
        server_name lobe-auth-ui.lovehxy.com;
        return 301 https://$server_name$request_uri;
    }

    server {
        listen 443 ssl;
        server_name lobe-auth-ui.xxxxxx.com;

        ssl_certificate /etc/nginx/ssl/lobe-auth-ui.xxxxxx.com.pem;
        ssl_certificate_key /etc/nginx/ssl/lobe-auth-ui.xxxxxx.com.key;

        location / {
            proxy_pass http://logto: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;
        }
    }

    server {
        listen 80;
        server_name lobe-auth-api.xxxxxx.com;
        return 301 https://$server_name$request_uri;
    }

    server {
        listen 443 ssl;
        server_name lobe-auth-api.xxxxxx.com;

        ssl_certificate /etc/nginx/ssl/lobe-auth-api.xxxxxx.com.pem;
        ssl_certificate_key /etc/nginx/ssl/lobe-auth-api.xxxxxx.com.key;

        location / {
            proxy_pass http://logto:3001;
            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;
        }
    }

    server {
        listen 80;
        server_name lobe-s3-api.xxxxxx.com;
        return 301 https://$server_name$request_uri;
    }

    server {
        listen 443 ssl;
        server_name lobe-s3-api.xxxxxx.com;

        ssl_certificate /etc/nginx/ssl/lobe-s3-api.xxxxxx.com.pem;
        ssl_certificate_key /etc/nginx/ssl/lobe-s3-api.xxxxxx.com.key;

        location / {
            proxy_pass http://minio:9000;
            proxy_set_header Host $http_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;
        }
        client_max_body_size 100M;
    }

    server {
        listen 80;
        server_name lobe-s3-ui.xxxxxx.com;
        return 301 https://$server_name$request_uri;
    }

    server {
        listen 443 ssl;
        server_name lobe-s3-ui.xxxxxx.com;

        ssl_certificate /etc/nginx/ssl/lobe-s3-ui.xxxxxx.com.pem;
        ssl_certificate_key /etc/nginx/ssl/lobe-s3-ui.xxxxxx.com.key;

        location / {
            proxy_pass http://minio:9001;
            proxy_set_header Host $http_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;
        }
    }

    client_max_body_size 100M;
}


  1. MinIO Bucket 策略 (minio-bucket-config.json): 创建一个名为 minio-bucket-config.json 的文件,并将以下内容复制进去,将 lobe 替换为您的 bucket 名称 (如果使用了不同的名称):
{
  "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"
}
  1. 启动服务: 在包含配置文件的目录下执行 docker-compose up -d 启动服务。

  2. 配置 Logto:

    • 访问 https://lobe-auth-ui.yourdomain.com 并注册一个管理员账户。
    • 在 “Applications” 中创建一个 “Next.js” 应用,名称可以自定义。
    • 配置 “Redirect URI” 为 https://lobe.yourdomain.com/api/auth/callback/logto
    • 配置 “Post sign-out redirect URI” 为 https://lobe.yourdomain.com
    • 配置 “CORS allowed origins” 为 https://lobe.yourdomain.com
    • 获取生成的 “App ID” 和 “App Secret”,并填入 .env 文件中的 LOGTO_CLIENT_IDLOGTO_CLIENT_SECRET
    • 确保 .env 文件中的 LOGTO_ISSUERhttps://lobe-auth-api.yourdomain.com/oidc
    • 重启服务:docker-compose up -d
  3. 配置 MinIO:

    • 访问 https://lobe-s3-ui.yourdomain.com,使用 docker-compose.yml 中设置的 MINIO_ROOT_USERMINIO_ROOT_PASSWORD 登录。
    • 创建名为 lobe (或您在 .env 文件中 S3_BUCKET 指定的名称) 的 Bucket。
    • 选中新创建的 Bucket,点击 “Summary” -> “Access Policy”,选择 “Custom”,将 minio-bucket-config.json 文件中的内容复制粘贴进去并保存。
    • 在 “User” -> “Access Keys” 处,点击 “Create New Access Key”,无需额外修改,将生成的 “Access Key” 和 “Secret Key” 填入 .env 文件中的 S3_ACCESS_KEY_IDS3_SECRET_ACCESS_KEY
    • 重启服务:docker-compose up -d

三、访问 LobeChat

完成以上步骤后,即可访问使用 LobeChat。使用在 Logto 中注册的管理员账户登录即可开始使用。
在这里插入图片描述

四、其他说明

  • 密钥生成: 可以使用 openssl rand -base64 32 生成所需的密钥。
  • 环境变量: 请仔细检查 .env 文件中的所有环境变量,确保其值正确无误。
  • 日志查看: 可以使用 docker-compose logs -f 查看服务的运行日志,以便排查问题.
  • 数据持久化: 本配置使用了数据卷来持久化 PostgreSQL 和 MinIO 的数据,即使容器重启数据也不会丢失。

这个版本更加完整,补充了密钥生成、日志查看、数据持久化等说明,并对 Logto 和 MinIO 的配置步骤进行了更详细的描述,力求让读者能够顺利完成部署。 请务必替换所有占位符为您的实际值。

您可能感兴趣的与本文相关的镜像

LobeChat

LobeChat

AI应用

LobeChat 是一个开源、高性能的聊天机器人框架。支持语音合成、多模态和可扩展插件系统。支持一键式免费部署私人ChatGPT/LLM 网络应用程序。

### 使用 Docker Compose 部署 FRP 内网穿透服务端 #### 创建项目结构 为了使用 `Docker Compose` 来部署FRP内网穿透的服务端 (frps),首先需要建立合适的工作目录并准备必要的配置文件。通常情况下,建议创建一个新的工作空间用于保存所有的配置和数据。 ```bash mkdir -p ~/projects/frp-server/{conf,logs} cd ~/projects/frp-server/ ``` #### 编写 docker-compose.yml 文件 接下来编写 `docker-compose.yml` 文件来定义服务: ```yaml version: '3' services: frps: image: fatedier/frp:latest container_name: frps ports: - "7000:7000/tcp" - "7000:7000/udp" - "8080:8080/tcp" # HTTP Dashboard Port environment: - TZ=Asia/Shanghai volumes: - ./conf/frps.ini:/etc/frp/frps.ini - ./logs:/var/log/frp restart: unless-stopped ``` 此配置指定了要使用的镜像本以及映射到主机系统的端口和服务名称等信息[^4]。 #### 准备 frps 的 INI 配置文件 在上述命令中提到的路径下放置一个名为 `frps.ini` 的文件作为FRPS的主要设置文档: ```ini [common] bind_port = 7000 dashboard_addr = 0.0.0.0 dashboard_port = 8080 dashboard_user = admin dashboard_pwd = password token = your_token_here log_file = /var/log/frp/frps.log log_level = info max_pool_count = 5 subdomain_host = example.com allow_ports = 2000-3000,3001,3003,4000-50000 tcp_mux = true ``` 这段配置设置了服务器监听端口、仪表板访问地址和其他一些重要的安全性和性能选项[^2]。 #### 启动服务 完成以上步骤之后就可以通过下面这条简单的指令启动整个环境了: ```bash docker-compose up -d ``` 这将会以后台模式运行所有指定的服务实例,并保持它们持续运作直到手动停止为止。 #### 查看状态与日志 可以利用如下命令查看当前正在运行中的容器及其状态: ```bash docker ps | grep frps ``` 如果想要获取更多关于特定进程的信息,则可以通过查阅相应的日志记录来进行调试分析: ```bash tail -f logs/frps.log ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值