网站备份策略与自动化脚本
安全加固
来源:16idc
自动化的网站文件和数据库备份脚本,支持本地保留和远程同步到 S3/对象存储,包含定期清理策略。
3-2-1 备份原则
- 3:保留 3 份备份副本
- 2:使用 2 种不同存储介质(本地 + 远程)
- 1:至少有 1 份异地备份
自动备份脚本
#!/bin/bash
# backup.sh — 网站文件和数据库自动备份
set -euo pipefail
# === 配置 ===
SITE_DIR="/var/www/example.com"
DB_NAME="wordpress"
DB_USER="root"
DB_PASS="your_password"
BACKUP_DIR="/var/backups"
RETENTION_DAYS=30
DATE=$(date +%Y%m%d_%H%M%S)
# 远程存储配置(可选)
RCLONE_REMOTE="s3:bucket-name/backups"
# === 1. 创建备份目录 ===
mkdir -p "$BACKUP_DIR/files" "$BACKUP_DIR/database"
# === 2. 备份文件(排除缓存目录) ===
echo ">>> Backing up files..."
tar -czf "$BACKUP_DIR/files/files_$DATE.tar.gz" \
--exclude="wp-content/cache" \
--exclude="wp-content/uploads/backupwp" \
--exclude="node_modules" \
--exclude=".git" \
-C "$SITE_DIR" .
# === 3. 备份数据库 ===
echo ">>> Backing up database..."
mysqldump -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" \
--single-transaction --quick --lock-tables=false \
| gzip > "$BACKUP_DIR/database/db_$DATE.sql.gz"
# === 4. 删除超过保留期的本地备份 ===
echo ">>> Cleaning old backups..."
find "$BACKUP_DIR/files" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
find "$BACKUP_DIR/database" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
# === 5. 同步到远程存储(可选) ===
if command -v rclone &>/dev/null; then
echo ">>> Syncing to remote storage..."
rclone sync "$BACKUP_DIR" "$RCLONE_REMOTE" --progress
fi
# === 6. 验证备份 ===
echo ">>> Verifying backup integrity..."
tar -tzf "$BACKUP_DIR/files/files_$DATE.tar.gz" > /dev/null && echo "Files backup OK"
zcat "$BACKUP_DIR/database/db_$DATE.sql.gz" | head -1 > /dev/null && echo "Database backup OK"
echo "=== Backup complete: $DATE ==="
Crontab 配置
# 每天凌晨 3 点执行备份
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
# 每周日删除 30 天前的备份(已在脚本中自动处理)
恢复步骤
# 恢复文件
tar -xzf /var/backups/files/files_20260713_030001.tar.gz -C /var/www/example.com/
# 恢复数据库
mysql -u root -p"$PASSWORD" db_name < db_20260713_030001.sql
# 或
gunzip < /var/backups/database/db_20260713_030001.sql.gz | mysql -u root -p"$PASSWORD" db_name
备份策略建议
| 数据类型 |
备份频率 |
保留时间 |
备份方式 |
| 网站文件 |
每日 |
30 天 |
增量或全量 |
| 数据库 |
每日 |
30 天 |
mysqldump |
| 配置文件 |
每次变更 |
90 天 |
Git 仓库 |
| 日志文件 |
每周 |
180 天 |
logrotate |
| 完整快照 |
每月 |
12 个月 |
服务商快照 |
安全注意事项
- 备份文件包含敏感数据,确保权限为 600
- 远程存储需要加密(使用服务商提供的加密或 GPG)
- 定期测试恢复流程——没有经过恢复验证的备份不是真正的备份
- 将备份脚本和密钥分开存储