Discourse 自動週次バックアップ・更新スクリプト (S3アップロードの問題回避)

Discourseでは、S3アップロード機能が有効な状態で生成されたバックアップは、サイトの復元に成功しないことが多く、自動バックアップが事実上無効になっています。この問題に対処するため、バックアップを開始する前にS3アップロードを無効にし、バックアップファイルが完全で利用可能であることを保証するこのスクリプトを作成しました。バックアップが完了した後、スクリプトは通常のサイト運用とファイルストレージを維持するためにS3アップロードを再度有効にします。

さらに、このスクリプトはバックアップとアップデートのプロセス中に読み取り専用モードを有効にし、データ書き込みを防ぎ、一貫性を確保します。最後に、最新のコードアップデートを自動的にプルし、Dockerコンテナを再構築してメンテナンスサイクルを完了します。

このスクリプトが他のDiscourse管理者の皆様のお役に立てば幸いです。フィードバックや改善提案を歓迎します!

#!/bin/bash

set -e

LOG_FILE="/var/discourse/scripts/weekly_update.log"

log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" 
}

log "=== Weekly Discourse Update Started ==="

cd /var/discourse || { log "Failed to cd /var/discourse"; exit 1; }

log "Enabling Read-Only Mode..."
sudo docker exec app rails runner "SiteSetting.readonly_mode = true; puts 'Readonly mode enabled'" 

log "Disabling S3 uploads..."
sudo docker exec app rails runner "SiteSetting.enable_s3_uploads = false"

log "Starting backup..."
if ! sudo docker exec app discourse backup ; then
  log "Backup failed"
  exit 1
fi
log "Backup succeeded."

log "Enabling S3 uploads..."
sudo docker exec app rails runner "SiteSetting.enable_s3_uploads = true"

log "Disabling Read-Only Mode..."
sudo docker exec app rails runner "SiteSetting.readonly_mode = false; puts 'Readonly mode disabled'"

log "Pulling latest git changes..."
git pull 

log "Rebuilding container..."
./launcher rebuild app 

log "Weekly update complete."

exit 0
「いいね!」 1

こんにちは。

これについて詳しく教えていただけますか?具体的にどのような問題でしょうか?
S3 が有効になっていると、アーカイブが破損することがありますか?

こんにちは、ご質問ありがとうございます!

はい、問題は、バックアップ中に enable_s3_uploads が有効になっていると、生成されたアーカイブが正常に復元できないことが多いということです。正確な技術的な理由は完全には明らかではありませんが(いくつかのスレッドで議論されています)、バックアップ前にS3を無効にしない限り、復元プロセスが頻繁に失敗します。

"enable_s3_uploads restore" で検索すると、Metaで複数のレポートが見つかります。

例えば、このスレッドは典型的な失敗例を示しています。
:link: Trouble restoring backup--SiteSetting::Upload.s3_base_url is failing--because enable_s3_uploads was set in database

そのため、私のスクリプトは、結果がクリーンで復元可能であることを保証するために、バックアップ前に一時的にS3を無効にします。

これで明確になったことを願っています!

「いいね!」 1

データベースのみのバックアップを作成すれば、様々な理由で失敗する可能性のあるS3関連の処理を実行しなくなると思います。