From 38f62c4c509ac474a0370983ae005a1ad58dfcb7 Mon Sep 17 00:00:00 2001 From: mango Date: Mon, 2 Feb 2026 22:26:03 +0800 Subject: [PATCH] =?UTF-8?q?v3.11:=20=E6=99=BA=E8=83=BD=E6=89=AB=E6=8F=8F?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E7=9B=AE=E5=BD=95=EF=BC=8C=E5=AE=8C=E6=95=B4?= =?UTF-8?q?=E5=A4=87=E4=BB=BD=20/etc=20/root=20/home=20/usr/local=20/opt?= =?UTF-8?q?=20=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vps-snapshot.sh | 66 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 53 insertions(+), 13 deletions(-) diff --git a/vps-snapshot.sh b/vps-snapshot.sh index 3569d01..083b265 100755 --- a/vps-snapshot.sh +++ b/vps-snapshot.sh @@ -1,7 +1,7 @@ #!/bin/bash #=============================================================================== -# VPS 快照备份脚本 v3.10.6 +# VPS 快照备份脚本 v3.11 # 支持: Ubuntu, Debian, CentOS, Alpine # 功能: 智能识别应用 + Docker迁移 + 数据备份 + Telegram通知 #=============================================================================== @@ -271,9 +271,50 @@ backup_app_data() { local backup_paths="" + #--------------------------------------------------------------------------- + # 智能扫描系统目录(自动识别有数据的目录) + #--------------------------------------------------------------------------- + log "🔍 智能扫描系统目录..." + + # 核心配置目录 - 必备 + [ -d /etc ] && backup_paths+=" /etc" + + # 用户目录 + [ -d /root ] && backup_paths+=" /root" + [ -d /home ] && [ "$(ls -A /home 2>/dev/null)" ] && backup_paths+=" /home" + + # 手动安装的程序和数据 + [ -d /usr/local/bin ] && [ "$(ls -A /usr/local/bin 2>/dev/null)" ] && backup_paths+=" /usr/local/bin" + [ -d /usr/local/sbin ] && [ "$(ls -A /usr/local/sbin 2>/dev/null)" ] && backup_paths+=" /usr/local/sbin" + [ -d /usr/local/etc ] && [ "$(ls -A /usr/local/etc 2>/dev/null)" ] && backup_paths+=" /usr/local/etc" + + # /opt 应用目录(排除 containerd) + if [ -d /opt ]; then + for dir in /opt/*/; do + [ -d "$dir" ] || continue + local dirname=$(basename "$dir") + # 跳过 containerd(Docker 内部数据) + [ "$dirname" = "containerd" ] && continue + backup_paths+=" $dir" + done + fi + + # /var/www 网站目录 + [ -d /var/www ] && [ "$(ls -A /var/www 2>/dev/null)" ] && backup_paths+=" /var/www" + + # 显示扫描结果 + log "📋 将备份以下目录:" + for p in $backup_paths; do + local size=$(du -sh "$p" 2>/dev/null | cut -f1) + echo " $p ($size)" + done + + #--------------------------------------------------------------------------- + # 特定应用数据导出(数据库等需要特殊处理) + #--------------------------------------------------------------------------- + # Nginx - [ -d /etc/nginx ] && backup_paths+=" /etc/nginx" - [ -d /var/www ] && backup_paths+=" /var/www" + [ -d /etc/nginx ] && log " ✓ Nginx 配置" # MySQL if [ -d /var/lib/mysql ]; then @@ -325,25 +366,24 @@ backup_app_data() { fi # 1Panel - [ -d /opt/1panel ] && backup_paths+=" /opt/1panel" + [ -d /opt/1panel ] && log " ✓ 1Panel" # 宝塔 - [ -d /www ] && backup_paths+=" /www" + [ -d /www ] && backup_paths+=" /www" && log " ✓ 宝塔面板" - # 通用数据目录 - [ -d /opt ] && backup_paths+=" /opt" - [ -d /home ] && backup_paths+=" /home" - [ -d /root/.config ] && backup_paths+=" /root/.config" - - # 打包(排除快照目录) + # 打包(排除快照目录和无用文件) local snap_dir="${LOCAL_DIR:-/var/snapshots}" if [ -n "$backup_paths" ]; then - log "打包数据目录..." + log "📦 打包数据目录..." tar --exclude='*.sock' --exclude='*.pid' --exclude='node_modules' \ --exclude='.npm' --exclude='.cache' --exclude='__pycache__' \ + --exclude='*.log' --exclude='/var/log/*' \ + --exclude='/var/cache/*' --exclude='/tmp/*' \ --exclude="$snap_dir" --exclude='/var/snapshots' \ + --exclude='/root/.cache' --exclude='/root/.local/share/Trash' \ -czf "$output_dir/app-data.tar.gz" $backup_paths 2>/dev/null || true - info "数据已保存: $output_dir/app-data.tar.gz" + local data_size=$(du -h "$output_dir/app-data.tar.gz" 2>/dev/null | cut -f1) + info "数据已保存: $output_dir/app-data.tar.gz ($data_size)" fi }