aBER0724 commited on
Commit
a3f26a0
·
verified ·
1 Parent(s): 66d8ba3

Upload 2 files

Browse files
Files changed (2) hide show
  1. Dockerfile +8 -0
  2. sync_data.sh +260 -0
Dockerfile ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ FROM ghcr.io/ptbsare/mcp-proxy-server/mcp-proxy-server:latest
2
+
3
+ COPY sync_data.sh sync_data.sh
4
+
5
+ RUN chmod -R 777 /mcp-proxy-server/config && \
6
+ chmod -R 777 /tools && \
7
+ sed -i "1r sync_data.sh" ./start.sh
8
+
sync_data.sh ADDED
@@ -0,0 +1,260 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # 检查必要的环境变量
4
+ if [ -z "$G_NAME" ] || [ -z "$G_TOKEN" ]; then
5
+ echo "缺少必要的环境变量 G_NAME 或 G_TOKEN"
6
+ exit 1
7
+ fi
8
+
9
+ # 从 WebDAV 恢复配置的函数
10
+ restore_from_webdav() {
11
+ if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
12
+ echo "WebDAV 环境变量缺失,无法从 WebDAV 恢复。"
13
+ return 1
14
+ fi
15
+
16
+ echo "正在从 WebDAV 恢复配置文件..."
17
+
18
+ # 获取今天的备份文件名
19
+ TODAY_FILENAME="mcp_backup_$(date +'%m_%d').tar.gz"
20
+ YESTERDAY_FILENAME="mcp_backup_$(date -d '1 day ago' +'%m_%d').tar.gz"
21
+
22
+ # 创建临时恢复目录
23
+ RESTORE_DIR="./data/webdav_restore"
24
+ mkdir -p "$RESTORE_DIR"
25
+
26
+ # 尝试下载今天的备份,如果失败则尝试昨天的
27
+ DOWNLOAD_SUCCESS=false
28
+
29
+ echo "尝试下载今天的备份: $TODAY_FILENAME"
30
+ if curl -f --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$TODAY_FILENAME" -o "$RESTORE_DIR/$TODAY_FILENAME" 2>/dev/null; then
31
+ BACKUP_FILE="$TODAY_FILENAME"
32
+ DOWNLOAD_SUCCESS=true
33
+ echo "下载今天的备份成功"
34
+ else
35
+ echo "今天的备份不存在,尝试下载昨天的备份: $YESTERDAY_FILENAME"
36
+ if curl -f --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$YESTERDAY_FILENAME" -o "$RESTORE_DIR/$YESTERDAY_FILENAME" 2>/dev/null; then
37
+ BACKUP_FILE="$YESTERDAY_FILENAME"
38
+ DOWNLOAD_SUCCESS=true
39
+ echo "下载昨天的备份成功"
40
+ else
41
+ echo "无法下载 WebDAV 备份文件"
42
+ fi
43
+ fi
44
+
45
+ if [ "$DOWNLOAD_SUCCESS" = true ]; then
46
+ # 解压缩备份文件
47
+ cd "$RESTORE_DIR"
48
+ tar -xzf "$BACKUP_FILE" && {
49
+ echo "解压缩备份文件成功"
50
+
51
+ # 恢复配置文件
52
+ if [ -d "config" ]; then
53
+ echo "恢复 config 目录..."
54
+ mkdir -p /mcp-proxy-server/config
55
+ cp -r config/* /mcp-proxy-server/config/
56
+ echo "config 目录恢复成功"
57
+ fi
58
+
59
+ if [ -d "tools" ]; then
60
+ echo "恢复 tools 目录..."
61
+ mkdir -p /tools
62
+ cp -r tools/* /tools/
63
+ echo "tools 目录恢复成功"
64
+ fi
65
+
66
+ echo "从 WebDAV 恢复配置文件完成"
67
+ } || {
68
+ echo "解压缩备份文件失败"
69
+ }
70
+ cd ../..
71
+ fi
72
+
73
+ # 清理临时目录
74
+ rm -rf "$RESTORE_DIR"
75
+ return $DOWNLOAD_SUCCESS
76
+ }
77
+
78
+ # 解析仓库名和用户名
79
+ IFS='/' read -r GITHUB_USER GITHUB_REPO <<< "$G_NAME"
80
+
81
+ # 构建 GitHub 仓库的克隆 URL,包含令牌
82
+ REPO_URL="https://${G_TOKEN}@github.com/${G_NAME}.git"
83
+ mkdir -p ./data/github_data
84
+
85
+ # 克隆仓库
86
+ echo "正在克隆仓库……"
87
+ git clone "$REPO_URL" ./data/github_data || {
88
+ echo "克隆失败,请检查 G_NAME 和 G_TOKEN 是否正确。"
89
+ exit 1
90
+ }
91
+
92
+ # 检查命令行参数,支持选择恢复源
93
+ RESTORE_SOURCE="auto" # 默认自动选择
94
+ if [ "$1" = "--restore-webdav" ]; then
95
+ RESTORE_SOURCE="webdav"
96
+ elif [ "$1" = "--restore-github" ]; then
97
+ RESTORE_SOURCE="github"
98
+ elif [ "$1" = "--restore-only" ]; then
99
+ RESTORE_SOURCE="$2"
100
+ if [ "$RESTORE_SOURCE" = "webdav" ]; then
101
+ restore_from_webdav
102
+ exit 0
103
+ elif [ "$RESTORE_SOURCE" = "github" ]; then
104
+ RESTORE_SOURCE="github"
105
+ else
106
+ echo "用法: $0 --restore-only [github|webdav]"
107
+ exit 1
108
+ fi
109
+ fi
110
+
111
+ # 恢复逻辑
112
+ if [ "$RESTORE_SOURCE" = "webdav" ]; then
113
+ # 仅从 WebDAV 恢复
114
+ restore_from_webdav
115
+ elif [ "$RESTORE_SOURCE" = "github" ] || [ "$RESTORE_SOURCE" = "auto" ]; then
116
+ # 检查并恢复配置文件(从 GitHub)
117
+ if [ -d ./data/github_data/config ] && [ -d ./data/github_data/tools ]; then
118
+ echo "从 GitHub 仓库中恢复配置文件..."
119
+ # 创建目标目录
120
+ mkdir -p /mcp-proxy-server/config
121
+ mkdir -p /tools
122
+
123
+ # 复制配置文件
124
+ cp -r ./data/github_data/config/* /mcp-proxy-server/config/ 2>/dev/null || echo "config 目录为空或复制失败"
125
+ cp -r ./data/github_data/tools/* /tools/ 2>/dev/null || echo "tools 目录为空或复制失败"
126
+
127
+ echo "从 GitHub 仓库中拉取配置文件成功"
128
+ else
129
+ echo "GitHub 仓库中未找到 config 或 tools 目录"
130
+ if [ "$RESTORE_SOURCE" = "auto" ]; then
131
+ echo "尝试从 WebDAV 恢复..."
132
+ restore_from_webdav || echo "WebDAV 恢复也失败,将在同步时推送当前配置"
133
+ fi
134
+ fi
135
+ fi
136
+
137
+ # 如果是仅恢复模式,则退出
138
+ if [ "$1" = "--restore-only" ]; then
139
+ exit 0
140
+ fi
141
+
142
+ # 定义同步函数
143
+ sync_data() {
144
+ while true; do
145
+ # 1. 同步到 GitHub
146
+ echo "正在开始同步"
147
+ # 进入仓库目录
148
+ cd ./data/github_data
149
+ # 配置 Git 用户信息
150
+ git config user.name "AutoSync Bot"
151
+ git config user.email "[email protected]"
152
+
153
+ # 确保在正确的分支
154
+ git checkout main || git checkout master
155
+
156
+ # 复制最新的配置文件
157
+ echo "复制配置文件到仓库..."
158
+
159
+ # 创建仓库中的目录
160
+ mkdir -p ./config
161
+ mkdir -p ./tools
162
+
163
+ # 复制配置文件(如果存在)
164
+ if [ -d "/mcp-proxy-server/config" ]; then
165
+ cp -r /mcp-proxy-server/config/* ./config/ 2>/dev/null || echo "config 目录为空"
166
+ else
167
+ echo "/mcp-proxy-server/config 目录不存在"
168
+ fi
169
+
170
+ if [ -d "/tools" ]; then
171
+ cp -r /tools/* ./tools/ 2>/dev/null || echo "tools 目录为空"
172
+ else
173
+ echo "/tools 目录不存在"
174
+ fi
175
+
176
+ # 检查是否有变化
177
+ if [[ -n $(git status -s) ]]; then
178
+ # 添加所有变更
179
+ git add config/ tools/
180
+
181
+ # 提交变更
182
+ git commit -m "Auto sync config and tools $(date '+%Y-%m-%d %H:%M:%S')"
183
+
184
+ # 推送到远程仓库
185
+ git push origin HEAD && {
186
+ echo "GitHub推送成功"
187
+ }|| {
188
+ echo "推送失败,等待重试..."
189
+ sleep 10
190
+ git push origin HEAD || {
191
+ echo "重试失败,放弃推送到Github。"
192
+ }
193
+ }
194
+ # 返回上级目录
195
+ cd ..
196
+ cd ..
197
+
198
+ # 2. 同步到 WebDAV
199
+ if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
200
+ echo "WebDAV 环境变量缺失,跳过 WebDAV 同步。"
201
+ else
202
+ echo "同步到 WebDAV..."
203
+ FILENAME="mcp_backup_$(date +'%m_%d').tar.gz"
204
+
205
+ # 创建临时备份压缩包
206
+ TEMP_DIR="./data/temp_backup"
207
+ mkdir -p "$TEMP_DIR"
208
+
209
+ # 复制要备份的目录到临时目录
210
+ if [ -d "/mcp-proxy-server/config" ]; then
211
+ cp -r /mcp-proxy-server/config "$TEMP_DIR/"
212
+ fi
213
+ if [ -d "/tools" ]; then
214
+ cp -r /tools "$TEMP_DIR/"
215
+ fi
216
+
217
+ # 创建压缩包
218
+ if [ "$(ls -A $TEMP_DIR)" ]; then
219
+ cd "$TEMP_DIR"
220
+ tar -czf "../$FILENAME" .
221
+ cd ../../..
222
+
223
+ # 使用 curl 进行文件上传
224
+ curl -T "./data/$FILENAME" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$FILENAME" && {
225
+ echo "WebDAV 上传成功"
226
+ } || {
227
+ echo "WebDAV 上传失败,等待重试..."
228
+ sleep 10
229
+ curl -T "./data/$FILENAME" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$FILENAME" || {
230
+ echo "重试失败,放弃webdav上传。"
231
+ }
232
+ }
233
+
234
+ # 清理临时文件
235
+ rm -f "./data/$FILENAME"
236
+ else
237
+ echo "没有找到要备份的文件,跳过 WebDAV 同步"
238
+ fi
239
+
240
+ # 清理临时目录
241
+ rm -rf "$TEMP_DIR"
242
+ fi
243
+
244
+ else
245
+ # 返回上级目录
246
+ cd ..
247
+ cd ..
248
+ echo "GitHub: 没有检测到配置文件变化"
249
+ fi
250
+ # 3. 等待统一的时间间隔
251
+ SYNC_INTERVAL=${SYNC_INTERVAL:-7200} # 默认间隔时间为 7200 秒
252
+ echo "当前时间 $(date '+%Y-%m-%d %H:%M:%S')"
253
+ echo "等待 ${SYNC_INTERVAL} 秒后进行下一次同步..."
254
+ sleep $SYNC_INTERVAL
255
+
256
+ done
257
+ }
258
+
259
+ # 后台启动同步进程
260
+ sync_data &