AiChat / sync_data.sh
leafmoes's picture
init aichat
f883aff
raw
history blame
4.77 kB
#!/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 &