本文目录导读:

我来介绍一种自动备份并加密上传的完整方案,使用开源工具实现。
基本架构
源文件 → 压缩 → 加密 → 上传到云存储
完整脚本方案(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份异地
- 定期测试:每月恢复测试
- 增量+全量:每周全量,每日增量
- 加密存储:传输和存储都加密
选择最适合你需求的方案,建议先在小规模数据上测试验证。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播