lin7zhi commited on
Commit
54e4a6b
·
verified ·
1 Parent(s): 9b34f10

Update sync.sh

Browse files
Files changed (1) hide show
  1. sync.sh +53 -51
sync.sh CHANGED
@@ -3,6 +3,7 @@
3
  # ================= 配置 =================
4
  WEBDAV_URL=${WEBDAV_URL%/}
5
  WEBDAV_BACKUP_PATH=${WEBDAV_BACKUP_PATH:-""}
 
6
  WEBDAV_BACKUP_PATH=${WEBDAV_BACKUP_PATH#/}
7
  WEBDAV_BACKUP_PATH=${WEBDAV_BACKUP_PATH%/}
8
 
@@ -20,11 +21,9 @@ TEMP_DIR="/tmp/backup_temp"
20
  # =======================================
21
 
22
  log() { echo "[Backup] [$(date '+%H:%M:%S')] $1"; }
23
-
24
- # 确保临时目录存在
25
  mkdir -p "$TEMP_DIR"
26
 
27
- # 检查环境变量
28
  if [[ -z "$WEBDAV_URL" ]]; then
29
  log "未设置 WEBDAV_URL,跳过备份"
30
  exit 0
@@ -34,54 +33,57 @@ if ! command -v curl &> /dev/null; then
34
  apk add --no-cache curl || (apt-get update && apt-get install -y curl)
35
  fi
36
 
37
- # === 寻找目标文件 ===
38
- find_target_path() {
39
- # 优先找根目录 (这是 antigravity 最常见的默认位置)
40
- if [ -f "/app/$TARGET_FILENAME" ]; then
41
- echo "/app/$TARGET_FILENAME"
42
- elif [ -f "/app/data/$TARGET_FILENAME" ]; then
43
- echo "/app/data/$TARGET_FILENAME"
 
 
 
 
 
 
 
44
  else
45
- # 默认回落到根目录,方便恢复时使用
46
- echo "/app/$TARGET_FILENAME"
47
  fi
48
  }
49
 
50
- # === 功能1:恢复备份 ===
51
  restore() {
52
  log "正在从 WebDAV 恢复备份..."
53
  REMOTE_FILE="$FULL_WEBDAV_URL/$REMOTE_FILENAME"
54
  TEMP_FILE="$TEMP_DIR/restored.json"
55
 
56
- # 尝试下载
57
  HTTP_CODE=$(curl -s -o "$TEMP_FILE" -w "%{http_code}" -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$REMOTE_FILE")
58
 
59
- if [[ "$HTTP_CODE" == "200" ]]; then
60
- # 关键修复:检查文件是否真的下载下来了且不为空
61
- if [ -s "$TEMP_FILE" ]; then
62
- # 恢复到 /app/accounts.json (这是程序读取的默认位置)
63
- DEST_PATH="/app/$TARGET_FILENAME"
64
-
65
- cp "$TEMP_FILE" "$DEST_PATH"
66
-
67
- # 同时复制到 data 目录,防止不同版本路径差异
68
- mkdir -p /app/data
 
69
  cp "$TEMP_FILE" "/app/data/$TARGET_FILENAME"
70
-
71
- log "✅ 备份已恢复到: $DEST_PATH"
72
- else
73
- log "❌ 下载返回200但文件为空,跳过恢复"
74
  fi
75
  else
76
- log "📭 未找到远程备份 (HTTP $HTTP_CODE),将使用新配置启动"
77
  fi
78
  }
79
 
80
- # === 功能2:循环备份 ===
81
  loop() {
82
- log "启动增量备份服务 (间隔: ${SYNC_INTERVAL}秒)"
83
 
84
- # 如果设置了子目录,尝试创建
85
  if [ -n "$WEBDAV_BACKUP_PATH" ]; then
86
  curl -s -o /dev/null -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -X MKCOL "$FULL_WEBDAV_URL/"
87
  fi
@@ -89,35 +91,35 @@ loop() {
89
  while true; do
90
  sleep $SYNC_INTERVAL
91
 
92
- # 动态查找文件
93
- CURRENT_PATH=$(find /app -name "$TARGET_FILENAME" -type f -not -path "*/node_modules/*" | head -n 1)
94
 
95
- if [ -n "$CURRENT_PATH" ]; then
96
  FILE_SIZE=$(wc -c < "$CURRENT_PATH")
97
- # 只有文件大于 5 字节才备份 (避免备份空的 [])
98
- if [ "$FILE_SIZE" -gt 5 ]; then
99
- log "正在备份: $CURRENT_PATH ($FILE_SIZE bytes)"
 
 
100
  HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -T "$CURRENT_PATH" "$FULL_WEBDAV_URL/$REMOTE_FILENAME")
101
 
102
  if [[ "$HTTP_CODE" != "201" ]] && [[ "$HTTP_CODE" != "204" ]] && [[ "$HTTP_CODE" != "200" ]]; then
103
- log "备份上传失败: HTTP $HTTP_CODE"
 
 
 
104
  fi
 
 
105
  fi
 
 
106
  fi
107
  done
108
  }
109
 
110
- # === 入口判断 ===
111
  case "$1" in
112
- "restore")
113
- restore
114
- ;;
115
- "loop")
116
- loop
117
- ;;
118
- *)
119
- # 如果没有参数,默认先恢复再循环 (兼容旧用法,但不推荐,因为会阻塞)
120
- restore
121
- loop
122
- ;;
123
  esac
 
3
  # ================= 配置 =================
