wuran commited on
Commit
943a51c
·
verified ·
1 Parent(s): 67bfca0

Update sync_data.sh

Browse files
Files changed (1) hide show
  1. sync_data.sh +96 -214
sync_data.sh CHANGED
@@ -1,8 +1,8 @@
1
  #!/bin/bash
2
 
3
- # 检查必要的WebDAV环境变量
4
  if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
5
- echo "缺少必要的WebDAV环境变量:WEBDAV_URL, WEBDAV_USERNAME WEBDAV_PASSWORD"
6
  exit 1
7
  fi
8
 
@@ -13,51 +13,54 @@ mkdir -p "$WORK_DIR"
13
  # 从 WebDAV 恢复配置的函数
14
  restore_from_webdav() {
15
  echo "正在从 WebDAV 恢复配置文件..."
16
-
17
  # 创建临时恢复目录
18
  RESTORE_DIR="$WORK_DIR/webdav_restore"
19
  mkdir -p "$RESTORE_DIR"
20
-
21
  # 获取WebDAV上所有备份文件列表
22
  echo "获取 WebDAV 备份文件列表..."
23
-
24
- # 尝试使用PROPFIND方法获取目录列表
25
  RAW_RESPONSE=$(curl -s -X PROPFIND \
26
  --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" \
27
  -H "Depth: 1" \
28
  -H "Content-Type: text/xml" \
29
  -d '<?xml version="1.0" encoding="utf-8"?><propfind xmlns="DAV:"><prop><displayname/></prop></propfind>' \
30
  "$WEBDAV_URL/")
31
-
32
  # 如果PROPFIND失败,尝试简单的GET请求
33
  if [ -z "$RAW_RESPONSE" ] || echo "$RAW_RESPONSE" | grep -q "Method Not Allowed"; then
34
  RAW_RESPONSE=$(curl -s --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/")
35
  fi
36
-
37
  # 多种匹配方式
 
38
  BACKUP_LIST1=$(echo "$RAW_RESPONSE" | grep -oE '<D:displayname[^>]*>[^<]*mcp_backup_[0-9]+_[0-9]+\.tar\.gz[^<]*</D:displayname>' | sed 's/<[^>]*>//g')
 
39
  BACKUP_LIST2=$(echo "$RAW_RESPONSE" | grep -oE 'href="[^"]*mcp_backup_[0-9]+_[0-9]+\.tar\.gz[^"]*"' | sed 's/.*href="[^"]*\///g' | sed 's/".*//g')
 
40
  BACKUP_LIST3=$(echo "$RAW_RESPONSE" | grep -oE 'mcp_backup_[0-9]+_[0-9]+\.tar\.gz')
41
-
42
- # 合并所有结果
43
  BACKUP_LIST=$(printf "%s\n%s\n%s\n" "$BACKUP_LIST1" "$BACKUP_LIST2" "$BACKUP_LIST3" | grep -v '^$' | sort -u | sort -r)
44
-
45
  if [ -z "$BACKUP_LIST" ]; then
46
  echo "未找到任何备份文件"
47
  rm -rf "$RESTORE_DIR"
48
  return 1
49
  fi
50
-
51
  echo "找到以下备份文件:"
52
  echo "$BACKUP_LIST" | head -5 | while read file; do echo " - $file"; done
53
  if [ $(echo "$BACKUP_LIST" | wc -l) -gt 5 ]; then
54
  echo " ... 等共 $(echo "$BACKUP_LIST" | wc -l) 个文件"
55
  fi
56
-
57
  # 尝试下载最新的备份文件
58
  LATEST_BACKUP=$(echo "$BACKUP_LIST" | head -1)
59
  echo "尝试下载最新备份: $LATEST_BACKUP"
60
-
61
  if curl -f --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$LATEST_BACKUP" -o "$RESTORE_DIR/$LATEST_BACKUP" 2>/dev/null; then
62
  echo "下载备份成功: $LATEST_BACKUP"
63
 
@@ -91,218 +94,97 @@ restore_from_webdav() {
91
  }
92
  cd - > /dev/null
93
  else
94
- echo "下载最新备份失败,尝试其他备份文件..."
95
-
96
- # 尝试前3个备份文件
97
- SUCCESS=0
98
- for backup_file in $(echo "$BACKUP_LIST" | head -3 | tail -n +2); do
99
- echo "尝试下载: $backup_file"
100
- if curl -f --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$backup_file" -o "$RESTORE_DIR/$backup_file" 2>/dev/null; then
101
- echo "下载成功,开始解压..."
102
- cd "$RESTORE_DIR"
103
- if tar -xzf "$backup_file"; then
104
- echo "解压成功,恢复文件..."
105
-
106
- # 恢复配置文件
107
- if [ -d "config" ] && [ "$(ls -A config 2>/dev/null)" ]; then
108
- mkdir -p /mcp-proxy-server/config
109
- cp -r config/* /mcp-proxy-server/config/
110
- echo "config 目录恢复成功"
111
- fi
112
-
113
- if [ -d "tools" ] && [ "$(ls -A tools 2>/dev/null)" ]; then
114
- mkdir -p /tools
115
- cp -r tools/* /tools/
116
- echo "tools 目录恢复成功"
117
- fi
118
-
119
- SUCCESS=1
120
- break
121
- fi
122
- cd - > /dev/null
123
- fi
124
- done
125
-
126
- if [ "$SUCCESS" = "0" ]; then
127
- echo "无法下载任何可用的备份文件"
128
- fi
129
  fi
130
-
131
  # 清理临时目录
132
  rm -rf "$RESTORE_DIR"
133
  return 0
134
  }
135
 
136
- # 处理恢复参数
137
- if [ "$1" = "--restore-only" ] && [ "$2" = "webdav" ]; then
138
- restore_from_webdav
139
- exit 0
140
- fi
141
-
142
- # 启动时自动从WebDAV恢复
143
- restore_from_webdav || echo "WebDAV恢复失败,将在同步时重新备份"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
 
145
- # 如果是仅恢复模式,则退出
146
- if [ "$1" = "--restore-only" ]; then
147
- exit 0
148
- fi
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
 
150
- # 定义同步函数(只使用WebDAV)
151
- sync_data() {
152
- # 初始化时间戳文件
153
- CONFIG_LAST_CHECK_FILE="$WORK_DIR/config_last_check"
154
- TOOLS_LAST_CHECK_FILE="$WORK_DIR/tools_last_check"
155
- touch "$CONFIG_LAST_CHECK_FILE" "$TOOLS_LAST_CHECK_FILE"
156
 
157
- while true; do
158
- echo "正在开始同步检查"
159
-
160
- # 检查config和tools目录变化
161
- CONFIG_CHANGED=0
162
- TOOLS_CHANGED=0
163
-
164
- # 检查config目录变化
165
- if [ -d "/mcp-proxy-server/config" ] && [ "$(ls -A /mcp-proxy-server/config 2>/dev/null)" ]; then
166
- # 获取config目录的最新修改时间
167
- CURRENT_CONFIG_TIME=$(find /mcp-proxy-server/config -type f -exec stat -c %Y {} \; 2>/dev/null | sort -n | tail -1)
168
- [ -z "$CURRENT_CONFIG_TIME" ] && CURRENT_CONFIG_TIME=0
169
-
170
- # 获取上次记录的时间
171
- LAST_CONFIG_TIME=$(cat "$CONFIG_LAST_CHECK_FILE" 2>/dev/null || echo 0)
172
-
173
- if [ "$CURRENT_CONFIG_TIME" -gt "$LAST_CONFIG_TIME" ]; then
174
- CONFIG_CHANGED=1
175
- echo "检测到 config 目录变化"
176
- fi
177
- fi
178
-
179
- # 检查tools目录变化
180
- if [ -d "/tools" ] && [ "$(ls -A /tools 2>/dev/null)" ]; then
181
- # 获取tools目录的最新修改时间
182
- CURRENT_TOOLS_TIME=$(find /tools -type f -exec stat -c %Y {} \; 2>/dev/null | sort -n | tail -1)
183
- [ -z "$CURRENT_TOOLS_TIME" ] && CURRENT_TOOLS_TIME=0
184
-
185
- # 获取上次记录的时间
186
- LAST_TOOLS_TIME=$(cat "$TOOLS_LAST_CHECK_FILE" 2>/dev/null || echo 0)
187
-
188
- if [ "$CURRENT_TOOLS_TIME" -gt "$LAST_TOOLS_TIME" ]; then
189
- TOOLS_CHANGED=1
190
- echo "检测到 tools 目录变化"
191
- fi
192
- fi
193
-
194
- # 如果有变化,执行WebDAV备份
195
- if [ "$CONFIG_CHANGED" = "1" ] || [ "$TOOLS_CHANGED" = "1" ]; then
196
- echo "检测到文件变化,开始WebDAV备份..."
197
-
198
- # 使用时间戳创建备份文件名
199
- FILENAME="mcp_backup_$(date +'%Y%m%d_%H%M').tar.gz"
200
-
201
- # 创建临时备份压缩包
202
- TEMP_DIR="$WORK_DIR/temp_backup"
203
- rm -rf "$TEMP_DIR"
204
- mkdir -p "$TEMP_DIR"
205
-
206
- # 复制要备份的目录到临时目录
207
- BACKUP_CREATED=0
208
-
209
- # 备份config目录(排除工作目录)
210
- if [ -d "/mcp-proxy-server/config" ] && [ "$(ls -A /mcp-proxy-server/config 2>/dev/null)" ]; then
211
- mkdir -p "$TEMP_DIR/config"
212
- for item in /mcp-proxy-server/config/*; do
213
- if [ -e "$item" ]; then
214
- BASENAME=$(basename "$item")
215
- case "$BASENAME" in
216
- github_data|temp_backup|webdav_restore)
217
- ;;
218
- *)
219
- if [ -d "$item" ]; then
220
- cp -r "$item" "$TEMP_DIR/config/" 2>/dev/null && BACKUP_CREATED=1
221
- else
222
- cp "$item" "$TEMP_DIR/config/" 2>/dev/null && BACKUP_CREATED=1
223
- fi
224
- ;;
225
- esac
226
- fi
227
- done
228
- fi
229
-
230
- # 备份tools目录
231
- if [ -d "/tools" ] && [ "$(ls -A /tools 2>/dev/null)" ]; then
232
- mkdir -p "$TEMP_DIR/tools"
233
- for item in /tools/*; do
234
- if [ -e "$item" ]; then
235
- BASENAME=$(basename "$item")
236
- if [ -d "$item" ]; then
237
- mkdir -p "$TEMP_DIR/tools/$BASENAME"
238
- if [ "$(ls -A "$item" 2>/dev/null)" ]; then
239
- cp -r "$item"/* "$TEMP_DIR/tools/$BASENAME/" 2>/dev/null && BACKUP_CREATED=1
240
- cp -r "$item"/.[!.]* "$TEMP_DIR/tools/$BASENAME/" 2>/dev/null || true
241
- else
242
- touch "$TEMP_DIR/tools/$BASENAME/.gitkeep"
243
- BACKUP_CREATED=1
244
- fi
245
- else
246
- cp "$item" "$TEMP_DIR/tools/" 2>/dev/null && BACKUP_CREATED=1
247
- fi
248
- fi
249
- done
250
- fi
251
-
252
- # 创建压缩包并上传
253
- if [ "$BACKUP_CREATED" = "1" ] && [ "$(ls -A $TEMP_DIR)" ]; then
254
- (cd "$TEMP_DIR" && tar -czf "../$FILENAME" .)
255
-
256
- if curl -T "$WORK_DIR/$FILENAME" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$FILENAME" >/dev/null 2>&1; then
257
- echo "WebDAV备份上传成功: $FILENAME"
258
- # 更新记录文件
259
- [ "$CONFIG_CHANGED" = "1" ] && echo "$CURRENT_CONFIG_TIME" > "$CONFIG_LAST_CHECK_FILE"
260
- [ "$TOOLS_CHANGED" = "1" ] && echo "$CURRENT_TOOLS_TIME" > "$TOOLS_LAST_CHECK_FILE"
261
- else
262
- echo "WebDAV备份上传失败"
263
- fi
264
- rm -f "$WORK_DIR/$FILENAME"
265
- else
266
- echo "无文件可备份"
267
- fi
268
-
269
- rm -rf "$TEMP_DIR"
270
- else
271
- echo "无文件变化,跳过备份"
272
- fi
273
-
274
- # 等待下一次检查
275
- SYNC_INTERVAL=${SYNC_INTERVAL:-7200} # 默认间隔时间为 7200 秒
276
- echo "等待 ${SYNC_INTERVAL} 秒后进行下一次检查..."
277
- sleep $SYNC_INTERVAL
278
  done
279
  }
280
 
281
- # 后台启动同步进程
282
- sync_data &
283
 
284
- echo "同步进程已在后台启动 (PID: $!)"
285
- echo "现在启动 MCP Proxy 主程序..."
 
 
 
 
 
 
 
 
286
 
287
- # 启动原始的 MCP Proxy 程序
288
- echo "准备启动 MCP Proxy,端口: ${PORT:-7860},主机: ${HOST:-0.0.0.0}"
289
 
290
- if [ -f build/sse.js ]; then
291
- echo "启动: node build/sse.js"
292
- PORT=${PORT:-7860} HOST=${HOST:-0.0.0.0} exec node build/sse.js
293
- elif [ -f /app/build/sse.js ]; then
294
- echo "启动: node /app/build/sse.js"
295
- PORT=${PORT:-7860} HOST=${HOST:-0.0.0.0} exec node /app/build/sse.js
296
- elif [ -f /mcp-proxy-server/build/sse.js ]; then
297
- echo "启动: node /mcp-proxy-server/build/sse.js"
298
- PORT=${PORT:-7860} HOST=${HOST:-0.0.0.0} exec node /mcp-proxy-server/build/sse.js
299
- else
300
- echo "错误: 找不到 build/sse.js 文件"
301
- echo "当前目录: $(pwd)"
302
- echo "查找可能的 Node.js 文件:"
303
- find / -name "sse.js" -type f 2>/dev/null | head -5
304
-
305
- # 如果找不到,保持容器运行以便调试
306
- echo "保持容器运行以便调试..."
307
- tail -f /dev/null
308
- fi
 
1
  #!/bin/bash
2
 
3
+ # 检查必要的环境变量
4
  if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
5
+ echo "缺少必要的 WebDAV 环境变量:WEBDAV_URL, WEBDAV_USERNAME, WEBDAV_PASSWORD"
6
  exit 1
7
  fi
8
 
 
13
  # 从 WebDAV 恢复配置的函数
14
  restore_from_webdav() {
15
  echo "正在从 WebDAV 恢复配置文件..."
16
+
17
  # 创建临时恢复目录
18
  RESTORE_DIR="$WORK_DIR/webdav_restore"
19
  mkdir -p "$RESTORE_DIR"
20
+
21
  # 获取WebDAV上所有备份文件列表
22
  echo "获取 WebDAV 备份文件列表..."
23
+
24
+ # 尝试使用PROPFIND方法获取目录列表(WebDAV标准方法)
25
  RAW_RESPONSE=$(curl -s -X PROPFIND \
26
  --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" \
27
  -H "Depth: 1" \
28
  -H "Content-Type: text/xml" \
29
  -d '<?xml version="1.0" encoding="utf-8"?><propfind xmlns="DAV:"><prop><displayname/></prop></propfind>' \
30
  "$WEBDAV_URL/")
31
+
32
  # 如果PROPFIND失败,尝试简单的GET请求
33
  if [ -z "$RAW_RESPONSE" ] || echo "$RAW_RESPONSE" | grep -q "Method Not Allowed"; then
34
  RAW_RESPONSE=$(curl -s --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/")
35
  fi
36
+
37
  # 多种匹配方式
38
+ # 方式1: 从XML响应中提取文件名
39
  BACKUP_LIST1=$(echo "$RAW_RESPONSE" | grep -oE '<D:displayname[^>]*>[^<]*mcp_backup_[0-9]+_[0-9]+\.tar\.gz[^<]*</D:displayname>' | sed 's/<[^>]*>//g')
40
+ # 方式2: 从href属性中提取
41
  BACKUP_LIST2=$(echo "$RAW_RESPONSE" | grep -oE 'href="[^"]*mcp_backup_[0-9]+_[0-9]+\.tar\.gz[^"]*"' | sed 's/.*href="[^"]*\///g' | sed 's/".*//g')
42
+ # 方式3: 简单文本匹配
43
  BACKUP_LIST3=$(echo "$RAW_RESPONSE" | grep -oE 'mcp_backup_[0-9]+_[0-9]+\.tar\.gz')
44
+
45
+ # 合并所有结果并排序
46
  BACKUP_LIST=$(printf "%s\n%s\n%s\n" "$BACKUP_LIST1" "$BACKUP_LIST2" "$BACKUP_LIST3" | grep -v '^$' | sort -u | sort -r)
47
+
48
  if [ -z "$BACKUP_LIST" ]; then
49
  echo "未找到任何备份文件"
50
  rm -rf "$RESTORE_DIR"
51
  return 1
52
  fi
53
+
54
  echo "找到以下备份文件:"
55
  echo "$BACKUP_LIST" | head -5 | while read file; do echo " - $file"; done
56
  if [ $(echo "$BACKUP_LIST" | wc -l) -gt 5 ]; then
57
  echo " ... 等共 $(echo "$BACKUP_LIST" | wc -l) 个文件"
58
  fi
59
+
60
  # 尝试下载最新的备份文件
61
  LATEST_BACKUP=$(echo "$BACKUP_LIST" | head -1)
62
  echo "尝试下载最新备份: $LATEST_BACKUP"
63
+
64
  if curl -f --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$LATEST_BACKUP" -o "$RESTORE_DIR/$LATEST_BACKUP" 2>/dev/null; then
65
  echo "下载备份成功: $LATEST_BACKUP"
66
 
 
94
  }
95
  cd - > /dev/null
96
  else
97
+ echo "下载最新备份失败,将跳过恢复。"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
  fi
99
+
100
  # 清理临时目录
101
  rm -rf "$RESTORE_DIR"
102
  return 0
103
  }
