mcp-proxy-server / sync_data.sh
aBER0724's picture
Update sync_data.sh
a27bcd4 verified
raw
history blame
9.12 kB
#!/bin/bash
# 检查必要的环境变量
if [ -z "$G_NAME" ] || [ -z "$G_TOKEN" ]; then
echo "缺少必要的环境变量 G_NAME 或 G_TOKEN"
exit 1
fi
# 从 WebDAV 恢复配置的函数
restore_from_webdav() {
if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
echo "WebDAV 环境变量缺失,无法从 WebDAV 恢复。"
return 1
fi
echo "正在从 WebDAV 恢复配置文件..."
# 获取今天的备份文件名
TODAY_FILENAME="mcp_backup_$(date +'%m_%d').tar.gz"
YESTERDAY_FILENAME="mcp_backup_$(date -d '1 day ago' +'%m_%d').tar.gz"
# 创建临时恢复目录
RESTORE_DIR="/mcp-proxy-server/config/webdav_restore"
mkdir -p "$RESTORE_DIR"
# 尝试下载今天的备份,如果失败则尝试昨天的
DOWNLOAD_SUCCESS=false
echo "尝试下载今天的备份: $TODAY_FILENAME"
if curl -f --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$TODAY_FILENAME" -o "$RESTORE_DIR/$TODAY_FILENAME" 2>/dev/null; then
BACKUP_FILE="$TODAY_FILENAME"
DOWNLOAD_SUCCESS=true
echo "下载今天的备份成功"
else
echo "今天的备份不存在,尝试下载昨天的备份: $YESTERDAY_FILENAME"
if curl -f --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$YESTERDAY_FILENAME" -o "$RESTORE_DIR/$YESTERDAY_FILENAME" 2>/dev/null; then
BACKUP_FILE="$YESTERDAY_FILENAME"
DOWNLOAD_SUCCESS=true
echo "下载昨天的备份成功"
else
echo "无法下载 WebDAV 备份文件"
fi
fi
if [ "$DOWNLOAD_SUCCESS" = true ]; then
# 解压缩备份文件
cd "$RESTORE_DIR"
tar -xzf "$BACKUP_FILE" && {
echo "解压缩备份文件成功"
# 恢复配置文件
if [ -d "config" ]; then
echo "恢复 config 目录..."
mkdir -p /mcp-proxy-server/config
cp -r config/* /mcp-proxy-server/config/
echo "config 目录恢复成功"
fi
if [ -d "tools" ]; then
echo "恢复 tools 目录..."
mkdir -p /tools
cp -r tools/* /tools/
echo "tools 目录恢复成功"
fi
echo "从 WebDAV 恢复配置文件完成"
} || {
echo "解压缩备份文件失败"
}
cd ../..
fi
# 清理临时目录
rm -rf "$RESTORE_DIR"
return $DOWNLOAD_SUCCESS
}
# 解析仓库名和用户名
IFS='/' read -r GITHUB_USER GITHUB_REPO <<< "$G_NAME"
# 构建 GitHub 仓库的克隆 URL,包含令牌
REPO_URL="https://${G_TOKEN}@github.com/${G_NAME}.git"
mkdir -p /mcp-proxy-server/config/github_data
# 克隆仓库
echo "正在克隆仓库……"
git clone "$REPO_URL" /mcp-proxy-server/config/github_data || {
echo "克隆失败,请检查 G_NAME 和 G_TOKEN 是否正确。"
exit 1
}
# 检查命令行参数,支持选择恢复源
RESTORE_SOURCE="auto" # 默认自动选择
if [ "$1" = "--restore-webdav" ]; then
RESTORE_SOURCE="webdav"
elif [ "$1" = "--restore-github" ]; then
RESTORE_SOURCE="github"
elif [ "$1" = "--restore-only" ]; then
RESTORE_SOURCE="$2"
if [ "$RESTORE_SOURCE" = "webdav" ]; then
restore_from_webdav
exit 0
elif [ "$RESTORE_SOURCE" = "github" ]; then
RESTORE_SOURCE="github"
else
echo "用法: $0 --restore-only [github|webdav]"
exit 1
fi
fi
# 恢复逻辑
if [ "$RESTORE_SOURCE" = "webdav" ]; then
# 仅从 WebDAV 恢复
restore_from_webdav
elif [ "$RESTORE_SOURCE" = "github" ] || [ "$RESTORE_SOURCE" = "auto" ]; then
# 检查并恢复配置文件(从 GitHub)
if [ -d /mcp-proxy-server/config/github_data/config ] && [ -d /mcp-proxy-server/config/github_data/tools ]; then
echo "从 GitHub 仓库中恢复配置文件..."
# 创建目标目录
mkdir -p /mcp-proxy-server/config
mkdir -p /tools
# 复制配置文件
cp -r /mcp-proxy-server/config/github_data/config/* /mcp-proxy-server/config/ 2>/dev/null || echo "config 目录为空或复制失败"
cp -r /mcp-proxy-server/config/github_data/tools/* /tools/ 2>/dev/null || echo "tools 目录为空或复制失败"
echo "从 GitHub 仓库中拉取配置文件成功"
else
echo "GitHub 仓库中未找到 config 或 tools 目录"
if [ "$RESTORE_SOURCE" = "auto" ]; then
echo "尝试从 WebDAV 恢复..."
restore_from_webdav || echo "WebDAV 恢复也失败,将在同步时推送当前配置"
fi
fi
fi
# 如果是仅恢复模式,则退出
if [ "$1" = "--restore-only" ]; then
exit 0
fi
# 定义同步函数
sync_data() {
while true; do
# 1. 同步到 GitHub
echo "正在开始同步"
# 进入仓库目录
cd /mcp-proxy-server/config/github_data
# 配置 Git 用户信息
git config user.name "AutoSync Bot"
git config user.email "autosync@bot.com"
# 确保在正确的分支
git checkout main || git checkout master
# 复制最新的配置文件
echo "复制配置文件到仓库..."
# 创建仓库中的目录
mkdir -p ./config
mkdir -p ./tools
# 复制配置文件(如果存在)
if [ -d "/mcp-proxy-server/config" ]; then
cp -r /mcp-proxy-server/config/* ./config/ 2>/dev/null || echo "config 目录为空"
else
echo "/mcp-proxy-server/config 目录不存在"
fi
if [ -d "/tools" ]; then
cp -r /tools/* ./tools/ 2>/dev/null || echo "tools 目录为空"
else
echo "/tools 目录不存在"
fi
# 检查是否有变化
if [[ -n $(git status -s) ]]; then
# 添加所有变更
git add config/ tools/
# 提交变更
git commit -m "Auto sync config and tools $(date '+%Y-%m-%d %H:%M:%S')"
# 推送到远程仓库
git push origin HEAD && {
echo "GitHub推送成功"
}|| {
echo "推送失败,等待重试..."
sleep 10
git push origin HEAD || {
echo "重试失败,放弃推送到Github。"
}
}
# 返回上级目录
cd ..
cd ..
# 2. 同步到 WebDAV
if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
echo "WebDAV 环境变量缺失,跳过 WebDAV 同步。"
else
echo "同步到 WebDAV..."
FILENAME="mcp_backup_$(date +'%m_%d').tar.gz"
# 创建临时备份压缩包
TEMP_DIR="/mcp-proxy-server/config/temp_backup"
mkdir -p "$TEMP_DIR"
# 复制要备份的目录到临时目录
if [ -d "/mcp-proxy-server/config" ]; then
cp -r /mcp-proxy-server/config "$TEMP_DIR/"
fi
if [ -d "/tools" ]; then
cp -r /tools "$TEMP_DIR/"
fi
# 创建压缩包
if [ "$(ls -A $TEMP_DIR)" ]; then
cd "$TEMP_DIR"
tar -czf "../$FILENAME" .
cd ../../..
# 使用 curl 进行文件上传
curl -T "/mcp-proxy-server/config/$FILENAME" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$FILENAME" && {
echo "WebDAV 上传成功"
} || {
echo "WebDAV 上传失败,等待重试..."
sleep 10
curl -T "/mcp-proxy-server/config/$FILENAME" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/$FILENAME" || {
echo "重试失败,放弃webdav上传。"
}
}
# 清理临时文件
rm -f "/mcp-proxy-server/config/$FILENAME"
else
echo "没有找到要备份的文件,跳过 WebDAV 同步"
fi
# 清理临时目录
rm -rf "$TEMP_DIR"
fi
else
# 返回上级目录
cd ..
cd ..
echo "GitHub: 没有检测到配置文件变化"
fi
# 3. 等待统一的时间间隔
SYNC_INTERVAL=${SYNC_INTERVAL:-7200} # 默认间隔时间为 7200 秒
echo "当前时间 $(date '+%Y-%m-%d %H:%M:%S')"
echo "等待 ${SYNC_INTERVAL} 秒后进行下一次同步..."
sleep $SYNC_INTERVAL
done
}
# 后台启动同步进程
sync_data &