openwebui / sync_data.sh
yangtb24's picture
Update sync_data.sh
3a80330 verified
raw
history blame
3.76 kB
#!/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 &