Configure automatic backups for Discourse

Backblaze B2 自动备份

以下是我为托管在 example.com 上的假设站点设置的方法:

  1. 在 Backblaze 上创建一个账户(目前,10GB 以下免费,无需输入付款信息)。
  2. 创建一个存储桶(Backblaze > B2 Cloud Storage)
    • 名称:$sitename-discourse-$random,填充至 30 个字符
      • 在此示例中:example-discourse-g87he56ht8vg
      • Discourse 需要存储桶名称仅包含小写字母、数字和连字符。
      • 我建议将其保持在 30 个字符或更少,这样在 Backblaze 的 Web UI 中显示效果更好,不会换行。
    • 私有存储桶
    • 启用加密(SSE-B2)
    • 启用对象锁定
  3. 创建一个应用程序密钥(Backblaze > Account > App Keys)
    • KeyName:example-discourse
    • BucketName(允许访问存储桶):example-discourse-g87he56ht8vg
    • Capabilities:Read 和 Write
    • 将 Name Prefix 和 Valid Duration Seconds 留空
  4. 配置 Discourse B2 设置(Discourse > Admin > Settings)
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 选择恢复文件名
  ## 记得之后禁用恢复
  1. 配置备份保留策略
    • Discourse:
      • backup_frequency: 1(此示例中为每日备份,但您也可以选择每周)
      • maximum_backups: 忽略此设置 - 让 Backblaze 处理 :sunglasses:
      • s3_disable_cleanup: true防止在备份数量超过允许的最大值时从 S3 中删除旧备份
    • Backblaze(转到您的存储桶设置):
      • Object Lock(默认保留策略):7 天
      • Lifecycle Settings(自定义):
        • fileNamePrefix: default/example-com(可选)
        • daysFromUploadingToHiding: 8 天
          • 这应该是 Object Lock + 1
        • daysFromHidingToDeleting: 1 天
          总结此示例中的保留策略:
  • Discourse 每 1 天创建一个备份。
  • 每个备份文件在上传到 B2 后 7 天内不可变(对象锁定)。这可以防止意外、勒索软件等。
  • 上传后 8 天,备份上的对象锁定将过期。由于它再次变为可变,生命周期规则可以隐藏备份文件。
  • 生命周期规则的下一部分将在隐藏后 1 天删除任何文件。

因此,您将获得每日备份。保留时间为一周,在此期间无论如何都无法删除备份。然后备份将在 2 天后删除。所以实际上一个备份会保留大约 9 天。

希望这对大家有帮助 :slight_smile:


仔细想想,也许让 Discourse 处理保留策略(maximum_backups)更好。这样,如果 Discourse 出现故障,您的备份也不会自动开始过期。您不希望在尝试恢复时时钟还在滴答作响。如果采用这种方式,您可以设置 maximum_backups=8s3_disable_cleanup=false(此示例中)并且不使用 B2 中的生命周期策略。但您仍然会使用对象锁定策略(7 天)。

编辑:实际上,我认为您仍然需要一个 B2 生命周期策略,因为我认为当 S2 客户端删除文件时,文件只会“隐藏”而不会被删除。我使用的是“只保留文件的最后一个版本”策略,这等同于 daysFromHidingToDeleting=1, daysFromUploadingToHiding=null

我想您需要仔细考虑并决定哪种方法适合您。

顺便说一句,我意识到这篇帖子有些来回。我认为它本身就很有信息量,但如果有人愿意,我可以发布一篇更简单的帖子,其中包含我的实际建议。

6 个赞