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は、バケット名に小文字のアルファベット、数字、ダッシュのみを使用する必要があります。
      • BackblazeのWeb UIで折り返さずにきれいに表示されるように、30文字以下にすることをお勧めします。
    • プライベートバケット
    • 暗号化を有効にする(SSE-B2)
    • オブジェクトロックを有効にする
  3. アプリケーションキーを作成します(Backblaze > Account > App Keys)。
    • keyName:example-discourse
    • bucketName(バケットへのアクセスを許可):example-discourse-g87he56ht8vg
    • capabilities:read and write
    • namePrefixとvalidDurationSecondsは空白のままにします。
  4. Discourse B2設定を構成します(Discourse > Admin > Settings)。
    • backup_locations3
    • s3_backup_bucketexample-discourse-g87he56ht8vg
    • s3_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' # テストレストア中にメールを無効にするにはコメントを解除
  ## このコンテナYAML以降のデータなしで復元できます。
  ## 上記の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_cleanuptrue (許可されるバックアップ数を超えるバックアップのS3からの削除を防ぎます)
    • Backblaze(バケットの設定に移動):
      • オブジェクトロック(デフォルトの保持ポリシー):7日間
      • ライフサイクル設定(カスタム):
        • fileNamePrefixdefault/example-com (オプション)
        • daysFromUploadingToHiding:8日間
          • これはオブジェクトロック+1である必要があります
        • daysFromHidingToDeleting:1日
          この例での保持期間を要約すると:
  • Discourseは1日ごとにバックアップを作成します。
  • 各バックアップファイルは、B2へのアップロード後7日間不変です(オブジェクトロック)。これにより、事故やランサムウェアなどから保護されます。
  • アップロードから8日後、バックアップのオブジェクトロックが期限切れになります。再び変更可能になるため、ライフサイクルルールでバックアップファイルを非表示にできます。
  • ライフサイクルルールの次の部分で、非表示になってから1日後にファイルを削除します。

したがって、毎日バックアップを取得できます。保持期間は、バックアップが削除されない1週間です。その後、バックアップは2日後に削除されます。したがって、実際にはバックアップは約9日間存在します。

誰かの役に立つことを願っています :slight_smile:


改めて考えると、Discourseに保持期間を処理させる方が良いかもしれません(maximum_backups)。そうすれば、Discourseがダウンしている間にバックアップが自動的に期限切れになることはありません。復旧しようとしている間に時計が刻むのは避けたいでしょう。その方法を選択した場合、この例ではmaximum_backups=8s3_disable_cleanup=falseを設定し、B2のライフサイクルポリシーを使用しないことができます。ただし、オブジェクトロックポリシー(7日間)は引き続き使用します。

編集:実際には、S2クライアントがファイルを削除した場合、ファイルは削除されるのではなく「非表示」になるだけなので、B2ライフサイクルポリシーは依然として必要だと思います。「Keep only the last version of the file」ポリシーを使用しており、これはdaysFromHidingToDeleting=1, daysFromUploadingToHiding=nullと同等です。

検討して、どちらのアプローチが適切か判断してください。

ところで、この投稿にはいくつかの行き来があることに気づきました。現状でも有益だと思いますが、もし誰かが望むなら、私の実際の推奨事項を含む、もう少し簡単な投稿を作成できます。

「いいね!」 6