Spaces:
Paused
Paused
| # === 配置 === | |
| # WebDAV设置 (会自动读取环境变量) | |
| WEBDAV_URL=${WEBDAV_URL%/} | |
| FULL_WEBDAV_URL="${WEBDAV_URL}" | |
| TEMP_DIR="/tmp/backup_temp" | |
| # 指定要备份的文件名 | |
| TARGET_FILE="accounts.json" | |
| # 指定工作目录 (Docker内项目通常在 /app 或 /home/node/app) | |
| WORK_DIR=$(pwd) | |
| # 日志函数 | |
| log() { echo "[Backup] [$(date '+%H:%M:%S')] $1"; } | |
| # === 检查环境变量 === | |
| if [[ -z "$WEBDAV_URL" ]]; then | |
| log "未设置 WEBDAV_URL,跳过备份功能" | |
| exit 0 | |
| fi | |
| # === 准备环境 === | |
| mkdir -p $TEMP_DIR | |
| # 安装依赖 (如果镜像里没有) | |
| if ! command -v curl &> /dev/null; then | |
| log "安装 curl..." | |
| apt-get update && apt-get install -y curl || apk add --no-cache curl | |
| fi | |
| # === 1. 恢复备份 (启动时运行一次) === | |
| download_backup() { | |
| log "正在检查远程备份..." | |
| # 获取最新的备份文件名 (简单粗暴的方法:假设你只存最新的或者手动管理,这里简化为尝试下载固定名字或最新时间戳) | |
| # 为了简化逻辑,我们这里尝试下载 'latest_accounts.json' 或者列出文件 | |
| # 这里使用 curl 列出文件比较麻烦,我们简化逻辑:只下载/上传名为 accounts_backup.json 的文件 | |
| # 这样永远保持一份最新备份,避免空间满 | |
| REMOTE_FILE="$FULL_WEBDAV_URL/antigravity_accounts.json" | |
| log "尝试下载: $REMOTE_FILE" | |
| HTTP_CODE=$(curl -s -o "$TEMP_DIR/restored.json" -w "%{http_code}" -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$REMOTE_FILE") | |
| if [[ "$HTTP_CODE" == "200" ]]; then | |
| log "发现远程备份,正在恢复..." | |
| mv "$TEMP_DIR/restored.json" "$WORK_DIR/$TARGET_FILE" | |
| log "成功恢复 $TARGET_FILE" | |
| else | |
| log "未找到远程备份 (HTTP $HTTP_CODE),跳过恢复" | |
| fi | |
| } | |
| # === 2. 循环备份 === | |
| loop_sync() { | |
| while true; do | |
| # 每 10 分钟检查一次 (600秒),Token 变动不频繁,不需要太快 | |
| sleep 600 | |
| if [ -f "$WORK_DIR/$TARGET_FILE" ]; then | |
| # 计算文件MD5,如果没有变化就不上传 (节省流量) | |
| # 这里简化:直接上传覆盖,文件很小 | |
| log "正在上传备份..." | |
| REMOTE_FILE="$FULL_WEBDAV_URL/antigravity_accounts.json" | |
| HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" -u "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -T "$WORK_DIR/$TARGET_FILE" "$REMOTE_FILE") | |
| if [[ "$HTTP_CODE" == "201" ]] || [[ "$HTTP_CODE" == "204" ]] || [[ "$HTTP_CODE" == "200" ]]; then | |
| log "备份成功" | |
| else | |
| log "备份失败 (HTTP $HTTP_CODE)" | |
| fi | |
| else | |
| log "当前没有 $TARGET_FILE,跳过备份" | |
| fi | |
| done | |
| } | |
| # === 主流程 === | |
| download_backup | |
| loop_sync |