• Date: 2025-06-28

📦 使用阿里云 OSS 实现每日冷备份自动同步系统(含自动清理)

一键式自动同步备份方案,适用于代码项目、博客网站、配置数据等资料的长期归档存储。


🧠 背景与目标

在实际开发中,我们常常面对两种场景:

  1. 想把完整的项目目录每天做一次“快照式”备份(以日期归档)。
  2. 需要对 部分子目录或临时文件(如 .git/, .DS_Store, 上传图片缓存等) 进行排除。
  3. 希望设置自动计划任务,每天凌晨备份一次,自动清理旧数据,仅保留最近 N 天。

为此,我们采用阿里云的 OSS(对象存储服务) 作为冷备份仓库,搭配 ossutil 工具与 Bash 脚本,实现:

  • ✅ 按日期归档上传整个备份目录
  • ✅ 排除无需备份的冗余目录和文件
  • ✅ 自动清理早于 N 天的旧备份目录
  • ✅ 每日定时运行,无需人工干预

⚙️ 一、安装 ossutil 工具

wget https://gosspublic.alicdn.com/ossutil/1.7.16/ossutil64
chmod +x ossutil64
mv ossutil64 /usr/local/bin/ossutil

确认安装成功:

ossutil -v

🔐 二、配置 OSS 访问凭据

执行以下命令进行配置:

ossutil config

按提示输入 AccessKey、Secret、Endpoint 等。


🗂️ 三、规划备份结构

仅备份以下内容(例):

  • Benlog/
  • Blog/
  • Edu/
  • Gallery/(不含 Gallery/galleries)
  • Index/
  • instance/
  • Neibr/
  • Settings/
  • readme.md
  • requirements.txt

📝 四、冷备脚本 sync_to_oss.sh

nano /home/sync_to_oss.sh
#!/bin/bash

# === 配置项 ===
LOCAL_DIR="/home/Benlogmain.tar/Benlogmain"
TMP_DIR="/tmp/oss_sync_temp"
OSS_BUCKET="oss://keepy/backups"
LOGFILE="/var/log/oss_sync.log"
KEEP_DAYS=3

# === 日期逻辑 ===
TODAY=$(date +%Y%m%d)
DELETE_DAY=$(date -d "$KEEP_DAYS days ago" +%Y%m%d)
OSS_TARGET="$OSS_BUCKET/$TODAY/"
OLD_TARGET="$OSS_BUCKET/$DELETE_DAY/"

echo "[$(date)] 🧹 清空并复制文件到 $TMP_DIR" >> "$LOGFILE"
rm -rf "$TMP_DIR"/*
mkdir -p "$TMP_DIR"
cd "$LOCAL_DIR"

cp -r Benlog Blog Edu Gallery Index instance Neibr Settings "$TMP_DIR"
cp readme.md requirements.txt "$TMP_DIR"
rm -rf "$TMP_DIR/Gallery/galleries"
find "$TMP_DIR" -name ".git" -or -name ".DS_Store" -or -name ".gitignore" | xargs rm -rf

echo "[$(date)] ▶️ 上传至 OSS:$OSS_TARGET" >> "$LOGFILE"
ossutil cp "$TMP_DIR" "$OSS_TARGET" --recursive --meta "x-oss-storage-class:Archive" >> "$LOGFILE" 2>&1

echo "[$(date)] ✅ 上传完成" >> "$LOGFILE"
echo "[$(date)] 🗑️ 删除旧目录 $OLD_TARGET" >> "$LOGFILE"
ossutil rm -r -f "$OLD_TARGET" >> "$LOGFILE" 2>&1
#!/bin/bash

# ======== 配置项 ========
SOURCE_DIR="/home/Benlogmain.tar/Benlogmain"
TEMP_DIR="/tmp/oss_sync_temp"
OSS_BUCKET="oss://keepy/backups"
LOGFILE="/var/log/oss_sync.log"
KEEP_DAYS=3
# ========================

TODAY=$(date +%Y%m%d)
DELETE_DAY=$(date -d "$KEEP_DAYS days ago" +%Y%m%d)

OSS_TARGET="$OSS_BUCKET/$TODAY/"
OLD_TARGET="$OSS_BUCKET/$DELETE_DAY/"

# 清空临时目录
rm -rf "$TEMP_DIR"
mkdir -p "$TEMP_DIR"

echo "[$(date)] 🧹 清空并复制文件到中转目录 $TEMP_DIR(仅保留指定路径)" >> "$LOGFILE"

# 构造 include list 并 rsync
rsync -a \
  --exclude="/Gallery/galleries/***" \
  --include="/Benlog/***" \
  --include="/Blog/***" \
  --include="/Edu/***" \
  --include="/Gallery/***" \
  --include="/Index/***" \
  --include="/instance/***" \
  --include="/Neibr/***" \
  --include="/Settings/***" \
  --include="/README.md" \
  --include="/requirements.txt" \
  --exclude="*" \
  "$SOURCE_DIR"/ "$TEMP_DIR"/ >> "$LOGFILE" 2>&1

echo "[$(date)] ▶️ 上传至 OSS:$OSS_TARGET" >> "$LOGFILE"

ossutil cp "$TEMP_DIR" "$OSS_TARGET" \
  --recursive -f \
  --meta "x-oss-storage-class:Archive" >> "$LOGFILE" 2>&1

echo "[$(date)] ✅ 冷备上传完成" >> "$LOGFILE"

# 删除临时目录
rm -rf "$TEMP_DIR"

# 删除旧 OSS 路径
echo "[$(date)] 🧹 删除旧目录:$OLD_TARGET" >> "$LOGFILE"
ossutil rm "$OLD_TARGET" --recursive -f >> "$LOGFILE" 2>&1
echo "[$(date)] ✅ 清理完成" >> "$LOGFILE"  

保存路径:/home/sync_to_oss.sh,赋予执行权限:

chmod +x /home/sync_to_oss.sh
bash /home/sync_to_oss.sh
tail -f /var/log/oss_sync_cron.log

🔁 五、自动计划任务(每天凌晨3点)

执行 crontab -e,添加:

0 3 * * * bash /home/sync_to_oss.sh >> /var/log/oss_sync_cron.log 2>&1
ossutil ls oss://your-bucket-name/

🧯 六、问题排查

错误 原因 解决
AccessDenied 权限不对 使用主账号 AccessKey
Bad flag: --exclude-file 参数错误 ossutil 不支持该参数
上传慢 OSS归档带宽慢 可临时改为标准存储调试
.DS_Store 等垃圾文件上传 未排除 添加 find | xargs rm 语句

✅ 总结

本文完成了阿里云 OSS 的完整冷备方案,适合部署在服务器上长期运行,防止误删和数据丢失。

更新时间:2025-06-28

目录