aBER0724 commited on
Commit
ff8769e
·
verified ·
1 Parent(s): 6a97fb5

Update sync_data.sh

Browse files
Files changed (1) hide show
  1. sync_data.sh +98 -84
sync_data.sh CHANGED
@@ -142,10 +142,10 @@ if [ "$RESTORE_SOURCE" = "webdav" ]; then
142
  # 仅从 WebDAV 恢复
143
  restore_from_webdav
144
  elif [ "$RESTORE_SOURCE" = "github" ] || [ "$RESTORE_SOURCE" = "auto" ]; then
145
- # 从 GitHub 恢复(仅 config 目录)
146
  GITHUB_RESTORED=0
147
 
148
- echo "从 GitHub 恢复配置(仅 config 目录)..."
149
 
150
  # 检查并恢复 config 目录
151
  if [ -d "$GITHUB_DATA_DIR/config" ] && [ "$(ls -A $GITHUB_DATA_DIR/config 2>/dev/null)" ]; then
@@ -158,21 +158,25 @@ elif [ "$RESTORE_SOURCE" = "github" ] || [ "$RESTORE_SOURCE" = "auto" ]; then
158
  echo "GitHub 仓库中没有 config 目录或目录为空"
159
  fi
160
 
161
- echo "注意:GitHub 不包含 tools 目录(仅在 WebDAV 备份中)"
 
 
 
 
 
 
 
 
 
162
 
163
- # 如果是 auto 模式,GitHub 恢复 config 后,还需要从 WebDAV 恢复 tools
164
- if [ "$RESTORE_SOURCE" = "auto" ]; then
165
- echo "尝试从 WebDAV 恢复 tools 目录..."
166
- # 临时修改为只恢复 tools WebDAV 逻辑
167
- if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
168
- echo "WebDAV 环境变量缺失,无法恢复 tools 目录"
169
- else
170
- restore_from_webdav || echo "WebDAV 恢复 tools 失败,将在同步时重新备份"
171
- fi
172
  elif [ "$GITHUB_RESTORED" = "1" ]; then
173
- echo "从 GitHub 恢复 config 目录完成"
174
  else
175
- echo "GitHub 中没有可恢复的 config 目录"
176
  fi
177
  fi
178
 
