实现网站自动备份并发送到邮箱,是保障数据安全最有效的手段之一。我们可以通过编写一个简单的 Shell 脚本,并配合 Linux 系统自带的 Crontab 定时任务来实现。以下是分步操作指南,帮助你在每天凌晨 2 点自动完成这项任务。
第一步:准备备份脚本
我们需要创建一个脚本文件,它的工作流程是: 进入目录 -> 打包文件 -> 导出数据库 -> 二次打包 -> 发送邮件 。
-
在服务器上创建一个脚本,例如
auto_backup.sh:Bash
nano /root/auto_backup.sh -
将以下内容复制并修改(替换为你自己的路径和数据库密码):
Bash
#!/bin/bash
# --- 设置变量 ---
WEB_DIR="/var/www/html" # 网站根目录
DB_USER="root" # 数据库用户名
DB_PASS="你的数据库密码" # 数据库密码
DB_NAME="你的数据库名" # 想要备份的数据库名
BACKUP_PATH="/root/site_backups" # 备份存放的临时目录
EMAIL="backup@gmail.com" # 接收备份的邮箱
DATE=$(date +%Y%m%d)
# 创建备份目录
mkdir -p $BACKUP_PATH
# 1. 打包网站文件
tar -zcvf $BACKUP_PATH/files_$DATE.tar.gz $WEB_DIR
# 2. 导出并打包数据库
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME > $BACKUP_PATH/db_$DATE.sql
tar -zcvf $BACKUP_PATH/database_$DATE.tar.gz $BACKUP_PATH/db_$DATE.sql
# 3. 将文件和数据库打包成一个大 ZIP 包
zip -j $BACKUP_PATH/full_backup_$DATE.zip $BACKUP_PATH/files_$DATE.tar.gz $BACKUP_PATH/database_$DATE.tar.gz
# 4. 发送邮件(使用 mail 命令)
echo "这是 $DATE 的网站自动备份文件。" | mail -s "网站备份_$DATE" -a $BACKUP_PATH/full_backup_$DATE.zip $EMAIL
# 5. 清理临时文件(可选,防止占用服务器空间)
rm -rf $BACKUP_PATH/*
第二步:安装必要的工具
为了让脚本顺利运行,你的服务器需要安装 zip 和邮件发送工具。在 Debian/Ubuntu 系统下执行:
Bash
apt update
apt install zip mailutils postfix -y
在安装 Postfix 时,通常选择 “Internet Site” 即可。
第三步:赋予脚本执行权限
脚本写好后,它默认只是一个文本文件,我们需要告诉系统:“这是一个可以运行的程序”。
Bash
chmod +x /root/auto_backup.sh
第四步:设置凌晨两点的定时任务
Linux 系统的 Crontab 就像一个闹钟,可以准时触发脚本。
-
输入命令进入编辑模式:
Bash
crontab -e -
在文件末尾添加以下这一行:
代码段
00 02 * * * /bin/bash /root/auto_backup.sh
** 说明:**
* `00 02` 代表 02:00。* `* * *` 分别代表日期、月份、星期(星号表示每天)。---
### 关键步骤通俗说明
#### 1. 为什么文件和数据库要分开打包?这叫 ** 解耦 **。如果网站代码没变,只有文章更新了,你以后可以只解压数据库包,速度更快,也更灵活。#### 2. 为什么要二次压缩成 ZIP?虽然 `.tar.gz` 在 Linux 下很常用,但发送给 Gmail 时,ZIP 格式的兼容性最好,且能将多个零散的压缩包汇总成一个附件,方便下载。#### 3. 关于自动发送邮件
脚本中的 `mail` 命令会通过服务器自带的 MTA 发送。如果你的服务器 IP 被 Gmail 拒收(常见于阿里云 / 腾讯云封禁 25 端口),你可能需要配置 **SMTP**(如使用 Gmail 或 SendGrid 的 SMTP 服务)来确保邮件必达。---
### 注意事项
* ** 磁盘空间 **:定期检查 `/root/site_backups` 目录。虽然脚本里写了 `rm` 清理命令,但如果发送失败,建议手动观察几次。* ** 安全 **:脚本中含有数据库密码,请确保该脚本文件的权限仅限 root 用户查看(`chmod 700`)。
正文完
