Backing up mastodon

Ellie Huxtable

备份 Mastodon

我是 https://bikers.social 的管理员,这是一个面向骑行爱好者的 Mastodon 实例 🏍️

Postgres 是实例备份中最重要的部分。如果你丢了数据库,那就全完了。我的密钥也已备份。

我旧的 Mastodon 备份策略是定期执行 pg_dumps,并通过 scp 传到另一台机器上。这完全够用了,因为那台机器会备份到我的本地 NAS。不过我得半定期地手动清理旧备份,现在实例已经运行了一段时间,有个更好的方案就太好了。

最近我对其进行了一些改造,改用 Cloudflare R2。

R2

我把实例的所有静态资源都放在 R2 上。它的存储费用比 S3 便宜得多,而且没有出站费用!如果用 S3,我会有点担心突如其来的带宽账单。

截至 2023 年 5 月,R2 也支持生命周期策略

设置

首先,创建一个新的 R2 存储桶。它将用于存储。请确保它不是公开可访问的!

然后我们要设置本地的 aws cli。我创建了一个限定于该存储桶的 API 令牌,具有对象读写权限,并且仅限于我的 Mastodon 服务器的 IP 地址。运行 aws configure,然后粘贴你的新账户 ID 和密钥。

AWS cli 默认会假定你要使用的端点是 Amazon。较新版本的 CLI 可以在 config 中配置,但你的软件包仓库很可能已经过时。对于所有后续命令,我设置了

alias aws='aws --endpoint-url https://<account ID>.r2.cloudflarestorage.com'

然后我们就可以设置生命周期策略了。

进入你的存储桶设置,然后找到生命周期策略

我设置了一条生命周期规则,将每日备份保留一周,每周备份保留 6 周,每月备份保留 6 个月。

脚本

我的备份脚本非常简单。运行时,它会为当天创建一个文件,然后以指定的前缀上传到 R2。

#! /bin/bash

prefix=${1:-daily}
date=$(date '+%Y-%m-%d')

pg_dump -Fc -Z 0 -U mastodon mastodon_production | xz -T4 > $date.sql.xz

aws --endpoint-url https://<account ID>.r2.cloudflarestorage.com s3 cp ./$date.sql.xz s3://<bucket name>/$prefix/$date.sql.xz

如果未指定前缀,则默认为每日备份。

我为备份选择了 xz。它能提供最好的压缩率之一,代价是非常慢。我的 Mastodon 实例在配置上有点过剩,因为它是一台 Hetzner 的服务器,而我的实例流量并不算高。

pg_dump -Fc -Z 0 - 使用 custom 格式,但禁用压缩,因为我们会用 xz 来压缩

xz -T4 会使用 xz 压缩,且最多使用 4 个线程。我试过 -T0,它直接占满了全部 16 个线程,有点太过了。用 4 个线程完成速度仍然足够快。

Crontab

在通过以下命令手动测试之后

./backup.sh daily
./backup.sh weekly
./backup.sh monthly

并确认所有文件都已正常创建后,我设置了我的 crontab

0 12 * * * /home/mastodon/backup.sh daily
0 13 * * 0 /home/mastodon/backup.sh weekly
0 14 1 * * /home/mastodon/backup.sh monthly

这里会有一些重复的工作,但这不是什么大问题。我把它们安排在了我的白天时间执行,因为我还设置了在备份完成时通过 Telegram 通知我。

改进

将来,我可能会改用 wal-g。我觉得这对我们目前的情况来说有点过于重量级了,而且使用 pg_dump 的备份/恢复过程非常简单。如果数据库体积变得过大,或者需要实现时间点恢复,我会再考虑这个问题。

原文由 Ellie Huxtable 发布

本文章由 muse-spark-1.2-contributor 进行翻译