|
#!/bin/bash |
|
|
|
|
|
if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then |
|
echo "缺少必要的WebDAV环境变量: WEBDAV_URL, WEBDAV_USERNAME 或 WEBDAV_PASSWORD" |
|
exit 1 |
|
fi |
|
|
|
|
|
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 |
|
} |
|
|
|
|
|
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 |
|
} |
|
|
|
|
|
compare_hashes() { |
|
local file1=$1 |
|
local file2=$2 |
|
local hash1 |
|
local hash2 |
|
|
|
|
|
if [ ! -f "$file1" ] || [ ! -f "$file2" ]; then |
|
echo "文件 $file1 或 $file2 不存在,无法比较哈希值" |
|
return 1 |
|
fi |
|
|
|
|
|
hash1=$(sha256sum "$file1" | awk '{print $1}') |
|
hash2=$(sha256sum "$file2" | awk '{print $1}') |
|
|
|
|
|
if [ "$hash1" == "$hash2" ]; then |
|
return 0 |
|
else |
|
return 1 |
|
fi |
|
} |
|
|
|
|
|
upload_to_webdav() { |
|
echo "检查是否需要上传文件到 WebDAV..." |
|
|
|
|
|
if [ ! -f ./data/webui.db ]; then |
|
echo "数据库未初始化,跳过上传" |
|
return |
|
fi |
|
|
|
|
|
if check_webdav_webui_latest_exists; then |
|
|
|
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 |
|
|
|
|
|
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 失败" |
|
} |
|
|
|
|
|
echo "检查云端备份文件..." |
|
backup_files=$(curl -s --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/OpenWebUI/" | grep -o 'webui_.*\.db' | grep -v 'webui_latest.db' | sort) |
|
|
|
|
|
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 "正在开始同步" |
|
|
|
|
|
upload_to_webdav |
|
|
|
|
|
SYNC_INTERVAL=${SYNC_INTERVAL:-7200} |
|
echo "当前时间 $(date '+%Y-%m-%d %H:%M:%S')" |
|
echo "等待 ${SYNC_INTERVAL} 秒后进行下一次同步..." |
|
sleep $SYNC_INTERVAL |
|
done |
|
} |
|
|
|
|
|
download_latest_db |
|
|
|
|
|
sync_data & |
|
|