lin7zhi commited on
Commit
9af1039
·
verified ·
1 Parent(s): c773dd4

Update sync.sh

Browse files
Files changed (1) hide show
  1. sync.sh +90 -75
sync.sh CHANGED
@@ -1,108 +1,123 @@
1
  #!/bin/bash
2
 
3
- # === 配置 ===
4
  WEBDAV_URL=${WEBDAV_URL%/}
5
- FULL_WEBDAV_URL="${WEBDAV_URL}"
6
- TEMP_DIR="/tmp/backup_temp"
7
- # 我们要备份的目标文件名
 
 
 
 
 
 
 
 
8
  TARGET_FILENAME="accounts.json"
9
- # 远程保存的名字
10
  REMOTE_FILENAME="antigravity_accounts.json"
 
 
 
11
 
12
- # 日志函数
13
  log() { echo "[Backup] [$(date '+%H:%M:%S')] $1"; }
14
 
15
- # === 核心函数:寻找文件位置 ===
16
- find_target_path() {
17
- # 1. 先猜它在 data 目录下 (最常见的情况)
18
- if [ -f "/app/data/$TARGET_FILENAME" ]; then
19
- FOUND_PATH="/app/data/$TARGET_FILENAME"
20
- # 2. 再猜它在根目录下
21
- elif [ -f "/app/$TARGET_FILENAME" ]; then
22
- FOUND_PATH="/app/$TARGET_FILENAME"
23
- # 3. 实在找不到,用 find 命令全盘搜 (排除 node_modules)
24
- else
25
- FOUND_PATH=$(find /app -name "$TARGET_FILENAME" -type f -not -path "*/node_modules/*" | head -n 1)
26
- fi
27
-
28
- echo "$FOUND_PATH"
29
- }
30
 
31
- # === 检查环境变量 ===
32
  if [[ -z "$WEBDAV_URL" ]]; then
33
- log "未设置 WEBDAV_URL,跳过备份功能"
34
  exit 0
35
  fi
36
 
37
- # 安装 curl
38
  if ! command -v curl &> /dev/null; then
39
- apk add --no-cache curl || apt-get update && apt-get install -y curl
40
  fi
41
 
42
- # === 1. 恢复备份 ===
43
- download_backup() {
44
- log "正在检查远程备份..."
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  REMOTE_FILE="$FULL_WEBDAV_URL/$REMOTE_FILENAME"
 
46
 
47
- # 默认恢复路径 (如果还没生成,我们先恢复到 data 目录,因为 Dockerfile 里创建了这个目录)
48
- RESTORE_DIR="/app/data"
49
- mkdir -p "$RESTORE_DIR"
50
- RESTORE_PATH="$RESTORE_DIR/$TARGET_FILENAME"
51
-
52
- HTTP_CODE=$(curl -s -o "$TEMP_DIR/restored.json" -w "%{http_code}" -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$REMOTE_FILE")
53
 
54
  if [[ "$HTTP_CODE" == "200" ]]; then
55
- log "发现远程备份,正在恢复到 $RESTORE_PATH"
56
- mv "$TEMP_DIR/restored.json" "$RESTORE_PATH"
57
-
58
- # 为了保险,也在根目录放一份
59
- cp "$RESTORE_PATH" "/app/$TARGET_FILENAME"
 
 
 
 
 
 
 
 
 
 
60
  else
61
- log "未找到远程备份 (HTTP $HTTP_CODE),跳过恢复"
62
  fi
63
  }
64
 
65
- # === 2. 循环备份 ===
66
- loop_sync() {
67
- mkdir -p $TEMP_DIR
 
 
 
 
 
68
 
69
  while true; do
70
- # 每 30 秒检查一次,反应快一点
71
- sleep 30
72
 
73
- # 动态寻找文件位置
74
- CURRENT_FILE_PATH=$(find_target_path)
75
 
76
- if [ -n "$CURRENT_FILE_PATH" ]; then
77
- # 检查文件大小,忽略空文件
78
- FILE_SIZE=$(wc -c < "$CURRENT_FILE_PATH")
79
- if [ "$FILE_SIZE" -lt 5 ]; then
80
- # log "文件存在但为空,跳过..."
81
- continue
 
 
 
 
82
  fi
83
-
84
- log "找到文件: $CURRENT_FILE_PATH (大小: $FILE_SIZE)"
85
-
86
- # 开始上传
87
- REMOTE_FILE="$FULL_WEBDAV_URL/$REMOTE_FILENAME"
88
- HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -T "$CURRENT_FILE_PATH" "$REMOTE_FILE")
89
-
90
- if [[ "$HTTP_CODE" == "201" ]] || [[ "$HTTP_CODE" == "204" ]] || [[ "$HTTP_CODE" == "200" ]]; then
91
- log "备份成功!"
92
- else
93
- log "备份失败 (HTTP $HTTP_CODE)"
94
- fi
95
-
96
- else
97
- log "⚠️ 找不到 $TARGET_FILENAME"
98
- log "--- 调试信息:当前 /app 目录下的文件结构 ---"
99
- # 列出所有 JSON 文件,帮你看看到底生成在哪了
100
- find /app -maxdepth 3 -name "*.json" -not -path "*/node_modules/*"
101
- log "----------------------------------------"
102
  fi
103
  done
104
  }
105
 
106
- # === 主流程 ===
107
- download_backup
108
- loop_sync
 
 
 
 
 
 
 
 
 
 
 
 
1
  #!/bin/bash
2
 
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
+
9
+ if [ -n "$WEBDAV_BACKUP_PATH" ]; then
10
+ FULL_WEBDAV_URL="${WEBDAV_URL}/${WEBDAV_BACKUP_PATH}"
11
+ else
12
+ FULL_WEBDAV_URL="${WEBDAV_URL}"
13
+ fi
14
+
15
+ SYNC_INTERVAL=${SYNC_INTERVAL:-60}
16
  TARGET_FILENAME="accounts.json"
 
17
  REMOTE_FILENAME="antigravity_accounts.json"
18
+ TEMP_DIR="/tmp/backup_temp"
19
+
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
31
  fi
32
 
 
33
  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
88
 
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