每个人都有备份,直到他们试着恢复一次。结果文件夹是空的,cron 任务三月份就停了,或者压缩包就躺在刚刚坏掉的那块磁盘上。restic 能解决其中的大部分:它在你这一端加密,每块数据只存一次,恢复单个文件和备份整台服务器一样简单。
下面是一套我们真正信得过的配置,适用于 Ubuntu 或 Debian。
1. 安装 restic
apt update && apt install -y restic
restic self-update
发行版自带的包往往比较旧;self-update 会拉取当前版本。
2. 选好仓库的位置
仓库不能放在你要保护的那台服务器上。两个常见选择:
- 通过 SFTP 的另一台服务器:
sftp:backup@203.0.113.20:/srv/restic/web1 - S3 兼容的对象存储:
s3:https://s3.example.com/my-bucket/web1
3. 保存凭据
把所有东西放进一个只有 root 能读的文件里,让定时器和你的 shell 用同一套设置:
cat > /root/.restic-env <<'EOF'
export RESTIC_REPOSITORY="s3:https://s3.example.com/my-bucket/web1"
export RESTIC_PASSWORD_FILE="/root/.restic-pass"
export AWS_ACCESS_KEY_ID="your-key-id"
export AWS_SECRET_ACCESS_KEY="your-secret"
EOF
openssl rand -base64 32 > /root/.restic-pass
chmod 600 /root/.restic-env /root/.restic-pass
现在把 /root/.restic-pass 的内容复制到你的密码管理器里。没有它,备份就无法解密——你不行,任何人都不行。
4. 初始化并执行第一次备份
source /root/.restic-env
restic init
restic backup /etc /home /root /srv /var/www \
--exclude-caches --exclude '/root/.cache'
restic snapshots
根据数据实际所在的位置调整路径。Docker 卷在 /var/lib/docker/volumes 下;应用数据通常在 /srv 或 /opt。
5. 数据库:先转储,再备份
不要备份运行中数据库的原始文件。在备份前一刻做一次转储:
mkdir -p /var/backups/db
sudo -u postgres pg_dump -Fc mydb > /var/backups/db/mydb.dump
把 /var/backups/db 加进备份路径。关于转储的更多内容,见我们的 PostgreSQL 指南。
6. 用 systemd 定时执行
这里定时器比 cron 更好:它会把日志写进 journal,而且如果到点时服务器是关着的,它会在之后补跑。
# /etc/systemd/system/restic-backup.service
[Unit]
Description=restic backup
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'source /root/.restic-env && restic backup /etc /home /root /srv /var/www /var/backups/db --exclude-caches && restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune'
# /etc/systemd/system/restic-backup.timer
[Unit]
Description=Daily restic backup
[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true
[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now restic-backup.timer
systemctl list-timers restic-backup.timer
forget --prune 会保留 7 个每日、4 个每周和 6 个每月快照,其余的删除。如果有数据库转储步骤,把它写进 ExecStartPre= 那一行。
7. 真的恢复一次
正是这一步,把"我们有备份"变成事实。把一个目录恢复到临时文件夹里看看:
source /root/.restic-env
restic restore latest --target /tmp/restore-test --include /etc/nginx
ls -la /tmp/restore-test/etc/nginx
restic check
现在做一次,以后每隔几个月再做一次。restic check 会校验仓库结构;恢复则证明数据真的在那里。
restic 与 Managed Backups
它们并不冲突。Managed Backups 每天为整台服务器生成一个还原点,可以在控制面板里回滚——升级出问题后的快速补救。价格是每月 $2,所有年付套餐都免费包含。restic 则把文件级副本存到你自己掌控的异地存储里,当问题是上周二删掉的某个文件,或者你想要一份完全在我们基础设施之外的副本时,它就派上用场了。
如果你存的是敏感数据,可以把它和全盘加密搭配使用,或者参考加密存储使用场景来运行你自己的备份目标。对大多数小服务器和它们的备份任务来说,Micro 套餐就够了。
评论
暂无评论。来做第一个吧。