4
  WEBDAV_URL=${WEBDAV_URL%/}
5
  WEBDAV_BACKUP_PATH=${WEBDAV_BACKUP_PATH:-""}
6
+ # 处理子路径
7
  WEBDAV_BACKUP_PATH=${WEBDAV_BACKUP_PATH#/}
8
  WEBDAV_BACKUP_PATH=${WEBDAV_BACKUP_PATH%/}
9
 
 
21
  # =======================================
22
 
23
  log() { echo "[Backup] [$(date '+%H:%M:%S')] $1"; }
 
 
24
  mkdir -p "$TEMP_DIR"
25
 
26
+ # 检查环境
27
  if [[ -z "$WEBDAV_URL" ]]; then
28
  log "未设置 WEBDAV_URL,跳过备份"
29
  exit 0
 
33
  apk add --no-cache curl || (apt-get update && apt-get install -y curl)
34
  fi
35
 
36
+ # === 核心修复:智能寻找真正活跃的文件 ===
37
+ find_active_file() {
38
+ FILE_ROOT="/app/$TARGET_FILENAME"
39
+ FILE_DATA="/app/data/$TARGET_FILENAME"
40
+
41
+ # 获取文件修改时间戳 (如果文件不存在则为0)
42
+ TIME_ROOT=$(stat -c %Y "$FILE_ROOT" 2>/dev/null || echo 0)
43
+ TIME_DATA=$(stat -c %Y "$FILE_DATA" 2>/dev/null || echo 0)
44
+
45
+ # 比较哪个文件更新
46
+ if [ "$TIME_ROOT" -gt "$TIME_DATA" ]; then
47
+ echo "$FILE_ROOT"
48
+ elif [ "$TIME_DATA" -gt 0 ]; then
49
+ echo "$FILE_DATA"
50
  else
51
+ # 如果都没有,尝试用 find 找 (兼容性兜底)
52
+ find /app -name "$TARGET_FILENAME" -type f -not -path "*/node_modules/*" | head -n 1
53
  fi
54
  }
55
 
56
+ # === 恢复功能 ===
57
  restore() {
58
  log "正在从 WebDAV 恢复备份..."
59
  REMOTE_FILE="$FULL_WEBDAV_URL/$REMOTE_FILENAME"
60
  TEMP_FILE="$TEMP_DIR/restored.json"
61
 
 
62
  HTTP_CODE=$(curl -s -o "$TEMP_FILE" -w "%{http_code}" -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$REMOTE_FILE")
63
 
64
+ if [[ "$HTTP_CODE" == "200" ]] && [ -s "$TEMP_FILE" ]; then
65
+ # 恢复策略:只恢复到 /app 根目录
66
+ # 为什么?因为我们确定程序会优先读取根目录,或者在根目录生成
67
+ # 如果程序之前在 data 目录,它找不到 data 里的文件通常会自动回落或重建
68
+
69
+ DEST_PATH="/app/$TARGET_FILENAME"
70
+ cp "$TEMP_FILE" "$DEST_PATH"
71
+ log "✅ 备份已恢复到: $DEST_PATH"
72
+
73
+ # 只有当 data 目录已经存在时,才顺便放一份进去,但不强求
74
+ if [ -d "/app/data" ]; then
75
  cp "$TEMP_FILE" "/app/data/$TARGET_FILENAME"
 
 
 
 
76
  fi
77
  else
78
+ log "📭 未找到远程备份或文件为空,将以新状态启动"
79
  fi
80
  }
81
 
82
+ # === 循环备份功能 ===
83
  loop() {
84
+ log "启动智能增量备份 (间隔: ${SYNC_INTERVAL}秒)"
85
 
86
+ # 尝试创建远程目录
87
  if [ -n "$WEBDAV_BACKUP_PATH" ]; then
88
  curl -s -o /dev/null -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -X MKCOL "$FULL_WEBDAV_URL/"
89
  fi
 
91
  while true; do
92
  sleep $SYNC_INTERVAL
93
 
94
+ # 每次都重新判断哪个文件是最新的
95
+ CURRENT_PATH=$(find_active_file)
96
 
97
+ if [ -n "$CURRENT_PATH" ] && [ -f "$CURRENT_PATH" ]; then
98
  FILE_SIZE=$(wc -c < "$CURRENT_PATH")
99
+
100
+ # 只有大于 10 字节才备份 (避免备份空的 [])
101
+ if [ "$FILE_SIZE" -gt 10 ]; then
102
+ # log "正在备份活跃文件: $CURRENT_PATH (大小: $FILE_SIZE)"
103
+
104
  HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -T "$CURRENT_PATH" "$FULL_WEBDAV_URL/$REMOTE_FILENAME")
105
 
106
  if [[ "$HTTP_CODE" != "201" ]] && [[ "$HTTP_CODE" != "204" ]] && [[ "$HTTP_CODE" != "200" ]]; then
107
+ log " 上传失败: HTTP $HTTP_CODE"
108
+ else
109
+ # 成功时不刷屏,静默成功
110
+ :
111
  fi
112
+ else
113
+ log "⚠️ 文件过小 ($FILE_SIZE bytes),跳过备份以免覆盖数据"
114
  fi
115
+ else
116
+ log "等待 accounts.json 生成..."
117
  fi
118
  done
119
  }
120
 
 
121
  case "$1" in
122
+ "restore") restore ;;
123
+ "loop") loop ;;
124
+ *) restore; loop ;;
 
 
 
 
 
 
 
 
125
  esac