lobechat数据库版本的部署,用户认证方式是Auth0

Auth:河川       Date:2025/06/22       Cat:玩物志       Word:共12165字

lobechat的部署也是在ai的帮助下完成的,期间对话了好几轮,下面的内容是ai根据对话内容整理而成。

部署和维护 LobeChat (Docker Compose + Nginx + 自动更新)

本文档提供了使用 Docker Compose 部署 LobeChat 服务端数据库版、配置 Nginx 作为反向代理并启用 HTTPS,以及设置自动更新脚本的完整详细步骤。


第 1 部分:使用 Docker Compose 部署 LobeChat

1.1 准备环境

确保您的服务器已安装以下工具:

  • Docker
  • Docker Compose

如果未安装,请根据您的操作系统参考官方文档进行安装。

1.2 创建项目目录

创建一个目录用于存放部署文件:

mkdir lobechat-deployment
cd lobechat-deployment

1.3 创建 docker-compose.yml 文件

lobechat-deployment 目录中创建 docker-compose.yml 文件,并填入以下内容:

services:
  postgres:
    image: pgvector/pgvector:pg16
    container_name: my-postgres
    environment:
      POSTGRES_PASSWORD: password # 请替换为您自己的强密码
    networks:
      - lobechat-network
    ports:
      # 如果数据库仅供 LobeChat 容器访问,可以注释掉此端口映射
      - "127.0.0.1:5432:5432" # 数据库端口映射 (仅本地访问)
    volumes:
      - postgres_data:/var/lib/postgresql/data # 数据持久化卷

  lobechat:
    image: lobehub/lobe-chat-database
    container_name: lobe-chat-database
    depends_on:
      - postgres # 确保数据库先启动
    networks:
      - lobechat-network
    ports:
      # 映射到本地 3210 端口,供 Nginx 代理
      - "127.0.0.1:3210:3210"
    env_file:
      - .env # 引用环境变量文件
    restart: always # 推荐添加此项,确保容器异常退出后自动重启

networks:
  lobechat-network: # 定义网络

volumes:
  postgres_data: # 定义数据卷

(注意:docker-compose.yml 文件中的 POSTGRES_PASSWORD 应与下方 .env 文件中的 DATABASE_URL 内的密码部分匹配。示例中均为 password,强烈建议修改为更安全的密码。端口映射 127.0.0.1: 限制了只有本机可以访问该端口,增强安全性。)

1.4 创建环境变量文件 .env

lobechat-deployment 目录中创建 .env 文件,用于存放环境变量。文件内容如下(请根据您的实际情况修改所有占位符和示例值):

# 网站域名 (LobeChat 公开访问地址)
APP_URL=https://chat.example.com

# --- DB 必须的环境变量 ---
# 用于加密数据库中敏感数据的密钥,请务必生成您自己的 32 位随机十六进制字符串
KEY_VAULTS_SECRET=xxx
# 数据库连接字符串 (格式: postgres://用户名:密码@服务名:端口/数据库名)
# - 用户名: postgres (默认)
# - 密码: password (必须与 docker-compose.yml 中 POSTGRES_PASSWORD 一致)
# - 服务名: postgres (docker-compose.yml 中定义的服务名)
# - 端口: 5432 (容器内部端口)
# - 数据库名: lobechat_db (启动时会自动创建)
DATABASE_URL=postgres://postgres:password@postgres:5432/lobechat_db

# --- NEXT_AUTH 相关配置 (用于用户认证) ---
# NextAuth 密钥,请务必生成您自己的随机强密钥 (例如 openssl rand -hex 32)
NEXT_AUTH_SECRET=xxxx
# 使用的 SSO提供商 (示例为 Auth0, 可根据需要修改或添加其他提供商)
NEXT_AUTH_SSO_PROVIDERS=auth0
# NextAuth API 回调 URL (必须与 APP_URL 匹配)
NEXTAUTH_URL=https://chat.example.com/api/auth
# --- Auth0 配置示例 (如果您使用 Auth0) ---
AUTH0_CLIENT_ID=xxxx # 您的 Auth0 Client ID
AUTH0_CLIENT_SECRET=xxxx # 您的 Auth0 Client Secret
AUTH0_ISSUER=https://xxxx.us.auth0.com # 您的 Auth0 Issuer URL

