From 8c331ca17bbf2d2ae8a7e39049100f1f4700b2ab Mon Sep 17 00:00:00 2001 From: mango Date: Mon, 2 Feb 2026 11:07:25 +0800 Subject: [PATCH] =?UTF-8?q?v3.3:=20=E6=B7=BB=E5=8A=A0=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E4=BF=9D=E7=95=99=E6=95=B0=E9=87=8F=E3=80=81=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E4=BF=9D=E7=95=99=E5=A4=A9=E6=95=B0=E9=85=8D=E7=BD=AE=EF=BC=8C?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=B8=85=E7=90=86=E6=97=A7=E5=BF=AB=E7=85=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vps-snapshot.sh | 50 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/vps-snapshot.sh b/vps-snapshot.sh index 0255aaf..6123510 100755 --- a/vps-snapshot.sh +++ b/vps-snapshot.sh @@ -498,9 +498,39 @@ create_snapshot() { local size=$(du -h "$snapshot_file" | cut -f1) log "快照已创建: $snapshot_file ($size)" + + # 清理本地旧快照 + cleanup_local + echo "$snapshot_file" } +#=============================================================================== +# 清理旧快照 +#=============================================================================== + +cleanup_local() { + local snap_dir="${LOCAL_DIR:-/var/snapshots}" + local keep=${LOCAL_KEEP:-3} + + local count=$(ls -1 "$snap_dir"/*.tar.gz 2>/dev/null | wc -l) + if [ "$count" -gt "$keep" ]; then + log "🧹 清理本地旧快照 (保留$keep个)..." + ls -t "$snap_dir"/*.tar.gz | tail -n +$((keep+1)) | xargs rm -f + fi +} + +cleanup_remote() { + [ -z "$REMOTE_IP" ] && return + local days=${REMOTE_KEEP_DAYS:-30} + local remote_path="${REMOTE_DIR:-/backup}/${VPS_NAME:-$(hostname)}" + + log "🧹 清理远程旧快照 (保留${days}天)..." + sshpass -p "$REMOTE_PASS" ssh -o StrictHostKeyChecking=no \ + -p "${REMOTE_PORT:-22}" "${REMOTE_USER:-root}@$REMOTE_IP" \ + "find $remote_path -name '*.tar.gz' -mtime +$days -delete 2>/dev/null" || true +} + #=============================================================================== # 本地恢复 #=============================================================================== @@ -619,6 +649,9 @@ do_sync_remote() { -e "ssh -o StrictHostKeyChecking=no -p ${REMOTE_PORT:-22}" \ "$latest" "${REMOTE_USER:-root}@$REMOTE_IP:$remote_path/" + # 清理远程旧快照 + cleanup_remote + log "✅ 同步完成" } @@ -644,14 +677,16 @@ load_config() { save_config() { cat > "$CONFIG_FILE" << EOF VPS_NAME="$VPS_NAME" -TG_BOT_TOKEN="$TG_BOT_TOKEN" -TG_CHAT_ID="$TG_CHAT_ID" +LOCAL_DIR="$LOCAL_DIR" +LOCAL_KEEP="$LOCAL_KEEP" REMOTE_IP="$REMOTE_IP" REMOTE_PORT="$REMOTE_PORT" REMOTE_USER="$REMOTE_USER" REMOTE_PASS="$REMOTE_PASS" REMOTE_DIR="$REMOTE_DIR" -LOCAL_DIR="$LOCAL_DIR" +REMOTE_KEEP_DAYS="$REMOTE_KEEP_DAYS" +TG_BOT_TOKEN="$TG_BOT_TOKEN" +TG_CHAT_ID="$TG_CHAT_ID" EOF chmod 600 "$CONFIG_FILE" } @@ -667,6 +702,9 @@ do_setup() { read -p "本地快照目录 [/var/snapshots]: " LOCAL_DIR LOCAL_DIR=${LOCAL_DIR:-/var/snapshots} + read -p "本地保留快照数量 [3]: " LOCAL_KEEP + LOCAL_KEEP=${LOCAL_KEEP:-3} + echo "" info "远程备份配置 (可选,留空跳过)" read -p "远程服务器 IP: " REMOTE_IP @@ -677,8 +715,10 @@ do_setup() { REMOTE_USER=${REMOTE_USER:-root} read -s -p "远程密码: " REMOTE_PASS echo "" - read -p "远程目录 [/backup/$VPS_NAME]: " REMOTE_DIR - REMOTE_DIR=${REMOTE_DIR:-/backup/$VPS_NAME} + read -p "远程目录 [/backup]: " REMOTE_DIR + REMOTE_DIR=${REMOTE_DIR:-/backup} + read -p "远程保留天数 [30]: " REMOTE_KEEP_DAYS + REMOTE_KEEP_DAYS=${REMOTE_KEEP_DAYS:-30} fi echo ""