使用 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:latestcontainer_name: lobe-nginxports:- "80:80"- "443:443"volumes:- ./nginx.conf:/etc/nginx/nginx.conf:ro- ./ssl:/etc/nginx/ssl:rodepends_on:- lobe- logto- miniorestart: alwayspostgresql:image: pgvector/pgvector:pg16container_name: lobe-postgresvolumes:- './data:/var/lib/postgresql/data'environment:- 'POSTGRES_DB=lobe'- 'POSTGRES_PASSWORD=uWNZugjBqixf8dxC'healthcheck:test: ['CMD-SHELL', 'pg_isready -U postgres']interval: 5stimeout: 5sretries: 5restart: alwaysminio:image: minio/miniocontainer_name: lobe-miniovolumes:- './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: alwayscommand: server /etc/minio/data --address ":9000" --console-address ":9001"logto:image: svhd/logto:1.19.0# 或 image: svhd/logto@sha256:3368f164d9147ed74b47b718241ccd844282908245262cf87be84bbb3d6bf62fcontainer_name: lobe-logtodepends_on:postgresql:condition: service_healthyenvironment:- '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-databasecontainer_name: lobe-databasedepends_on:- postgresql- minio- logtoenv_file:- .envrestart: alwaysvolumes:data:driver: locals3_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.confevents {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 的配置步骤进行了更详细的描述,力求让读者能够顺利完成部署。 请务必替换所有占位符为您的实际值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/58549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

驱动和芯片设计哪个难

驱动和芯片设计哪个难 芯片设计和驱动开发 芯片设计和驱动开发 都是具有挑战性的工作,它们各自有不同的难点和要求。 对于芯片设计,它是一个集高精尖于一体的复杂系统工程,涉及到从需求分析、前端设计、后端设计到流片的全过程。 芯片设计的…

DICOM标准:DICOM服务类详解,了解存储服务类、查询/检索服务类(Q/R Service Class)和工作流管理服务类等原理

目录 一、概述 二、存储服务类(Storage Service Class) 存储操作(C-STORE) 确认操作(C-STORE-RSP) 三、查询/检索服务类(Query/Retrieve Service Class) 查询操作(C…

八,Linux基础环境搭建(CentOS7)- 安装Mysql和Hive

Linux基础环境搭建(CentOS7)- 安装Mysql和Hive 大家注意以下的环境搭建版本号,如果版本不匹配有可能出现问题! 一、Mysql下载及安装 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Orac…

【数据结构 | PTA】懂蛇语

懂蛇语 在《一年一度喜剧大赛》第二季中有一部作品叫《警察和我之蛇我其谁》,其中“毒蛇帮”内部用了一种加密语言,称为“蛇语”。蛇语的规则是,在说一句话 A 时,首先提取 A 的每个字的首字母,然后把整句话替换为另一…

Virtuoso使用layout绘制版图、使用Calibre验证DRC和LVS

1 绘制版图 1.1 进入Layout XL 绘制好Schmatic后,在原理图界面点击Launch,点击Layout XL进入版图绘制界面。 1.2 导入元件 1、在Layout XL界面左下角找到Generate All from Source。 2、在Generate Layout界面,选中“Instance”&#…

Spring事务的实现方式

前言 Spring的spring-tx模块提供了对事务管理支持,使用Spring事务可以让我们从复杂的事务处理中得到解脱,无需去处理获得连接、关闭连接、事务提交和回滚等这些操作。Spring事务管理是Spring框架提供的一个核心功能,它允许开发者以声明式或编…

线性代数(1)——线性方程组的几何意义

线性代数的基本问题是求解个未知数的个线性方程; 例如:(方程1)。 在线性代数的第一讲中,我们从Row Picture、Column Picture、Matrix Picture三个角度来看这个问题。 上面的系统是二维的。通过添加第三个变量&#…

openMV固件库编译环境搭建Linux

1、换源及安装必要软件 sudo gedit /etc/apt/sources.list ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 选择你的ubuntu版本: 18.04 LTS # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors…

没有对象来和我手撕红黑树吧

1. 红黑树的介绍 红黑树也是一种自平衡的二叉搜索树,在每一个节点增加了一个存储位来表示节点的颜色,可以是红色也可以是黑色,通过约束颜色来维持树的平衡,具有以下的性质: 每个节点不是红色就是黑色根节点为黑色如果…

Android中SurfaceView与GLSurfaceView 的关系

SurfaceView 与 GLSurfaceView 的关系 在 Android 开发中,SurfaceView 和 GLSurfaceView 是实现自定义渲染效果的关键组件。它们提供了不同的渲染方式,适用于不同的应用场景。我们将通过以下几个方面详细说明 SurfaceView 和 GLSurfaceView 的特点及实现…

DEVOPS: 容器与虚拟化与云原生

概述 传统虚拟机,利用 hypervisor,模拟出独立的硬件和系统,在此之上创建应用虚拟机是一个主机模拟出多个主机虚拟机需要先拥有独立的系统docker 是把应用及配套环境独立打包成一个单位docker 是在主机系统中建立多个应用及配套环境docker 是…

电力物联网环境下的售电研究

泛在电力物联网打破了传统能源网络的壁垒,形成了能源共享、信息互通、数据开放的能源物联网。泛在电力物联网环境下,可再生能源接入更为容易。更加开放的能源接人、更加丰富的信息获取以及更加智能的电力设备,促进了电力市场的进一步开放。 …

H7-TOOL的LUA小程序教程第16期:脉冲测量,4路PWM,多路GPIO和波形打印(2024-10-25, 更新完毕)

LUA脚本的好处是用户可以根据自己注册的一批API(当前TOOL已经提供了几百个函数供大家使用),实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机安装APP差不多,所以在H7-TOOL里面被广泛使用&#xff…

Git提交代码完整流程

文章目录 一、引言二、代码提交流程1、准备工作2、代码更改2.1、暂存代码2.2、查看状态2.3、取消暂存 3、提交代码3.1、执行提交3.2、跳过暂存直接提交3.3、修正上一次提交 三、推送代码到远程仓库1、推送代码2、处理远程仓库的变更3、解决冲突 四、总结 一、引言 在软件开发过…

西瓜书《机器学习》符号表KaTex表示

写这篇post的缘故是最近整理机器学习的相关公式,经常要用到 KaTeX \KaTeX KATE​X, 但网络上搜索到的西瓜书符号表的表示有些并不准确或不严谨,本着严谨治学的态度,整理了一下符号表的 KaTeX \KaTeX KATE​X表示,希望有所帮助,整理…

docker的安装配置与基本简单命令

目录 1.docker简介 2.docker安装 2.1使用root用户登陆 更新yum源 2.2安装依赖 2.3设置yum源 更新yum源索引 2.4安装docker 2.5启动并且设置开机自启动 2.6验证安装是否成功 2.7配置docker加速器 2.8重启docker服务 3.docker简单使用 3.1下载镜像 3.2列出…

从线性代数到unity mvp矩阵

坐标变换:矩阵是一种线性空间变换的描述(矩阵的列向量,是坐标变换后的基向量)。 如: 如上图,即向量(-1,2)在经过由基底x轴:(1, -2) ,y轴:(3, 0)组成的矩阵变换后得到向量(5,2) 实际上就是-1倍的x轴:(1, -2)加上2倍的y轴:(3,…

线程同步 线程安全

这里写目录标题 线程安全互斥锁**互斥锁初始化****互斥锁加锁和解锁****销毁互斥锁****互斥锁死锁****互斥锁的属性** 条件变量条件变量初始化通知和等待条件变量条件变量的判断条件 自旋锁自旋锁初始化自旋锁加锁和解锁 读写锁读写锁初始化读写锁上锁和解锁读写锁的属性 线程安…

使用Python和OpenCV实现火焰检测

使用Python和OpenCV实现火焰检测 项目解释: 此 Python 代码是使用 OpenCV、线程、声音和电子邮件功能的火灾探测系统的简单示例。 以下是它的功能的简单描述: 导入库:代码首先导入必要的库: cv2:用于图像和视频处理…

蓝桥杯基本算法~~~一维/二维前缀和问题

文章目录 1.一维前缀和2.二维前缀和3.移动零问题4.颜色的分类问题 1.一维前缀和 问题说明:一维就是表示的是一维数组的计算,我们的这个一维前缀和是基于这个一维数组进行计算的; 什么是前缀和:就是10 20 30 40 50这个数组&#…