# --- S3 相关配置 (用于文件存储,可选但推荐) ---
# 如果不配置 S3,文件将存储在服务器本地 (可能不适合多实例或无状态部署)
S3_ACCESS_KEY_ID=xxxx # 您的 S3 Access Key ID
S3_SECRET_ACCESS_KEY=xxxx # 您的 S3 Secret Access Key
S3_ENDPOINT=https://xxxx.r2.cloudflarestorage.com # 您的 S3 Endpoint URL (示例为 Cloudflare R2)
S3_BUCKET=xxx # 您的 S3 Bucket 名称
S3_REGION=auto # S3 区域 (例如 us-east-1, 对于 R2 通常是 auto)
S3_PUBLIC_DOMAIN=https://example.com # S3 公开访问域名前缀 (可选,根据 S3 配置和需求)
# 如果 S3 Bucket 不是公开可读,但需要生成带签名的临时访问 URL,请取消注释下一行
# S3_ENABLE_PRESIGNED_URL=1

(重要提示:请务必替换上述 .env 文件中的所有示例值,特别是 KEY_VAULTS_SECRET, POSTGRES_PASSWORD (在 DATABASE_URL 中修改), NEXT_AUTH_SECRET, 以及所有 AUTH0_S3_ 相关凭据为您自己的安全配置。)

1.5 启动服务

lobechat-deployment 目录下,执行以下命令来启动所有服务:

docker-compose up -d

此命令将:

  • 拉取所需的 Docker 镜像。
  • 创建并以后台模式 (-d) 启动 postgreslobechat 容器。
  • 设置网络并将 LobeChat 服务映射到 localhost:3210, 数据库映射到 localhost:5432

1.6 验证部署 (本地)

部署完成后,通过以下方式验证服务是否成功启动:

  1. 检查容器状态

    docker-compose ps

    确保 my-postgreslobe-chat-database 容器的状态为 UpRunning

  2. 查看日志

    # 查看所有服务日志
    docker-compose logs -f
    # 或只看 LobeChat 日志
    # docker-compose logs -f lobechat

    实时查看日志输出,检查是否有错误信息。按 Ctrl+C 退出。

此时,LobeChat 服务应该在 http://localhost:3210 上运行,但尚未通过域名和 HTTPS 访问。

1.7 管理服务

  • 停止服务
    docker-compose down

    (停止并移除容器,数据卷 postgres_data 会保留)

  • 重启服务
    docker-compose restart
    # 或者先 down 再 up
    # docker-compose down && docker-compose up -d
  • 更新镜像并重启
    # 拉取最新镜像
    docker-compose pull
    # 重新创建并启动容器
    docker-compose up -d --force-recreate

1.8 持久化数据和备份

数据库数据通过 Docker 卷 postgres_data 持久化。强烈建议定期备份此卷

备份 Docker 卷示例命令
/path/on/host/backups 替换为您服务器上用于存放备份文件的实际路径。

# 确保备份目录存在: mkdir -p /path/on/host/backups
docker run --rm \
  -v postgres_data:/volume \
  -v /path/on/host/backups:/backup \
  busybox \
  tar czvf /backup/postgres_data_backup_$(date +%Y%m%d_%H%M%S).tar.gz -C /volume .

第 2 部分:配置 Nginx (反向代理和 SSL)

2.1 创建 Nginx 配置文件

为 LobeChat 服务创建一个 Nginx 站点配置文件,例如 /etc/nginx/sites-available/chat.example.com

sudo nano /etc/nginx/sites-available/chat.066266.xyz

在文件中粘贴以下配置内容(请根据您的域名和证书路径进行调整):

# Nginx 配置文件 - 用于 LobeChat 的反向代理和 SSL/TLS 处理
# 域名: chat.example.com
# 假设使用 Let's Encrypt 获取的证书

# HTTP (端口 80) - 强制重定向到 HTTPS
server {
    listen 80;
    listen [::]:80; # 同时监听 IPv6
    server_name chat.example.com; # 替换为您的域名

    # ACME challenge (Let's Encrypt 验证)
    location /.well-known/acme-challenge/ {
        root /var/www/html; # 或您的 certbot webroot 路径
    }

    location / {
        return 301 https://$host$request_uri; # 永久重定向到 HTTPS
    }
}

