−25%

Windows 按年付费,截至 10 月 31 日。 查看套餐

EQVPS

如何用 restic 备份 VPS(加密、异地存放)

用 restic 做加密、去重的 VPS 备份:仓库放在 S3 兼容存储或另一台服务器上,配合 systemd 定时器、保留策略和恢复测试。

每个人都有备份,直到他们试着恢复一次。结果文件夹是空的,cron 任务三月份就停了,或者压缩包就躺在刚刚坏掉的那块磁盘上。restic 能解决其中的大部分:它在你这一端加密,每块数据只存一次,恢复单个文件和备份整台服务器一样简单。

下面是一套我们真正信得过的配置,适用于 Ubuntu 或 Debian。

1. 安装 restic

apt update && apt install -y restic
restic self-update

发行版自带的包往往比较旧;self-update 会拉取当前版本。

2. 选好仓库的位置

仓库不能放在你要保护的那台服务器上。两个常见选择:

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 套餐就够了。

常见问题

如果把 restic 密码弄丢了会怎样?

备份就永远没了。restic 在客户端加密一切,没有恢复密钥。请把密码存在密码管理器里,而不是只放在被备份的服务器上。

仓库应该放在哪里?

除了这台服务器本身,放哪儿都行:S3 兼容的对象存储、通过 SFTP 连接的另一台 VPS,或者家里的机器。和数据放在同一块磁盘上的备份,会和那块磁盘一起完蛋。

怎么用 restic 备份数据库?

先做转储,再备份转储文件——PostgreSQL 用 'pg_dump -Fc',MySQL 用 'mysqldump --single-transaction'。直接复制运行中数据库的文件,可能得到一个启动不了的备份。

备份会占多少空间?

比你想的少。restic 会把文件切成块,每块只存一次,所以对一台变化不大的服务器,每天的快照只会增加变化的那部分数据。

那我还需要 Managed Backups 吗?

它们解决的问题不同。Managed Backups 提供整台服务器的每日还原点,可以在控制面板里回滚。restic 提供由你掌控的、文件级的异地副本。很多人两个都用。

评论

暂无评论。来做第一个吧。

发表评论

评论在显示前会经过审核。