File size: 4,766 Bytes
f883aff |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
#!/bin/bash
# 检查必要的WebDAV环境变量
if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
echo "缺少必要的WebDAV环境变量: WEBDAV_URL, WEBDAV_USERNAME 或 WEBDAV_PASSWORD"
exit 1
fi
# 去除WEBDAV_URL末尾的斜杠(如果有的话)
WEBDAV_URL=$(echo "$WEBDAV_URL" | sed 's/\/$//')
# 创建数据目录
mkdir -p ./data/webdav
check_webdav_webui_latest_exists() {
http_code=$(curl --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" --head --silent --write-out "%{http_code}" "$WEBDAV_URL/OpenWebUI/webui_latest.db" -o /dev/null)
if [ "$http_code" -eq 200 ]; then
return 0 # 文件存在
else
return 1 # 文件不存在
fi
}
# 从WebDAV拉取最新的webui_latest.db文件
download_latest_db() {
echo "检查云端是否存在webui_latest.db文件..."
if check_webdav_webui_latest_exists; then
echo "云端存在webui_latest.db文件,开始拉取..."
curl -o ./data/webdav/webui_latest.db \
--user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" \
"$WEBDAV_URL/OpenWebUI/webui_latest.db" && {
echo "最新的webui_latest.db文件拉取成功"
cp ./data/webdav/webui_latest.db ./data/webui.db
} || {
echo "拉取webui_latest.db文件失败"
}
else
echo "云端不存在webui_latest.db文件,跳过拉取"
fi
}
# 比较两个文件的hash值
compare_hashes() {
local file1=$1
local file2=$2
local hash1
local hash2
# 检查文件是否存在
if [ ! -f "$file1" ] || [ ! -f "$file2" ]; then
echo "文件 $file1 或 $file2 不存在,无法比较哈希值"
return 1
fi
# 计算文件的hash值
hash1=$(sha256sum "$file1" | awk '{print $1}')
hash2=$(sha256sum "$file2" | awk '{print $1}')
# 比较hash值
if [ "$hash1" == "$hash2" ]; then
return 0 # 哈希值相同
else
return 1 # 哈希值不同
fi
}
# 上传备份文件到WebDAV
upload_to_webdav() {
echo "检查是否需要上传文件到 WebDAV..."
# 如果 ./data/webui.db 文件不存在,跳过上传
if [ ! -f ./data/webui.db ]; then
echo "数据库未初始化,跳过上传"
return
fi
# 检查云端是否存在webui_latest.db文件
if check_webdav_webui_latest_exists; then
# 比较本地和云端的webui.db文件hash值
if compare_hashes ./data/webui.db ./data/webdav/webui_latest.db; then
echo "本地和云端的webui.db文件哈希值一致,跳过上传"
return
fi
echo "本地和云端的webui.db文件哈希值不同,准备上传..."
else
echo "云端不存在webui_latest.db文件,直接上传文件"
fi
# 上传最新的webui_latest.db到 WebDAV
cp ./data/webui.db ./data/webdav/webui_latest.db
curl -T ./data/webdav/webui_latest.db --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/OpenWebUI/webui_latest.db" && {
echo "最新的webui_latest.db上传成功"
} || {
echo "上传webui_latest.db失败"
}
# 上传以日期命名的备份文件
FILENAME="webui_$(date +'%m_%d').db"
curl -T ./data/webdav/webui_latest.db --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/OpenWebUI/$FILENAME" && {
echo "备份文件 $FILENAME 上传成功"
} || {
echo "上传备份文件 $FILENAME 失败"
}
# 获取当前 WebDAV 目录中的所有备份文件,按时间排序
echo "检查云端备份文件..."
backup_files=$(curl -s --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/OpenWebUI/" | grep -o 'webui_.*\.db' | grep -v 'webui_latest.db' | sort)
# 如果备份文件超过 5 个,则删除最旧的一个
backup_count=$(echo "$backup_files" | wc -l)
if [ "$backup_count" -gt 5 ]; then
oldest_file=$(echo "$backup_files" | head -n 1)
echo "云端备份文件超过5个,删除最旧的备份文件: $oldest_file"
curl -X DELETE --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/OpenWebUI/$oldest_file" && {
echo "删除最旧备份文件成功"
} || {
echo "删除最旧备份文件失败"
}
fi
}
# 定义同步函数
sync_data() {
while true; do
echo "正在开始同步"
# 上传文件到WebDAV
upload_to_webdav
# 等待时间间隔
SYNC_INTERVAL=${SYNC_INTERVAL:-7200}
echo "当前时间 $(date '+%Y-%m-%d %H:%M:%S')"
echo "等待 ${SYNC_INTERVAL} 秒后进行下一次同步..."
sleep $SYNC_INTERVAL
done
}
# 初始拉取最新的webui_latest.db文件
download_latest_db
# 后台启动同步进程
sync_data &
|