# HTTPS (端口 443) - 主要服务块
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2; # 同时监听 IPv6
    server_name chat.example.com; # 替换为您的域名

    # SSL 证书配置 (请确保证书路径正确)
    ssl_certificate /etc/letsencrypt/live/chat.example.com/fullchain.pem; # 替换为您的证书路径
    ssl_certificate_key /etc/letsencrypt/live/chat.example.com/privkey.pem; # 替换为您的私钥路径
    # 可选: 包含 Let's Encrypt 推荐的 SSL 参数
    # include /etc/letsencrypt/options-ssl-nginx.conf;
    # ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    # 推荐的 SSL 安全设置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off; # 通常客户端优先更好
    ssl_session_cache shared:SSL:10m; # 会话缓存
    ssl_session_timeout 1d;
    ssl_session_tickets off; # 禁用 session tickets (增强安全性)
    # 可选: HSTS Header (强制浏览器使用 HTTPS)
    # add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

    # 访问日志和错误日志 (可选)
    # access_log /var/log/nginx/chat.example.com.access.log;
    # error_log /var/log/nginx/chat.example.com.error.log;

    location / {
        # 反向代理到 Docker Compose 映射的 LobeChat 服务端口
        proxy_pass http://127.0.0.1:3210;

        # --- 重要代理头设置 ---
        proxy_set_header Host $host; # 传递原始请求的主机名
        proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实 IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递代理链 IP
        proxy_set_header X-Forwarded-Proto $scheme; # 传递原始协议 (http/https)
        proxy_set_header Upgrade $http_upgrade; # 支持 WebSocket
        proxy_set_header Connection "upgrade"; # 支持 WebSocket

        # --- 代理优化设置 ---
        proxy_http_version 1.1; # 使用 HTTP/1.1
        proxy_buffering off; # 对 LobeChat 这类应用建议关闭缓冲
        proxy_request_buffering off; # 同上
        proxy_read_timeout 300s; # 增加读取超时时间
        proxy_send_timeout 300s;
        proxy_connect_timeout 75s;
    }
}

