Backblaze B2 自动备份
以下是我为托管在 example.com 上的假设站点设置的方法:
- 在 Backblaze 上创建一个账户(目前,10GB 以下免费,无需输入付款信息)。
- 创建一个存储桶(Backblaze > B2 Cloud Storage)
- 名称:
$sitename-discourse-$random,填充至 30 个字符- 在此示例中:
example-discourse-g87he56ht8vg - Discourse 需要存储桶名称仅包含小写字母、数字和连字符。
- 我建议将其保持在 30 个字符或更少,这样在 Backblaze 的 Web UI 中显示效果更好,不会换行。
- 在此示例中:
- 私有存储桶
- 启用加密(SSE-B2)
- 启用对象锁定
- 名称:
- 创建一个应用程序密钥(Backblaze > Account > App Keys)
- KeyName:
example-discourse - BucketName(允许访问存储桶):
example-discourse-g87he56ht8vg - Capabilities:Read 和 Write
- 将 Name Prefix 和 Valid Duration Seconds 留空
- KeyName:
- 配置 Discourse B2 设置(Discourse > Admin > Settings)
backup_location:s3s3_backup_bucket:example-discourse-g87he56ht8vgs3_endpoint: 在存储桶页面上显示 - 确保以https://开头s3_access_key_id:(来自上一步)s3_secret_access_key:(来自上一步)- Backblaze 只会显示一次密钥(创建时)!
- 另外,您也可以在容器的 yml 文件中将其设置为环境变量(https://meta.discourse.org/t/best-practices-for-backups/148630)。这样您只需该文件即可恢复,无需其他任何内容:
env:
## Backblaze B2 Backups
# DISCOURSE_BACKUP_LOCATION: 's3' # 取消注释以从 CLI 恢复
DISCOURSE_S3_ENDPOINT: 'https://....backblazeb2.com'
DISCOURSE_S3_BACKUP_BUCKET: 'example-discourse-g87he56ht8vg'
DISCOURSE_S3_ACCESS_KEY_ID: '...'
DISCOURSE_S3_SECRET_ACCESS_KEY: '...'
# DISCOURSE_DISABLE_EMAILS: 'non-staff' # 取消注释以在测试恢复期间禁用电子邮件
## 您可以使用此容器 YML 以外的任何数据进行恢复。
## 取消注释上面的 DISCOURSE_BACKUP_LOCATION,构建容器(./launcher rebuild ...),
## 然后在容器内运行此命令(它将从 B2 存储桶恢复):
## discourse enable_restore
## discourse restore <example-com-...tar.gz> # 通过浏览 B2 Web UI 选择恢复文件名
## 记得之后禁用恢复
- 配置备份保留策略
- Discourse:
backup_frequency: 1(此示例中为每日备份,但您也可以选择每周)maximum_backups: 忽略此设置 - 让 Backblaze 处理
s3_disable_cleanup: true(防止在备份数量超过允许的最大值时从 S3 中删除旧备份)
- Backblaze(转到您的存储桶设置):
- Object Lock(默认保留策略):7 天
- Lifecycle Settings(自定义):
fileNamePrefix:default/example-com(可选)daysFromUploadingToHiding: 8 天- 这应该是 Object Lock + 1
daysFromHidingToDeleting: 1 天
总结此示例中的保留策略:
- Discourse:
- Discourse 每 1 天创建一个备份。
- 每个备份文件在上传到 B2 后 7 天内不可变(对象锁定)。这可以防止意外、勒索软件等。
- 上传后 8 天,备份上的对象锁定将过期。由于它再次变为可变,生命周期规则可以隐藏备份文件。
- 生命周期规则的下一部分将在隐藏后 1 天删除任何文件。
因此,您将获得每日备份。保留时间为一周,在此期间无论如何都无法删除备份。然后备份将在 2 天后删除。所以实际上一个备份会保留大约 9 天。
希望这对大家有帮助 ![]()
仔细想想,也许让 Discourse 处理保留策略(maximum_backups)更好。这样,如果 Discourse 出现故障,您的备份也不会自动开始过期。您不希望在尝试恢复时时钟还在滴答作响。如果采用这种方式,您可以设置 maximum_backups=8 和 s3_disable_cleanup=false(此示例中)并且不使用 B2 中的生命周期策略。但您仍然会使用对象锁定策略(7 天)。
编辑:实际上,我认为您仍然需要一个 B2 生命周期策略,因为我认为当 S2 客户端删除文件时,文件只会“隐藏”而不会被删除。我使用的是“只保留文件的最后一个版本”策略,这等同于 daysFromHidingToDeleting=1, daysFromUploadingToHiding=null。
我想您需要仔细考虑并决定哪种方法适合您。
顺便说一句,我意识到这篇帖子有些来回。我认为它本身就很有信息量,但如果有人愿意,我可以发布一篇更简单的帖子,其中包含我的实际建议。