@@ -196,12 +200,13 @@ sync_data() {
196
  git checkout main || git checkout master
197
 
198
  # 复制最新的配置文件
199
- echo "检查配置文件变化(GitHub 仅备份 config 目录)..."
200
 
201
  # 创建仓库中的目录
202
  mkdir -p ./config
 
203
 
204
- # 只同步 config 目录到 GitHub(体积小,适合版本控制)
205
  if [ -d "/mcp-proxy-server/config" ]; then
206
  # 检查是否有非工作目录的文件
207
  CONFIG_FILES=$(ls -A /mcp-proxy-server/config 2>/dev/null | grep -v -E '(github_data|temp_backup|webdav_restore)' || true)
@@ -227,7 +232,71 @@ sync_data() {
227
  fi
228
  fi
229
 
230
- echo "注意:tools 目录不同步到 GitHub(体积大,仅在 WebDAV 备份)"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
231
 
232
  # 检查是否有变化
233
  CONFIG_CHANGED=0
@@ -235,7 +304,6 @@ sync_data() {
235
 
236
  # 检查 config 目录变化(用于 GitHub 备份)
237
  if [[ -n $(git status -s) ]]; then
238
- echo "检测到 config 目录变化"
239
  CONFIG_CHANGED=1
240
  fi
241
 
@@ -248,11 +316,9 @@ sync_data() {
248
  if [ -f "$TOOLS_LAST_CHECK_FILE" ]; then
249
  LAST_TOOLS_TIME=$(cat "$TOOLS_LAST_CHECK_FILE" 2>/dev/null || echo "0")
250
  if [ "$CURRENT_TOOLS_TIME" != "$LAST_TOOLS_TIME" ]; then
251
- echo "检测到 tools 目录变化"
252
  TOOLS_CHANGED=1
253
  fi
254
  else
255
- echo "首次检查 tools 目录"
256
  TOOLS_CHANGED=1
257
  fi
258
 
@@ -263,64 +329,41 @@ sync_data() {
263
  # 根据变化情况执行备份
264
  if [ "$CONFIG_CHANGED" = "1" ] || [ "$TOOLS_CHANGED" = "1" ]; then
265
  echo "检测到文件变化,开始备份..."
266
- echo " - Config 变化: $([ "$CONFIG_CHANGED" = "1" ] && echo "是" || echo "否")"
267
- echo " - Tools 变化: $([ "$TOOLS_CHANGED" = "1" ] && echo "是" || echo "否")"
268
 
269
  # GitHub 备份(仅当 config 有变化时)
270
  if [ "$CONFIG_CHANGED" = "1" ]; then
271
- echo "执行 GitHub 备份(config 目录)..."
272
- # 添加所有变更
273
- git add config/
274
-
275
- # 提交变更
276
- git commit -m "Auto sync config $(date '+%Y-%m-%d %H:%M:%S')"
277
-
278
- # 推送到远程仓库
279
- git push origin HEAD && {
280
- echo "GitHub推送成功"
281
- }|| {
282
- echo "推送失败,等待重试..."
283
- sleep 10
284
- git push origin HEAD || {
285
- echo "重试失败,放弃推送到Github。"
286
- }
287
- }
288
- else
289
- echo "跳过 GitHub 备份(config 无变化)"
290
  fi
291
 
292
  # WebDAV 备份(当 config 或 tools 有变化时)
293
  if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
294
- echo "WebDAV 环境变量缺失,跳过 WebDAV 同步。"
295
  else
296
- echo "执行 WebDAV 备份(config tools 目录)..."
297
  # 使用时间戳(年月日时分),每次同步都创建新备份
298
  FILENAME="mcp_backup_$(date +'%Y%m%d_%H%M').tar.gz"
299
 
300
  # 创建临时备份压缩包(使用独立目录)
301
  TEMP_DIR="$WORK_DIR/temp_backup"
302
- rm -rf "$TEMP_DIR" # 清理之前的临时目录
303
  mkdir -p "$TEMP_DIR"
304
 
305
  # 复制要备份的目录到临时目录(WebDAV 备份包含 config 和 tools)
306
  BACKUP_CREATED=0
307
 
308
  if [ -d "/mcp-proxy-server/config" ]; then
309
- echo "检查 config 目录用于备份..."
310
- # 检查是否有非工作目录的文件
311
  CONFIG_FILES=$(ls -A /mcp-proxy-server/config 2>/dev/null | grep -v -E '(github_data|temp_backup|webdav_restore)' || true)
312
 
313
  if [ -n "$CONFIG_FILES" ]; then
314
- echo "备份 config 目录..."
315
  mkdir -p "$TEMP_DIR/config"
316
-
317
- # 使用 cp 逐个复制,排除工作目录
318
  for item in /mcp-proxy-server/config/*; do
319
  if [ -e "$item" ]; then
320
  BASENAME=$(basename "$item")
321
  case "$BASENAME" in
322
  github_data|temp_backup|webdav_restore)
323
- echo "跳过工作目录: $BASENAME"
324
  ;;
325
  *)
326
  if [ -d "$item" ]; then
@@ -332,37 +375,24 @@ sync_data() {
332
  esac
333
  fi
334
  done
335
- else
336
- echo "config 目录为空或只有工作目录,跳过备份"
337
  fi
338
  fi
339
 
340
  if [ -d "/tools" ] && [ "$(ls -A /tools 2>/dev/null)" ]; then
341
- echo "备份 tools 目录..."
342
  mkdir -p "$TEMP_DIR/tools"
343
-
344
- # 逐个处理 tools 目录下的项目
345
  for item in /tools/*; do
346
  if [ -e "$item" ]; then
347
  BASENAME=$(basename "$item")
348
- echo "备份 tools 项目: $BASENAME"
349
-
350
  if [ -d "$item" ]; then
351
- # 创建目标目录
352
  mkdir -p "$TEMP_DIR/tools/$BASENAME"
353
-
354
- # 复制目录内容,包括隐藏文件
355
  if [ "$(ls -A "$item" 2>/dev/null)" ]; then
356
  cp -r "$item"/* "$TEMP_DIR/tools/$BASENAME/" 2>/dev/null && BACKUP_CREATED=1
357
- # 也复制隐藏文件
358
  cp -r "$item"/.[!.]* "$TEMP_DIR/tools/$BASENAME/" 2>/dev/null || true
359
  else
360
- # 空目录也创建 .gitkeep
361
  touch "$TEMP_DIR/tools/$BASENAME/.gitkeep"
362
  BACKUP_CREATED=1
363
  fi
364
  else
365
- # 直接复制文件
366
  cp "$item" "$TEMP_DIR/tools/" 2>/dev/null && BACKUP_CREATED=1
367
  fi
368
  fi
@@ -375,34 +405,19 @@ sync_data() {
375
  tar -czf "../$FILENAME" .
376
  cd - > /dev/null
377
 
378
- echo "上传备份文件: $FILENAME (按 ${SYNC_INTERVAL:-7200} 秒间隔)"
379
- # 使用 curl 进行文件上传
380
- curl -T "$WORK_DIR/$FILENAME" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$FILENAME" && {
381
- echo "WebDAV 上传成功: $FILENAME"
382
- } || {
383
- echo "WebDAV 上传失败,等待重试..."
384
- sleep 10
385
- curl -T "$WORK_DIR/$FILENAME" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$FILENAME" || {
386
- echo "重试失败,放弃webdav上传。"
387
- }
388
- }
389
-
390
- # 清理临时文件
391
  rm -f "$WORK_DIR/$FILENAME"
392
  else
393
- echo "没有找到要备份的文件,跳过 WebDAV 同步"
394
  fi
395
 
396
- # 清理临时目录
397
  rm -rf "$TEMP_DIR"
398
  fi
399
 
400
- echo "本次备份操作完成"
401
 
402
  else
403
- echo "没有检测到文件变化,跳过备份操作"
404
- echo " - Config 变化: 否"
405
- echo " - Tools 变化: 否"
406
  fi
407
 
408
  # 返回上级目录
@@ -410,8 +425,7 @@ sync_data() {
410
 
411
  # 3. 等待统一的时间间隔
412
  SYNC_INTERVAL=${SYNC_INTERVAL:-7200} # 默认间隔时间为 7200 秒
413
- echo "当前时间 $(date '+%Y-%m-%d %H:%M:%S')"
414
- echo "等待 ${SYNC_INTERVAL} 秒后进行下一次同步..."
415
  sleep $SYNC_INTERVAL
416
 
417
  done
 
142
  # 仅从 WebDAV 恢复
143
  restore_from_webdav
144
  elif [ "$RESTORE_SOURCE" = "github" ] || [ "$RESTORE_SOURCE" = "auto" ]; then
145
+ # 从 GitHub 恢复(config 和 tools 目录)
146
  GITHUB_RESTORED=0
147
 
148
+ echo "从 GitHub 恢复配置(config 和 tools 目录)..."
149
 
150
  # 检查并恢复 config 目录
151
  if [ -d "$GITHUB_DATA_DIR/config" ] && [ "$(ls -A $GITHUB_DATA_DIR/config 2>/dev/null)" ]; then
 
158
  echo "GitHub 仓库中没有 config 目录或目录为空"
159
  fi
160
 
161
+ # 检查并恢复 tools 目录
162
+ if [ -d "$GITHUB_DATA_DIR/tools" ] && [ "$(ls -A $GITHUB_DATA_DIR/tools 2>/dev/null)" ]; then
163
+ echo "从 GitHub 恢复 tools 目录..."
164
+ mkdir -p /tools
165
+ cp -r "$GITHUB_DATA_DIR/tools"/* /tools/
166
+ echo "GitHub: tools 目录恢复成功"
167
+ GITHUB_RESTORED=1
168
+ else
169
+ echo "GitHub 仓库中没有 tools 目录或目录为空"
170
+ fi
171
 
172
+ # 如果是 auto 模式,GitHub 恢复后,还可以从 WebDAV 补充恢复
173
+ if [ "$RESTORE_SOURCE" = "auto" ] && [ "$GITHUB_RESTORED" = "0" ]; then
174
+ echo "GitHub 中没有找到任何配置,尝试从 WebDAV 恢复..."
175
+ restore_from_webdav || echo "WebDAV 恢复失败,将在同步时重新备份"
 
 
 
 
 
176
  elif [ "$GITHUB_RESTORED" = "1" ]; then
177
+ echo "从 GitHub 恢复配置完成"
178
  else
179
+ echo "GitHub 中没有可恢复的配置"
180
  fi
181
  fi
182
 
 
200
  git checkout main || git checkout master
201
 
202
  # 复制最新的配置文件
203
+ echo "检查配置文件变化(GitHub 备份 config 和 tools 目录)..."
204
 
205
  # 创建仓库中的目录
206
  mkdir -p ./config
207
+ mkdir -p ./tools
208
 
209
+ # 同步 config 目录到 GitHub
210
  if [ -d "/mcp-proxy-server/config" ]; then
211
  # 检查是否有非工作目录的文件
212
  CONFIG_FILES=$(ls -A /mcp-proxy-server/config 2>/dev/null | grep -v -E '(github_data|temp_backup|webdav_restore)' || true)
 
232
  fi
233
  fi
234
 
235
+ # 同步 tools 目录到 GitHub(处理多个MCP仓库)
236
+ if [ -d "/tools" ] && [ "$(ls -A /tools 2>/dev/null)" ]; then
237
+ # 清空目标目录
238
+ rm -rf ./tools/*
239
+
240
+ echo "处理 tools 目录中的 MCP 工具..."
241
+
242
+ PROCESSED_COUNT=0
243
+
244
+ # 逐个处理 tools 目录下的MCP工具
245
+ for item in /tools/*; do
246
+ if [ -e "$item" ]; then
247
+ BASENAME=$(basename "$item")
248
+
249
+ if [ -d "$item" ]; then
250
+ echo " 处理 MCP 工具: $BASENAME"
251
+
252
+ # 检查是否是Git仓库
253
+ if [ -d "$item/.git" ]; then
254
+ echo " → 检测到Git仓库,排除.git目录"
255
+ fi
256
+
257
+ # 创建目标目录
258
+ mkdir -p "./tools/$BASENAME"
259
+
260
+ # 复制目录内容
261
+ if [ "$(ls -A "$item" 2>/dev/null)" ]; then
262
+ # 复制所有普通文件和目录(排除.git)
263
+ for subitem in "$item"/*; do
264
+ if [ -e "$subitem" ] && [ "$(basename "$subitem")" != ".git" ]; then
265
+ cp -r "$subitem" "./tools/$BASENAME/" 2>/dev/null || true
266
+ fi
267
+ done
268
+
269
+ # 复制隐藏文件,但排除 .git 目录
270
+ for hidden in "$item"/.[!.]*; do
271
+ if [ -e "$hidden" ] && [ "$(basename "$hidden")" != ".git" ]; then
272
+ cp -r "$hidden" "./tools/$BASENAME/" 2>/dev/null || true
273
+ fi
274
+ done
275
+
276
+ # 检查复制结果
277
+ COPIED_FILES=$(ls -A "./tools/$BASENAME" 2>/dev/null | wc -l)
278
+ echo " → 已复制 $COPIED_FILES 个文件/目录"
279
+ else
280
+ # 空目录创建 .gitkeep
281
+ touch "./tools/$BASENAME/.gitkeep"
282
+ echo " → 空目录,已创建 .gitkeep"
283
+ fi
284
+
285
+ PROCESSED_COUNT=$((PROCESSED_COUNT + 1))
286
+ else
287
+ # 直接复制文件
288
+ echo " 复制文件: $BASENAME"
289
+ cp "$item" "./tools/" 2>/dev/null || true
290
+ PROCESSED_COUNT=$((PROCESSED_COUNT + 1))
291
+ fi
292
+ fi
293
+ done
294
+
295
+ # 显示处理结果摘要
296
+ if [ "$PROCESSED_COUNT" -gt 0 ]; then
297
+ echo "总计处理 $PROCESSED_COUNT 个 MCP 工具"
298
+ fi
299
+ fi
300
 
301
  # 检查是否有变化
302
  CONFIG_CHANGED=0
 
304
 
305
  # 检查 config 目录变化(用于 GitHub 备份)
306
  if [[ -n $(git status -s) ]]; then
 
307
  CONFIG_CHANGED=1
308
  fi
309
 
 
316
  if [ -f "$TOOLS_LAST_CHECK_FILE" ]; then
317
  LAST_TOOLS_TIME=$(cat "$TOOLS_LAST_CHECK_FILE" 2>/dev/null || echo "0")
318
  if [ "$CURRENT_TOOLS_TIME" != "$LAST_TOOLS_TIME" ]; then
 
319
  TOOLS_CHANGED=1
320
  fi
321
  else
 
322
  TOOLS_CHANGED=1
323
  fi
324
 
 
329
  # 根据变化情况执行备份
330
  if [ "$CONFIG_CHANGED" = "1" ] || [ "$TOOLS_CHANGED" = "1" ]; then
331
  echo "检测到文件变化,开始备份..."
 
 
332
 
333
  # GitHub 备份(仅当 config 有变化时)
334
  if [ "$CONFIG_CHANGED" = "1" ]; then
335
+ echo " GitHub 备份 (config + tools)"
336
+ git add config/ tools/
337
+ git commit -m "Auto sync config and tools $(date '+%Y-%m-%d %H:%M:%S')"
338
+ git push origin HEAD >/dev/null 2>&1 && echo " ✓ 推送成功" || echo " ✗ 推送失败"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
339
  fi
340
 
341
  # WebDAV 备份(当 config 或 tools 有变化时)
342
  if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
343
+ echo " WebDAV 环境变量缺失,跳过"
344
  else
345
+ echo " WebDAV 备份 (config + tools)"
346
  # 使用时间戳(年月日时分),每次同步都创建新备份
347
  FILENAME="mcp_backup_$(date +'%Y%m%d_%H%M').tar.gz"
348
 
349
  # 创建临时备份压缩包(使用独立目录)
350
  TEMP_DIR="$WORK_DIR/temp_backup"
351
+ rm -rf "$TEMP_DIR"
352
  mkdir -p "$TEMP_DIR"
353
 
354
  # 复制要备份的目录到临时目录(WebDAV 备份包含 config 和 tools)
355
  BACKUP_CREATED=0
356
 
357
  if [ -d "/mcp-proxy-server/config" ]; then
 
 
358
  CONFIG_FILES=$(ls -A /mcp-proxy-server/config 2>/dev/null | grep -v -E '(github_data|temp_backup|webdav_restore)' || true)
359
 
360
  if [ -n "$CONFIG_FILES" ]; then
 
361
  mkdir -p "$TEMP_DIR/config"
 
 
362
  for item in /mcp-proxy-server/config/*; do
363
  if [ -e "$item" ]; then
364
  BASENAME=$(basename "$item")
365
  case "$BASENAME" in
366
  github_data|temp_backup|webdav_restore)
 
367
  ;;
368
  *)
369
  if [ -d "$item" ]; then
 
375
  esac
376
  fi
377
  done
 
 
378
  fi
379
  fi
380
 
381
  if [ -d "/tools" ] && [ "$(ls -A /tools 2>/dev/null)" ]; then
 
382
  mkdir -p "$TEMP_DIR/tools"
 
 
383
  for item in /tools/*; do
384
  if [ -e "$item" ]; then
385
  BASENAME=$(basename "$item")
 
 
386
  if [ -d "$item" ]; then
 
387
  mkdir -p "$TEMP_DIR/tools/$BASENAME"
 
 
388
  if [ "$(ls -A "$item" 2>/dev/null)" ]; then
389
  cp -r "$item"/* "$TEMP_DIR/tools/$BASENAME/" 2>/dev/null && BACKUP_CREATED=1
 
390
  cp -r "$item"/.[!.]* "$TEMP_DIR/tools/$BASENAME/" 2>/dev/null || true
391
  else
 
392
  touch "$TEMP_DIR/tools/$BASENAME/.gitkeep"
393
  BACKUP_CREATED=1
394
  fi
395
  else
 
396
  cp "$item" "$TEMP_DIR/tools/" 2>/dev/null && BACKUP_CREATED=1
397
  fi
398
  fi
 
405
  tar -czf "../$FILENAME" .
406
  cd - > /dev/null
407
 
408
+ curl -T "$WORK_DIR/$FILENAME" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$FILENAME" >/dev/null 2>&1 && echo " ✓ 上传成功" || echo " ✗ 上传失败"
 
 
 
 
 
 
 
 
 
 
 
 
409
  rm -f "$WORK_DIR/$FILENAME"
410
  else
411
+ echo " 无文件可备份"
412
  fi
413
 
 
414
  rm -rf "$TEMP_DIR"
415
  fi
416
 
417
+ echo "备份完成"
418
 
419
  else
420
+ echo "无文件变化,跳过备份"
 
 
421
  fi
422
 
423
  # 返回上级目录
 
425
 
426
  # 3. 等待统一的时间间隔
427
  SYNC_INTERVAL=${SYNC_INTERVAL:-7200} # 默认间隔时间为 7200 秒
428
+ echo "等待 ${SYNC_INTERVAL} 秒后进行下一次检查..."
 
429
  sleep $SYNC_INTERVAL
430
 
431
  done