(注意:请务必将 chat.example.com 替换为您的实际域名,并将 ssl_certificatessl_certificate_key 的路径替换为您的 SSL 证书实际存放路径。确保 proxy_pass 指向 http://127.0.0.1:3210,与 Docker Compose 中 lobechat 服务的端口映射一致。如果您未使用 Let's Encrypt,请相应调整证书配置。)

2.2 启用 Nginx 配置

创建符号链接以激活该配置文件:

# 先删除可能存在的默认配置链接 (如果需要)
# sudo rm /etc/nginx/sites-enabled/default

# 创建新配置的链接
sudo ln -s /etc/nginx/sites-available/chat.example.com /etc/nginx/sites-enabled/

2.3 检查 Nginx 配置和重启服务

测试 Nginx 配置文件的语法是否正确:

sudo nginx -t

如果测试成功(显示 syntax is oktest is successful),则重新加载 Nginx 配置使其生效:

sudo systemctl reload nginx

如果 nginx -t 报错,请根据错误提示检查并修正配置文件。

2.4 验证设置 (公网访问)

  1. 在浏览器中访问 https://chat.example.com (替换为您的域名)。
  2. 确认 LobeChat 页面成功加载。
  3. 检查浏览器地址栏的锁形图标,确认 SSL/TLS 证书有效且受信任。
  4. 尝试访问 http://chat.example.com,确认是否自动跳转到了 https://

2.5 自动续期 SSL 证书 (如果使用 Let's Encrypt)

Certbot 工具通常在安装时会自动设置 Cron 任务或 Systemd Timer 来处理证书续期。

你可以手动测试续期过程(--dry-run 不会实际修改证书):

sudo certbot renew --dry-run

如果需要手动添加或确认 Cron 任务:

# 查看现有 Cron 任务
sudo crontab -l
# 查看 Certbot 的 Systemd Timer
# sudo systemctl list-timers | grep certbot

如果未自动设置,可以添加类似如下的 Cron 任务(通常不推荐手动添加,优先使用 Certbot 自动设置):
echo "0 3 * * * /usr/bin/certbot renew --quiet --deploy-hook 'sudo systemctl reload nginx'" | sudo tee -a /etc/crontab > /dev/null
(注意:--deploy-hook 会在续期成功后自动重载 Nginx。请确认 certbot 路径正确。)


第 3 部分:设置 LobeChat Database 自动更新

以下脚本用于自动检查 lobehub/lobe-chat-database 镜像更新,并在有新版本时通过 Docker Compose 重启服务。

3.1 创建自动更新脚本

创建脚本文件,例如 /root/lobechat-deployment/auto-update-lobe-chat-database.sh

#!/bin/bash

# 脚本名称: auto-update-lobe-chat-database.sh
# 功能: 自动检查并更新 LobeChat Database Docker 镜像和容器

# --- 配置 ---
# LobeChat 部署目录 (包含 docker-compose.yml 文件)
DEPLOYMENT_DIR="/root/lobechat-deployment"
# Docker 镜像名称
IMAGE_NAME="lobehub/lobe-chat-database:latest"
# 日志文件路径 (Cron 任务会将输出重定向到这里)
LOG_FILE="/var/log/auto-update-lobe-chat.log" # 确保此路径可写

# --- 可选配置: 设置代理 ---
# 如果服务器需代理访问 Docker Hub,取消注释并修改
# export https_proxy=http://127.0.0.1:7890
# export http_proxy=http://127.0.0.1:7890
# export all_proxy=socks5://127.0.0.1:7890

# --- 函数: 获取镜像的 Digest ---
get_digest() {
    docker inspect --format='{{index .RepoDigests 0}}' "$1" 2>/dev/null | awk -F'@' '{print $2}'
}

# --- 主逻辑 ---
echo "----------------------------------------" | tee -a "$LOG_FILE"
echo "Starting LobeChat Database update check at $(date)" | tee -a "$LOG_FILE"

# 检查部署目录
if [ ! -d "$DEPLOYMENT_DIR" ]; then
    echo "Error: Deployment directory '$DEPLOYMENT_DIR' not found." | tee -a "$LOG_FILE"
    exit 1
fi
# 切换到部署目录,方便执行 docker-compose 命令
cd "$DEPLOYMENT_DIR" || { echo "Error: Failed to navigate to deployment directory '$DEPLOYMENT_DIR'." | tee -a "$LOG_FILE"; exit 1; }

# 1. 获取当前本地镜像 Digest
echo "Getting current local image digest for $IMAGE_NAME..." | tee -a "$LOG_FILE"
current_digest=$(get_digest "$IMAGE_NAME")
echo "Current local digest: ${current_digest:-'Not found'}" | tee -a "$LOG_FILE"

# 2. 拉取最新镜像 (使用 docker-compose pull 可以拉取 compose 文件中定义的所有服务)
echo "Pulling latest images defined in docker-compose.yml (including $IMAGE_NAME)..." | tee -a "$LOG_FILE"
# output=$(docker-compose pull lobechat 2>&1) # 只拉取 lobechat 服务相关的镜像
output=$(docker-compose pull 2>&1) # 拉取所有服务的新镜像
pull_status=$?

if [ $pull_status -ne 0 ]; then
    echo "Error: Failed to pull latest image(s). Docker Compose output:" | tee -a "$LOG_FILE"
    echo "$output" | tee -a "$LOG_FILE"
    # 即使拉取出错,也可能只是部分镜像失败,继续检查目标镜像的 digest
    # exit 1 # 暂时不退出
fi
echo "Pull attempt finished." | tee -a "$LOG_FILE"

# 3. 获取更新后的本地镜像 Digest
echo "Getting new image digest for $IMAGE_NAME after pull..." | tee -a "$LOG_FILE"
new_digest=$(get_digest "$IMAGE_NAME")

if [ -z "$new_digest" ]; then
    echo "Error: Failed to retrieve new digest after pull for '$IMAGE_NAME'. Check Docker Hub status or image availability." | tee -a "$LOG_FILE"
    exit 1
fi
echo "New digest: $new_digest" | tee -a "$LOG_FILE"

# 4. 比较 Digest 判断是否有更新
if [ "$current_digest" != "$new_digest" ]; then
    echo "Update detected for $IMAGE_NAME! Digest changed from '$current_digest' to '$new_digest'." | tee -a "$LOG_FILE"

    # 获取新版本信息 (如果镜像标签包含版本)
    current_version=$(docker inspect "$IMAGE_NAME" | grep 'org.opencontainers.image.version' | awk -F'"' '{print $4}')
    echo "New version label detected: ${current_version:-'N/A'}" | tee -a "$LOG_FILE"

    # 使用 Docker Compose 重启服务 (down 会停止并移除容器, up -d 会用新镜像创建并启动)
    echo "Restarting services via Docker Compose..." | tee -a "$LOG_FILE"
    docker-compose down || echo "Warning: docker-compose down command failed, attempting to proceed..." | tee -a "$LOG_FILE"
    docker-compose up -d
    if [ $? -ne 0 ]; then
        echo "Error: docker-compose up -d failed after update pull. Check Docker Compose logs." | tee -a "$LOG_FILE"
        exit 1 # 启动失败是严重问题
    fi
    echo "Services restarted successfully with the new image." | tee -a "$LOG_FILE"

    # 记录更新信息
    echo "Update completed at: $(date)" | tee -a "$LOG_FILE"
    echo "New Digest applied: $new_digest" | tee -a "$LOG_FILE"
    echo "Running version label: ${current_version:-'N/A'}" | tee -a "$LOG_FILE"

    # 5. 清理旧的、未使用的 LobeChat Database 镜像 (可选)
    echo "Cleaning up old/dangling images..." | tee -a "$LOG_FILE"
    docker image prune -f --filter "label!=maintainer=LobeHub" # 清理悬空镜像,避免误删其他基础镜像
    # 或者更精确地删除旧的 lobechat 镜像:
    # docker images --filter "reference=lobehub/lobe-chat-database" --format "{{.ID}} {{.Tag}}" | grep -v 'latest' | awk '{print $1}' | xargs -r docker rmi -f
    echo "Image cleanup process finished." | tee -a "$LOG_FILE"

else
    current_version=$(docker inspect "$IMAGE_NAME" | grep 'org.opencontainers.image.version' | awk -F'"' '{print $4}')
    echo "No update detected for $IMAGE_NAME. Image digest '$current_digest' is the latest." | tee -a "$LOG_FILE"
    echo "Current running version label: ${current_version:-'N/A'}" | tee -a "$LOG_FILE"
fi

echo "Update check finished at $(date)" | tee -a "$LOG_FILE"
echo "----------------------------------------" | tee -a "$LOG_FILE"
exit 0

使用说明:

  1. 保存脚本:将代码保存到 /root/lobechat-deployment/auto-update-lobe-chat-database.sh
  2. 设置日志文件权限:确保日志文件路径(如 /var/log/auto-update-lobe-chat.log)可被执行 Cron 任务的用户写入,或者选择其他有权限的路径。例如,创建日志文件并设置权限:
    sudo touch /var/log/auto-update-lobe-chat.log
    sudo chown $(whoami):$(whoami) /var/log/auto-update-lobe-chat.log # 或者设置为 root:root 如果以 root 运行 Cron
  3. 赋予执行权限
    chmod +x /root/lobechat-deployment/auto-update-lobe-chat-database.sh

3.2 设置定时任务 (Cron Job)

使用 Cron 来定期执行此脚本。

  1. 编辑当前用户的 Cron 表(如果想以 root 运行,使用 sudo crontab -e):

    crontab -e
  2. 添加任务行:例如,设置每天凌晨 4:05 执行脚本:

    # 每天凌晨 4:05 检查并更新 LobeChat Database
    5 4 * * * /root/lobechat-deployment/auto-update-lobe-chat-database.sh >> /var/log/auto-update-lobe-chat.log 2>&1
    • 5 4 * * *:表示每天的 4 点 05 分执行。
    • /root/lobechat-deployment/auto-update-lobe-chat-database.sh:脚本的绝对路径。
    • >> /var/log/auto-update-lobe-chat.log 2>&1:将标准输出和错误输出追加到指定的日志文件。
  3. 保存并退出 编辑器。

3.3 脚本错误处理:换行符问题 (CRLF vs LF)

如果在 Windows 编辑器中创建或修改了脚本,上传到 Linux 后执行可能会因换行符格式不同而出错(看到 ^M 或类似 bad interpreter 的错误)。

解决方法:

  • 方法 1:使用 dos2unix (推荐)
    # 安装 (Debian/Ubuntu): sudo apt-get update && sudo apt-get install -y dos2unix
    # 安装 (CentOS/RHEL): sudo yum install -y dos2unix
    dos2unix /root/lobechat-deployment/auto-update-lobe-chat-database.sh
  • 方法 2:使用 sed
    sed -i 's/\r$//' /root/lobechat-deployment/auto-update-lobe-chat-database.sh
  • 方法 3:在 Linux 环境下重新创建
    使用 nanovim 在 Linux 服务器上直接创建并粘贴脚本内容。

最终总结

通过以上三个部分的步骤,您已经成功地:

  1. 使用 Docker Compose 部署了 LobeChat 服务端数据库版,实现了服务的容器化管理和数据持久化。
  2. 配置了 Nginx 作为反向代理,通过 HTTPS 提供对 LobeChat 的安全访问,并处理了域名映射。
  3. 设置了一个自动更新脚本和 Cron 任务,用于定期检查并应用 LobeChat Docker 镜像的更新,简化了维护工作。

请确保定期检查 Nginx 配置、SSL 证书状态以及自动更新脚本的日志,以保证服务的持续稳定运行。记得备份 postgres_data 数据卷!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注