#!/bin/bash
# 此文件为备份 VPS 数据库和 WEB 目录,使用密钥登录到 VPS 服务器。
# 每月 1 日打包 web 目录备份,导出数据库存为 sql 文件备份,保留最新的 12 个月
# 每星期二用 rsyc 进行增量备份
# 远程服务器为 debian ,本地 nas 为 debian
DB_USER="root"
DB_PASS="$MYSQL_PASSWORD" # 使用环境变量存储密码,设置方法见下文
Local_dir="/mnt/Public/HomeFiles/mysite" # 本地 NAS 备份服务器目录
BACKUP_DIR="/root/backup" # 远程 VPS 备份目录
DATE_ALL=$(date +%Y%m%d_%H%M%S) # 格式如 20250820_1738
DATE_DAY=$(date +%d) # 获取系统日期
DATE_WEEK=$(date +%A) # 获取系统星期
LOG_FILE="${Local_dir}/backup_log_${DATE_ALL}.log" # 本地日志文件
MYSQL_PATH="/var/lib/mysql" # mysql 数据库路径
DATA_FILE=`ls -l $MYSQL_PATH | awk '{ print $9 ; }'` # 数据库目录
WEB_PATH="/var/www" # web 路径
WEB_FILE=`ls -l $WEB_PATH | awk '{ print $9 ; }'` # web 目录
Remote_IP=(8.8.8.8) # vps IP
Remote_Port=22 #--->vps Port 端口
# 创建本地 NAS 备份目录
mkdir -p "$Local_dir/backup/$(date +%Y%m%d)" 2>> "$LOG_FILE"
# 记录开始时间
echo "$DATE_ALL 开始备份" >> "$LOG_FILE"
# 检查是否为 1 号 (全量备份)
if [ "$DATE_DAY" -eq 1 ]; then
echo "$DATE_ALL 全量备份开始" >> "$LOG_FILE"
echo "$DATE_ALL 开始登录远程 vps" >> "$LOG_FILE"
# 一次性登录 VPS 执行所有备份命令
ssh -p $Remote_Port root@${Remote_IP[0]} << "EOF" 2>> "$LOG_FILE"
#echo "$DATE_ALL 已登录远程 vps" >> "$LOG_FILE"
#按数据库名导出 sql 格式
BACKUP_TEMP_DIR=/root/backup
mkdir -p $BACKUP_TEMP_DIR
cd $BACKUP_TEMP_DIR
for DataName in ${DATA_FILE} ; do
if [ -d $MYSQL_PATH/$DataName ];then
/usr/bin/mysqldump --databases $DataName -u$DB_USER -p$DB_PASS | gzip > $DataName\_$DATE_ALL.sql.gz 2>> "$LOG_FILE"
echo "$DATE_ALL 数据库:${DataName}_${DATE_ALL}.sql.gz 备份已完成" >> "$LOG_FILE"
fi
done
# 备份 web 目录,打包为 tar.gz
for WebName in ${WEB_FILE} ; do
if [ -d $WEB_PATH/$WebName ];then
tar -zcf $WebName_$(DATE_ALL).tar.gz $WEB_PATH/$WebName 2>> "$LOG_FILE"
echo "$DATE_ALL 网页:$WebName ${WebName}_${DATE_ALL}.tar.gz 备份已完成" >> "$LOG_FILE"
fi
done
EOF
# 备份传回 NAS 目录
echo "$DATE_ALL 开始向 nas 传输备份文件" >> "$LOG_FILE"
rsync -avz --delete -e "ssh -p $Remote_Port" root@${Remote_IP[0]}:$BACKUP_TEMP_DIR/* $Local_dir/backup_$(date +%Y%m%d) 2>> "$LOG_FILE"
echo "$DATE_ALL 备份文件已全部传回到 nas" >> "$LOG_FILE"
else
exit 0
fi
if [ "$DATE_WEEK" = "Tuesday" ]; then
#如果今天是星期二,就增量备份数据库和 web 目录
for VPS_IP in "${Remote_IP[@]}"; do
rsync -avz --delete -e "ssh -p $Remote_Port" root@$VPS_IP:/var/www $Local_dir/$VPS_IP
rsync -avz --delete -e "ssh -p $Remote_Port" root@$VPS_IP:/etc/nginx/sites-enabled $Local_dir/$VPS_IP
rsync -avz --delete -e "ssh -p $Remote_Port" root@$VPS_IP:/var/lib/mysql $Local_dir/$VPS_IP
# rsync -avz --delete -e "ssh -p $Remote_Port" root@$VPS_IP:/root/aaa $Local_dir/$VPS_IP
done
else
exit 0
fi