本文目录导读:

我来介绍一种自动备份并加密上传的完整方案,使用开源工具实现。
基本架构
源文件 → 压缩 → 加密 → 上传到云存储
完整脚本方案(Linux/Mac)
基础备份脚本
#!/bin/bash
# ===== 配置参数 =====
BACKUP_NAME="my_project"
BACKUP_SRC="/path/to/source"
BACKUP_TEMP="/tmp/backups"
ENCRYPT_KEY="your-encryption-key"
UPLOAD_TARGET="s3://my-bucket/backups/"
RETENTION_DAYS=30
# ===== 时间戳 =====
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="${BACKUP_NAME}_${TIMESTAMP}.tar.gz"
ENCRYPTED_FILE="${BACKUP_FILE}.gpg"
# ===== 1. 创建临时目录 =====
mkdir -p "$BACKUP_TEMP"
# ===== 2. 压缩备份 =====
echo "📦 正在压缩备份..."
tar -czf "${BACKUP_TEMP}/${BACKUP_FILE}" -C "$(dirname "$BACKUP_SRC")" "$(basename "$BACKUP_SRC")"
# ===== 3. 加密 =====
echo "🔒 正在加密..."
gpg --batch --yes --passphrase "$ENCRYPT_KEY" \
--symmetric --cipher-algo AES256 \
-o "${BACKUP_TEMP}/${ENCRYPTED_FILE}" \
"${BACKUP_TEMP}/${BACKUP_FILE}"
# ===== 4. 上传到云存储 =====
echo "☁️ 正在上传..."
# AWS S3
aws s3 cp "${BACKUP_TEMP}/${ENCRYPTED_FILE}" "${UPLOAD_TARGET}"
# 或者使用其他云存储服务
# rclone copy "${BACKUP_TEMP}/${ENCRYPTED_FILE}" "google-drive:backups/"
# ===== 5. 清理临时文件 =====
rm -f "${BACKUP_TEMP}/${BACKUP_FILE}"
rm -f "${BACKUP_TEMP}/${ENCRYPTED_FILE}"
# ===== 6. 清理旧备份(可选) =====
echo "🧹 清理旧备份..."
aws s3 ls "${UPLOAD_TARGET}" | while read -r line; do
create_date=$(echo $line | awk '{print $1}')
if [[ $(date -d "$create_date" +%s) -lt $(date -d "-${RETENTION_DAYS} days" +%s) ]]; then
file_name=$(echo $line | awk '{print $4}')
aws s3 rm "${UPLOAD_TARGET}${file_name}"
fi
done
echo "✅ 备份完成: ${ENCRYPTED_FILE}"
使用 GPG 密钥对加密(更安全)
#!/bin/bash
# ===== 配置 =====
BACKUP_NAME="server_backup"
BACKUP_SRC="/var/www"
BACKUP_TEMP="/tmp/backups"
RECIPIENT_EMAIL="your-email@example.com"
UPLOAD_TARGET="s3://my-bucket/backups/"
# ===== 生成密钥对(首次) =====
# gpg --full-generate-key
# ===== 导出公钥用于加密 =====
# gpg --export --armor "$RECIPIENT_EMAIL" > public-key.asc
# ===== 备份脚本 =====
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="${BACKUP_NAME}_${TIMESTAMP}.tar.gz"
ENCRYPTED_FILE="${BACKUP_FILE}.gpg"
mkdir -p "$BACKUP_TEMP"
# 压缩
tar -czf "${BACKUP_TEMP}/${BACKUP_FILE}" \
--exclude="node_modules" \
--exclude=".git" \
-C "$(dirname "$BACKUP_SRC")" "$(basename "$BACKUP_SRC")"
# 使用公钥加密(无需密码)
gpg --batch --yes --trust-model always \
--encrypt --recipient "$RECIPIENT_EMAIL" \
-o "${BACKUP_TEMP}/${ENCRYPTED_FILE}" \
"${BACKUP_TEMP}/${BACKUP_FILE}"
# 上传
rclone copy "${BACKUP_TEMP}/${ENCRYPTED_FILE}" \
"my-encrypted-backup:backups/"
# 清理
rm -f "${BACKUP_TEMP}/${BACKUP_FILE}"
rm -f "${BACKUP_TEMP}/${ENCRYPTED_FILE}"
echo "✅ 备份完成"
设置定时任务(Crontab)
# 编辑 crontab crontab -e # 每天凌晨2点执行 0 2 * * * /path/to/backup-script.sh >> /var/log/backup.log 2>&1 # 每6小时执行一次 0 */6 * * * /path/to/backup-script.sh # 每周日凌晨3点执行 0 3 * * 0 /path/to/backup-script.sh
Windows 方案(PowerShell)
使用 7-Zip 和 Gpg4win
# backup.ps1
# ===== 配置 =====
$BackupName = "Windows_Backup"
$SourcePath = "C:\Important"
$BackupTemp = "C:\Temp\Backups"
$EncryptPass = "your-strong-password"
$UploadTarget = "s3://my-bucket/backups/"
# ===== 时间戳 =====
$Timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$BackupFile = "$BackupName`_$Timestamp.7z"
$EncryptedFile = "$BackupFile.gpg"
# ===== 创建临时目录 =====
New-Item -ItemType Directory -Force -Path $BackupTemp
# ===== 压缩 =====
Write-Host "压缩中..."
& "C:\Program Files\7-Zip\7z.exe" a "$BackupTemp\$BackupFile" $SourcePath
# ===== 加密 =====
Write-Host "加密中..."
& "C:\Program Files (x86)\GnuPG\bin\gpg.exe" `
--batch --passphrase $EncryptPass `
--symmetric --cipher-algo AES256 `
-o "$BackupTemp\$EncryptedFile" `
"$BackupTemp\$BackupFile"
# ===== 上传 =====
Write-Host "上传中..."
aws s3 cp "$BackupTemp\$EncryptedFile" $UploadTarget
# ===== 清理 =====
Remove-Item "$BackupTemp\$BackupFile"
Remove-Item "$BackupTemp\$EncryptedFile"
Write-Host "备份完成"
使用专门的备份工具
Duplicati(推荐)
# 安装 Duplicati
# 使用 Docker
docker run -d \
--name duplicati \
-p 8200:8200 \
-v /source:/source:ro \
-v /backups:/backups \
linuxserver/duplicati
# Web 界面配置: http://localhost:8200
Restic(命令行)
#!/bin/bash
# restic 备份脚本
REPO="s3:https://s3.amazonaws.com/my-bucket/restic-repo"
PASSWORD="your-repo-password"
# 初始化仓库(仅首次)
restic -r "$REPO" init
# 备份
restic -r "$REPO" \
--password-file <(echo "$PASSWORD") \
backup /path/to/important \
--exclude="*.tmp" \
--exclude="node_modules"
# 自动加密,支持增量备份
# 恢复命令
# restic -r "$REPO" restore latest --target /restore
安全建议
密钥管理
# 使用密钥管理服务
# AWS KMS
aws kms encrypt --key-id alias/my-key \
--plaintext fileb://backup.tar.gz \
--output text --query CiphertextBlob | base64 --decode > backup.tar.gz.encrypted
# 或使用 HashiCorp Vault
vault write -field=ciphertext transit/encrypt/my-key \
plaintext=$(base64 < backup.tar.gz) > backup.tar.gz.encrypted
完整示例:集成通知
#!/bin/bash
# ===== 完整备份脚本 =====
CONFIG_FILE="/etc/backup/config.sh"
source "$CONFIG_FILE"
backup() {
log_file="/var/log/backup_$(date +%Y%m%d).log"
{
echo "=== 开始备份: $(date) ==="
# 1. 数据库备份
mysqldump -u root --all-databases > /tmp/db.sql
# 2. 文件备份
tar -czf /tmp/files.tar.gz /etc /var/www
# 3. 合并并加密
tar -czf - /tmp/db.sql /tmp/files.tar.gz | \
gpg --encrypt --recipient admin@example.com \
> "/backups/full_$(date +%Y%m%d).tar.gz.gpg"
# 4. 上传
s3cmd put "/backups/full_$(date +%Y%m%d).tar.gz.gpg" s3://backups/
# 5. 清理
rm -f /tmp/db.sql /tmp/files.tar.gz
echo "=== 备份完成: $(date) ==="
} 2>&1 | tee -a "$log_file"
# 发送通知
if [ $? -eq 0 ]; then
curl -X POST -H "Content-Type: application/json" \
-d '{"text":"备份成功"}' \
https://hooks.slack.com/services/YOUR/WEBHOOK
fi
}
# 执行
backup
解密验证
# 解密备份文件 gpg --decrypt backup.tar.gz.gpg > backup.tar.gz tar -tzf backup.tar.gz # 使用密钥对加密时 gpg --decrypt --recipient your-email@example.com backup.tar.gz.gpg > backup.tar.gz
推荐的备份策略
- 3-2-1 规则:3份备份,2种介质,1份异地
- 定期测试:每月恢复测试
- 增量+全量:每周全量,每日增量
- 加密存储:传输和存储都加密
选择最适合你需求的方案,建议先在小规模数据上测试验证。