- Date: 2025-06-28
📦 使用阿里云 OSS 实现每日冷备份自动同步系统(含自动清理)
一键式自动同步备份方案,适用于代码项目、博客网站、配置数据等资料的长期归档存储。
🧠 背景与目标
在实际开发中,我们常常面对两种场景:
- 想把完整的项目目录每天做一次“快照式”备份(以日期归档)。
- 需要对 部分子目录或临时文件(如
.git/
,.DS_Store
, 上传图片缓存等) 进行排除。 - 希望设置自动计划任务,每天凌晨备份一次,自动清理旧数据,仅保留最近 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