#!/bin/sh # 日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" } # 检查环境变量 if [ -z "$HF_TOKEN" ] || [ -z "$DATASET_ID" ]; then log "错误: 未检测到 HF_TOKEN 或 DATASET_ID,备份功能不可用" exit 1 fi # 检查虚拟环境 if [ -f "$HOME/venv/bin/activate" ]; then log "激活虚拟环境..." . $HOME/venv/bin/activate else log "警告: 未找到虚拟环境,将使用系统Python" fi # 设置默认参数 SYNC_INTERVAL=${SYNC_INTERVAL:-7200} # 默认2小时 MAX_BACKUPS=${MAX_BACKUPS:-50} # 默认保留50个备份 MAX_BACKUP_SIZE=${MAX_BACKUP_SIZE:-100} # 默认备份大小限制100MB STORAGE_PATH="$HOME/app/data" # 生成同步脚本到正确路径 cat > /app/hf_sync.py << 'EOL' ... (此处为之前的hf_sync.py内容,保持不变) EOL # 首次启动时从 HuggingFace 下载最新备份 log "正在从 HuggingFace 下载最新备份..." if python /app/hf_sync.py download "${HF_TOKEN}" "${DATASET_ID}" "$HOME/app"; then log "备份恢复成功" else log "备份恢复失败,将继续启动应用" fi # 同步函数 sync_data() { while true; do log "同步进程启动" # 确保数据目录存在 if [ -d "${STORAGE_PATH}" ]; then # 创建备份 timestamp=$(date +%Y%m%d_%H%M%S) backup_file="backup_${timestamp}.tar.gz" temp_backup="/tmp/${backup_file}" # 压缩目录(使用-C避免包含父路径) log "正在创建备份..." tar -czf "${temp_backup}" -C "$(dirname "${STORAGE_PATH}")" "$(basename "${STORAGE_PATH}")" # 上传到 HuggingFace log "正在上传备份到 HuggingFace..." if python /app/hf_sync.py upload "${HF_TOKEN}" "${DATASET_ID}" "${temp_backup}" "${backup_file}" "${MAX_BACKUP_SIZE}"; then log "备份上传成功" else log "备份上传失败" fi # 合并历史提交 SQUASH_FLAG_FILE="/tmp/last_squash_time" NOW=$(date +%s) SEVEN_DAYS=$((7*24*60*60)) if [ ! -f "$SQUASH_FLAG_FILE" ]; then echo $NOW > "$SQUASH_FLAG_FILE" log "首次合并历史提交..." python /app/hf_sync.py super_squash "${HF_TOKEN}" "${DATASET_ID}" else LAST=$(cat "$SQUASH_FLAG_FILE") DIFF=$((NOW - LAST)) if [ $DIFF -ge $SEVEN_DAYS ]; then echo $NOW > "$SQUASH_FLAG_FILE" log "距离上次合并已超过7天,正在合并历史提交..." python /app/hf_sync.py super_squash "${HF_TOKEN}" "${DATASET_ID}" else log "距离上次合并未满7天,本次跳过合并历史提交。" fi fi # 清理临时文件 rm -f "${temp_backup}" else log "存储目录 ${STORAGE_PATH} 不存在,等待中..." fi # 同步间隔 log "下次同步将在 ${SYNC_INTERVAL} 秒后进行..." sleep $SYNC_INTERVAL done } # 启动同步进程 log "启动数据同步后台进程..." sync_data & # 记录同步进程ID echo $! > /tmp/sync_process.pid log "同步进程已启动,PID: $(cat /tmp/sync_process.pid)"