#!/bin/bash # 检查必要的环境变量 if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then echo "缺少必要的环境变量 WEBDAV_URL、WEBDAV_USERNAME 或 WEBDAV_PASSWORD" exit 1 fi # 创建数据目录 mkdir -p ./data/webdav # 确保 WEBDAV_URL 末尾有 / if [[ ! "$WEBDAV_URL" =~ /$ ]]; then WEBDAV_URL="$WEBDAV_URL/" fi # 从 WebDAV 拉取最新的备份 echo "正在从 WebDAV 拉取备份..." LATEST_BACKUP=$(curl -s -L --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/openwebui/" | grep -o 'webui_[0-9]\{8\}_[0-9]\{4\}\.db' | sort -r | head -n 1) if [ -n "$LATEST_BACKUP" ]; then curl -o ./data/webdav/webui.db -L --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/openwebui/$LATEST_BACKUP" echo "已从 WebDAV 拉取备份: $LATEST_BACKUP" else echo "WebDAV 上未找到备份文件,将创建新的数据库。" fi if [ -f ./data/webdav/webui.db ]; then cp ./data/webdav/webui.db ./data/webui.db echo "从 GitHub 仓库中拉取成功" else echo "GitHub 仓库中未找到 webui.db,将在同步时推送" fi sync_data() { while true; do # 1. 同步到 WebDAV echo "正在开始同步..." cd ./data/webdav FILENAME="webui_$(date +'%Y%m%d_%H%M').db" # 假设最新的数据库文件在 ./webui.db,将其复制到 ./data/ 目录下并重命名为带时间戳的文件名 if [ -f ../webui.db ]; then cp ../webui.db ./$FILENAME echo "已复制最新的数据库文件到 ./data/webdav/$FILENAME" else echo "未找到 ./data/webui.db 文件,跳过复制步骤" fi # 检查是否存在要上传的文件 (现在检查带时间戳的文件) if [ -f ./$FILENAME ]; then # 使用 curl 进行文件上传 curl -T ./$FILENAME -L --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/openwebui/$FILENAME" && { echo "WebDAV 上传成功: $FILENAME" # 获取 WebDAV 上的所有备份文件 echo "调试信息: 获取 WebDAV 文件列表" curl -v -L --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/openwebui/" BACKUP_FILES=$(curl -s -L --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/openwebui/" | grep -o 'webui_[0-9]\{8\}_[0-9]\{4\}\.db' | sort) echo "调试信息: 获取到的文件列表:$BACKUP_FILES" # 统计备份文件数量 NUM_BACKUPS=$(echo "$BACKUP_FILES" | wc -l) # 如果备份文件数量超过 20 个,则删除最旧的备份 if (( NUM_BACKUPS > 20 )); then OLDEST_BACKUP=$(echo "$BACKUP_FILES" | head -n 1) curl -X DELETE -L --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/openwebui/$OLDEST_BACKUP" echo "已删除最旧的备份: $OLDEST_BACKUP" fi } || { echo "WebDAV 上传失败,等待重试..." sleep 10 curl -T ./$FILENAME -L --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/openwebui/$FILENAME" || { echo "重试失败,放弃 webdav 上传。" } } else echo "未找到 ./data/webdav/$FILENAME 文件,跳过 WebDAV 同步" fi # 2. 等待统一的时间间隔 SYNC_INTERVAL=${SYNC_INTERVAL:-7200} # 默认间隔时间为 7200 秒 echo "当前时间 $(date '+%Y-%m-%d %H:%M:%S')" echo "等待 ${SYNC_INTERVAL} 秒后进行下一次同步..." sleep $SYNC_INTERVAL done } # 后台启动同步进程 sync_data &