为服务器添加自动备份功能 作者: aixiaxue 时间: 2026-03-25 分类: 建站心得 阅读 38次 #任务内容: 为自己的网站服务器添加自动备份功能,每周一的凌晨3点自动执行脚本 #任务要求: 1、将网站目录、数据库进行备份,备份到/var/backups 2、备份内容存到服务器一份,另外再通过邮件发送给自己一份 3、将超过30天的备份自动删除 #实施过程: ##创建备份文件夹 ```bash # 创建规范的备份目录 sudo mkdir -p /var/backups/wangyubin/{web,database,logs} sudo mkdir -p /var/backups/wangyubin/archive # 设置权限(仅root可读写,防勒索病毒) sudo chown -R root:root /var/backups/wangyubin sudo chmod -R 700 /var/backups/wangyubin ``` ##创建备份脚本 ###创建脚本并编辑 ```bash vim /usr/local/bin/backup_wangyubin.sh ``` ###脚本内容 ```bash #!/bin/bash # ============================================ # 网站与数据库定时备份脚本 # 备份路径:/var/backups/wangyubin/ # 定时任务:每周一凌晨3点执行 # ============================================ # 配置变量 BACKUP_BASE="/var/backups/wangyubin" WEB_DIR="/www/wwwroot/wangyubin" DB_NAME="数据库名称" #替换成你的数据库名称 DB_USER="数据库用户" #替换成你的数据库用户 DB_PASS="数据库密码" #替换成你的数据库密码 DATE=$(date +%Y%m%d_%H%M%S) WEEK_DAY=$(date +%u) # 1=周一 # 邮件配置(需修改为你的邮箱) EMAIL_TO="your-email@example.com" EMAIL_FROM="your-email@example.com" # 创建临时目录 TEMP_DIR="$BACKUP_BASE/temp_$DATE" mkdir -p "$TEMP_DIR" echo "========== 备份开始:$(date) ==========" # ---------- 1. 备份网站目录 ---------- echo "[1/6] 正在备份网站目录..." WEB_BACKUP="$TEMP_DIR/web_wangyubin_$DATE.tar.gz" tar -czf "$WEB_BACKUP" -C "$(dirname $WEB_DIR)" "$(basename $WEB_DIR)" 2>/dev/null if [ -f "$WEB_BACKUP" ]; then WEB_SIZE=$(du -h "$WEB_BACKUP" | cut -f1) echo " ✓ 网站备份完成: $WEB_SIZE" else echo " ✗ 网站备份失败" exit 1 fi # ---------- 2. 备份数据库 ---------- echo "[2/6] 正在备份数据库..." DB_BACKUP="$TEMP_DIR/db_${DB_NAME}_$DATE.sql" # 使用mysqldump备份(适用于MySQL/MariaDB) mysqldump -u"$DB_USER" -p"$DB_PASS" --single-transaction --quick --lock-tables=false "$DB_NAME" > "$DB_BACKUP" 2>/dev/null # 压缩数据库备份 gzip -f "$DB_BACKUP" DB_BACKUP="${DB_BACKUP}.gz" if [ -f "$DB_BACKUP" ]; then DB_SIZE=$(du -h "$DB_BACKUP" | cut -f1) echo " ✓ 数据库备份完成: $DB_SIZE" else echo " ✗ 数据库备份失败" exit 1 fi # ---------- 3. 打包合并 ---------- echo "[3/6] 正在打包合并..." FINAL_BACKUP="$BACKUP_BASE/archive/backup_wangyubin_$DATE.tar.gz" tar -czf "$FINAL_BACKUP" -C "$TEMP_DIR" . if [ -f "$FINAL_BACKUP" ]; then FINAL_SIZE=$(du -h "$FINAL_BACKUP" | cut -f1) echo " ✓ 总备份包: $FINAL_SIZE" else echo " ✗ 打包失败" exit 1 fi # ---------- 4. 发送邮件 ---------- echo "[4/6] 正在发送邮件..." # 生成邮件内容 MAIL_SUBJECT="[备份通知] wangyubin 网站备份 - $(date +%Y-%m-%d)" MAIL_BODY="备份详情: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 备份时间:$(date '+%Y-%m-%d %H:%M:%S') 备份文件:backup_wangyubin_$DATE.tar.gz 文件大小:$FINAL_SIZE 存储路径:$BACKUP_BASE/archive/ 包含内容: • 网站目录:/www/wwwroot/wangyubin • 数据库:typecho_blog 本地保留策略:保留最近30天备份 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" # 发送带附件的邮件(使用mutt或mailx) if command -v mutt >/dev/null 2>&1; then echo "$MAIL_BODY" | mutt -s "$MAIL_SUBJECT" -a "$FINAL_BACKUP" -- "$EMAIL_TO" echo " ✓ 邮件已发送(通过mutt)" elif command -v mail >/dev/null 2>&1; then # 如果附件太大,可以只发送通知,附件存本地 echo "$MAIL_BODY" | mail -s "$MAIL_SUBJECT" "$EMAIL_TO" echo " ✓ 邮件已发送(通过mail,附件未附加,请从服务器下载)" else echo " ! 未安装邮件工具,跳过邮件发送" fi # ---------- 5. 清理临时文件 ---------- echo "[5/6] 清理临时文件..." rm -rf "$TEMP_DIR" # ---------- 6. 清理旧备份(保留30天) ---------- echo "[6/6] 清理旧备份..." find "$BACKUP_BASE/archive" -name "backup_wangyubin_*.tar.gz" -mtime +30 -delete echo " ✓ 已清理30天前的旧备份" echo "========== 备份完成:$(date) ==========" # 写入日志 echo "[$(date)] 备份完成: $FINAL_SIZE" >> "$BACKUP_BASE/logs/backup.log" ``` ###设置脚本权限 ```bash sudo chmod +x /usr/local/bin/backup_wangyubin.sh ``` ##配置邮件发送 ####登录163邮箱开启STMP并获取密码 登录163邮箱后,点击设置开启STMP功能,  开启过程中会获得授权密码,复制下来 ####查看163邮箱的端口 登录163邮箱,找到帮助中心,获取网易的邮箱开放端口  网易开放使用的是465端口 ####登录阿里云开放端口 在阿里云后台,开放入站、出站规则   ####使用SMTP,安装msmtp + mutt ```bash # 安装 sudo apt-get install msmtp mutt #编辑msmtp配置文件 vim /etc/msmtprc ``` ```bash defaults auth on tls on tls_starttls off tls_trust_file /etc/ssl/certs/ca-certificates.crt timeout 30 account 163 host smtp.163.com port 465 from your-email@example.com user huhua-035@163.com password 你的授权密码 domain localhost account default : 163 ``` ##设置定时任务(Crontab) ```bash # 编辑root用户的定时任务 sudo crontab -e # 添加以下行(每周一凌晨3点执行) 0 3 * * 1 /usr/local/bin/backup_wangyubin.sh >> /var/backups/wangyubin/logs/cron.log 2>&1 ``` ##安全加固 由于脚本中包含数据库密码,必须进行安全加固: ```bash # 1. 设置脚本仅root可读 sudo chmod 700 /usr/local/bin/backup_wangyubin.sh sudo chown root:root /usr/local/bin/backup_wangyubin.sh # 2. 创建独立的备份用户(可选,更高安全级别) sudo useradd -r -s /bin/false backupuser sudo mkdir -p /home/backupuser/.my.cnf # 3. 使用MySQL配置文件存储密码(替代明文写在脚本中) sudo tee /root/.my.cnf << 'EOF' [mysqldump] user=数据库用户 ##你的数据库用户 password=数据库密码 ##你的数据库密码 EOF sudo chmod 600 /root/.my.cnf ``` #测试验证 ```bash # 手动执行测试(不等待周一) sudo /usr/local/bin/backup_wangyubin.sh ``` 正常情况下,邮箱会收到正常邮件  标签: none