|
#!/bin/bash |
|
|
|
|
|
|
|
set -e |
|
|
|
|
|
|
|
|
|
|
|
|
|
WEBDAV_BASE_PATH="openwebui" |
|
LOCAL_DATA_DIR="./data" |
|
DB_FILENAME="webui.db" |
|
WEBDAV_SYNC_INTERVAL=${WEBDAV_SYNC_INTERVAL:-7200} |
|
HF_SYNC_INTERVAL=${HF_SYNC_INTERVAL:-7200} |
|
WEBDAV_CLEANUP_DAYS=7 |
|
HF_MAX_BACKUPS=50 |
|
|
|
|
|
if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then |
|
echo "错误:缺少必要的WebDAV环境变量 (WEBDAV_URL, WEBDAV_USERNAME, WEBDAV_PASSWORD)。" |
|
exit 1 |
|
fi |
|
if [ -z "$HF_TOKEN" ] || [ -z "$DATASET_ID" ]; then |
|
echo "错误:缺少必要的Hugging Face环境变量 (HF_TOKEN, DATASET_ID)。" |
|
exit 1 |
|
fi |
|
|
|
|
|
WEBDAV_URL=$(echo "$WEBDAV_URL" | sed 's:/*$::') |
|
WEBDAV_FULL_PATH="$WEBDAV_URL/$WEBDAV_BASE_PATH" |
|
|
|
|
|
|
|
get_file_hash() { |
|
local file_path="$1" |
|
if [ -f "$file_path" ]; then |
|
md5sum "$file_path" | awk '{print $1}' |
|
else |
|
echo "not_found" |
|
fi |
|
} |
|
|
|
|
|
echo "[恢复] 开始初始化数据恢复流程..." |
|
mkdir -p "$LOCAL_DATA_DIR" |
|
LOCAL_DB_PATH="$LOCAL_DATA_DIR/$DB_FILENAME" |
|
recovered=false |
|
|
|
|
|
echo "[恢复] 尝试从 WebDAV 恢复 ($WEBDAV_FULL_PATH)..." |
|
|
|
|
|
webdav_list_output=$(curl -s -f --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -X PROPFIND -H "Depth: 1" "$WEBDAV_FULL_PATH/" || echo "WebDAV PROPFIND failed") |
|
|
|
if [[ "$webdav_list_output" != "WebDAV PROPFIND failed" ]]; then |
|
|
|
webdav_files=$(echo "$webdav_list_output" | grep '<d:href>' | sed 's#<d:href>[^<]*/$[^<]*$</d:href>#\1#' | grep -E '^webui_[0-9]{8}\.db$') |
|
if [ -n "$webdav_files" ]; then |
|
latest_webdav_file=$(echo "$webdav_files" | sort -r | head -n 1) |
|
echo "[恢复] 在WebDAV找到最新的日期文件: $latest_webdav_file" |
|
download_url="$WEBDAV_FULL_PATH/$latest_webdav_file" |
|
temp_db_path="${LOCAL_DB_PATH}.webdav.tmp" |
|
echo "[恢复] 尝试下载: $download_url" |
|
if curl -L -f -s -o "$temp_db_path" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$download_url"; then |
|
|
|
if [ -s "$temp_db_path" ]; then |
|
mv "$temp_db_path" "$LOCAL_DB_PATH" |
|
echo "[恢复] 成功从 WebDAV ($latest_webdav_file) 恢复数据库。" |
|
recovered=true |
|
else |
|
echo "[恢复] WebDAV下载的文件为空或无效,删除临时文件。" |
|
rm -f "$temp_db_path" |
|
fi |
|
else |
|
echo "[恢复] 从 WebDAV 下载 $latest_webdav_file 失败。" |
|
rm -f "$temp_db_path" |
|
fi |
|
else |
|
echo "[恢复] 在WebDAV路径 ($WEBDAV_FULL_PATH/) 未找到符合 'webui_YYYYMMDD.db' 格式的文件。" |
|
|
|
main_db_url="$WEBDAV_FULL_PATH/$DB_FILENAME" |
|
echo "[恢复] 尝试从WebDAV恢复主文件: $main_db_url" |
|
temp_db_path="${LOCAL_DB_PATH}.webdav_main.tmp" |
|
if curl -L -f -s -o "$temp_db_path" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$main_db_url"; then |
|
if [ -s "$temp_db_path" ]; then |
|
mv "$temp_db_path" "$LOCAL_DB_PATH" |
|
echo "[恢复] 成功从 WebDAV (主文件 $DB_FILENAME) 恢复数据库。" |
|
recovered=true |
|
else |
|
echo "[恢复] WebDAV下载的主文件为空或无效,删除临时文件。" |
|
rm -f "$temp_db_path" |
|
fi |
|
else |
|
echo "[恢复] 从WebDAV下载主文件 $DB_FILENAME 失败。" |
|
rm -f "$temp_db_path" |
|
fi |
|
fi |
|
else |
|
echo "[恢复] 无法访问WebDAV目录 ($WEBDAV_FULL_PATH/)。" |
|
fi |
|
|
|
|
|
if [ "$recovered" != true ]; then |
|
echo "[恢复] WebDAV恢复失败或未找到文件,尝试从 Hugging Face ($DATASET_ID) 恢复..." |
|
|
|
if python3 /app/hf_sync.py download "$HF_TOKEN" "$DATASET_ID" "$LOCAL_DATA_DIR"; then |
|
echo "[恢复] 成功从 Hugging Face 恢复。" |
|
recovered=true |
|
else |
|
echo "[恢复] 从 Hugging Face 恢复也失败了。" |
|
fi |
|
fi |
|
|
|
|
|
if [ "$recovered" != true ] && [ ! -f "$LOCAL_DB_PATH" ]; then |
|
echo "[恢复] 所有恢复方式均失败,创建空的数据库文件: $LOCAL_DB_PATH" |
|
touch "$LOCAL_DB_PATH" |
|
fi |
|
|
|
echo "[恢复] 数据恢复流程结束。" |
|
|
|
|
|
|
|
|
|
webdav_sync() { |
|
echo "[WebDAV Sync] 后台任务启动,间隔: ${WEBDAV_SYNC_INTERVAL} 秒" |
|
local last_uploaded_hash="" |
|
|
|
while true; do |
|
timestamp=$(date '+%Y-%m-%d %H:%M:%S') |
|
echo "[WebDAV Sync @ $timestamp] 开始检查..." |
|
|
|
if [ -f "$LOCAL_DB_PATH" ]; then |
|
current_hash=$(get_file_hash "$LOCAL_DB_PATH") |
|
echo "[WebDAV Sync @ $timestamp] 本地文件哈希: $current_hash" |
|
|
|
if [ "$current_hash" == "$last_uploaded_hash" ]; then |
|
echo "[WebDAV Sync @ $timestamp] 文件未变化,跳过上传。" |
|
else |
|
echo "[WebDAV Sync @ $timestamp] 检测到文件变化或首次运行,准备上传到 WebDAV..." |
|
current_date=$(date +'%Y%m%d') |
|
dated_filename="webui_${current_date}.db" |
|
upload_dated_url="$WEBDAV_FULL_PATH/$dated_filename" |
|
upload_main_url="$WEBDAV_FULL_PATH/$DB_FILENAME" |
|
|
|
|
|
echo "[WebDAV Sync @ $timestamp] 上传日期文件: $upload_dated_url" |
|
if curl -L -f -T "$LOCAL_DB_PATH" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$upload_dated_url"; then |
|
echo "[WebDAV Sync @ $timestamp] 日期文件上传成功: $dated_filename" |
|
|
|
|
|
echo "[WebDAV Sync @ $timestamp] 更新主文件: $upload_main_url" |
|
if curl -L -f -T "$LOCAL_DB_PATH" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$upload_main_url"; then |
|
echo "[WebDAV Sync @ $timestamp] 主文件更新成功。" |
|
last_uploaded_hash=$current_hash |
|
else |
|
echo "[WebDAV Sync @ $timestamp] 错误:主文件更新失败!" |
|
|
|
|