104
 
105
+ # 定义备份到 WebDAV 的函数
106
+ backup_to_webdav() {
107
+ echo "开始备份到 WebDAV..."
108
+
109
+ BACKUP_DIR="$WORK_DIR/webdav_backup"
110
+ rm -rf "$BACKUP_DIR"
111
+ mkdir -p "$BACKUP_DIR"
112
+
113
+ # 准备要备份的目录
114
+ if [ -d "/mcp-proxy-server/config" ]; then
115
+ cp -r /mcp-proxy-server/config "$BACKUP_DIR/"
116
+ fi
117
+ if [ -d "/tools" ]; then
118
+ cp -r /tools "$BACKUP_DIR/"
119
+ fi
120
+
121
+ # 如果备份目录为空,则不执行备份
122
+ if [ -z "$(ls -A $BACKUP_DIR 2>/dev/null)" ]; then
123
+ echo "没有需要备份的文件,跳过此次备份。"
124
+ rm -rf "$BACKUP_DIR"
125
+ return
126
+ fi
127
 
128
+ # 创建备份压缩包
129
+ TIMESTAMP=$(date +%Y%m%d_%H%M%S)
130
+ BACKUP_FILE="mcp_backup_${TIMESTAMP}.tar.gz"
131
+
132
+ cd "$BACKUP_DIR"
133
+ tar -czf "$BACKUP_FILE" *
134
+
135
+ # 上传到 WebDAV
136
+ echo "正在上传备份文件: $BACKUP_FILE"
137
+ curl -T "$BACKUP_FILE" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$BACKUP_FILE"
138
+
139
+ if [ $? -eq 0 ]; then
140
+ echo "备份成功上传到 WebDAV。"
141
+ else
142
+ echo "备份上传失败。"
143
+ fi
144
+
145
+ cd - > /dev/null
146
+ rm -rf "$BACKUP_DIR"
147
 
148
+ # 清理旧的备份 (可选, 保留最近的10个)
149
+ MAX_BACKUPS=${MAX_BACKUPS:-10}
150
+ echo "清理 WebDAV 上的旧备份,保留最新的 $MAX_BACKUPS 个..."
 
 
 
151
 
152
+ # 重新获取备份列表
153
+ # 尝试使用PROPFIND方法获取目录列表
154
+ RAW_RESPONSE=$(curl -s -X PROPFIND --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -H "Depth: 1" -H "Content-Type: text/xml" -d '<?xml version="1.0" encoding="utf-8"?><propfind xmlns="DAV:"><prop><displayname/></prop></propfind>' "$WEBDAV_URL/")
155
+ # 如果PROPFIND失败,尝试简单的GET请求
156
+ if [ -z "$RAW_RESPONSE" ] || echo "$RAW_RESPONSE" | grep -q "Method Not Allowed"; then
157
+ RAW_RESPONSE=$(curl -s --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/")
158
+ fi
159
+ BACKUP_LIST=$(echo "$RAW_RESPONSE" | grep -oE 'mcp_backup_[0-9]+_[0-9]+\.tar\.gz' | sort -r)
160
+
161
+ OLD_BACKUPS=$(echo "$BACKUP_LIST" | tail -n +$((MAX_BACKUPS + 1)))
162
+
163
+ for old_backup in $OLD_BACKUPS; do
164
+ echo "删除旧备份: $old_backup"
165
+ curl -X DELETE --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$old_backup"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
166
  done
167
  }
168
 
 
 
169
 
170
+ # 脚本主逻辑
171
+
172
+ # 检查命令行参数
173
+ if [ "$1" = "--restore-only" ]; then
174
+ restore_from_webdav
175
+ exit 0
176
+ fi
177
+
178
+ # 启动时先恢复一次
179
+ restore_from_webdav
180
 
181
+ # 定义同步(备份)间隔
182
+ SYNC_INTERVAL=${SYNC_INTERVAL:-3600} # 默认1小时
183
 
184
+ # 循环执行备份
185
+ while true; do
186
+ echo "----------------------------------------"
187
+ echo "下一次 WebDAV 备份将在 $SYNC_INTERVAL 秒后进行..."
188
+ sleep "$SYNC_INTERVAL"
189
+ backup_to_webdav
190
+ done