一个够用就好的备份脚本

2026-08-05

试过几个备份工具,最后还是回到 tar + rclone。简单、没有依赖、出问题能一眼看出是哪一步。

#!/usr/bin/env bash
set -euo pipefail

STAMP=$(date +%Y%m%d)
DEST=/var/backups/daily
mkdir -p "$DEST"

tar --zstd -cpf "$DEST/etc-$STAMP.tar.zst" -C / etc \
  --exclude='etc/ssl/private' 2>/dev/null

# 数据库单独 dump,避免直接拷数据文件
docker exec -i db pg_dumpall -U postgres \
  | zstd -q -o "$DEST/pg-$STAMP.sql.zst"

find "$DEST" -type f -mtime +7 -delete
rclone sync "$DEST" remote:vps-backup/daily --transfers 4

几个实践下来的点

  • 备份文件一定要有日期,别用 latest.tar,出事时你分不清是新是旧;
  • pg_dumpall 比直接拷 pgdata 安全,虽然慢一点;
  • 删除旧文件放在同步之前,不然远端会留着已经删掉的备份;
  • 最重要的:找一天真的恢复一次。没验证过的备份等于没有备份。

脚本丢进 cron,日志写到 journal,出问题在 journalctl -u backup 里能直接看。