復元失敗 - S3(互換)バックアップ

バックアップの復元を試みているのですが、エラーが発生します。どうやら S3 バックアップに関連しているようです。

重要な点として、これは S3 互換サービス(Scaleway)を使用しています。ただし、このエラーが互換サービス固有のものかどうかは不明です。設定は非常にスムーズに進み、現在も正常に動作しています。もし Scaleway 固有の問題であれば、AWS S3 のみが公式にサポートされていることを理解しているため、おそらく同社のサービスを利用するのはやめるでしょう。

設定にはこのガイドを使用しました:Configure an S3 compatible object storage provider for uploads app.yml ファイル内にあります。

  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets

Scaleway でも app.yml ファイルに同じ設定を使用しました(管理者設定で設定する必要はないように思えたため設定しませんでした):scaleway 設定

現在のサーバーの管理者エリアとコマンドラインの両方から試み、また新しいサーバーを設定(app.yml をコピー)してコマンドライン経由で復元を試みました。いずれの場合も同じエラーが発生しました。

[STARTED]
'system' が復元を開始しました!
復元を「実行中」としてマーク中...
/var/www/discourse/tmp/restores/default/2020-07-16-131434 の存在を確認中...
アーカイブを tmp ディレクトリにダウンロード中...
#<Thread:0x000055c73a831df8@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:116 run> が例外で終了しました(report_on_exception は true):
Traceback (most recent call last):
	1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 levels) in thread_batches'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write': undefined method `split' for nil:NilClass (NoMethodError)
例外:undefined method `split' for nil:NilClass
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 levels) in thread_batches'
ロールバックを試みています...
ロールバックの必要はありませんでした
後片付け中...
tmp '/var/www/discourse/tmp/restores/default/2020-07-16-131434' ディレクトリを削除中...
sidekiq の一時停止を解除中...
復元を「完了」としてマーク中...
復元の終了を 'system' に通知中...
#<Thread:0x000055c73a831510@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:116 run> が例外で終了しました(report_on_exception は true):
Traceback (most recent call last):
	1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 levels) in thread_batches'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write': undefined method `split' for nil:NilClass (NoMethodError)
#<Thread:0x000055c73a8316c8@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:116 run> が例外で終了しました(report_on_exception は true):
Traceback (most recent call last):
	1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 levels) in thread_batches'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write': undefined method `split' for nil:NilClass (NoMethodError)
#<Thread:0x000055c73a8319e8@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:116 run> が例外で終了しました(report_on_exception は true):
Traceback (most recent call last):
	1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:120:in `block (3 levels) in thread_batches'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/aws-sdk-s3-1.66.0/lib/aws-sdk-s3/file_downloader.rb:128:in `write': undefined method `split' for nil:NilClass (NoMethodError)
完了!
[FAILED]
復元が完了しました。

もしかすると、このエラーはバックアップのダウンロード時のものだけかもしれません?:face_with_monocle:

「いいね!」 1

そのようですね。

app.yml でバックアップの保存場所をローカルに変更し、再構築してからバックアップファイルを手動でダウンロードし、コンソールからリストアすることをお勧めします。

「いいね!」 3

あ、なるほど。ありがとう、@Falco:slight_smile:

朝に試して、また報告するね〜

「いいね!」 2

@Falco さん、ありがとうございます!完全にスムーズに動作しました :smiley:

新しいサーバーに移行しましたが、同じサーバーに残っていたとしても問題なかったようです。

後で他の誰かが参照したい場合に備えて、より詳細な手順を以下に記します(私の S3 設定は、こちら に指定されている通り app.yml ファイル内にあり、管理者設定でカスタマイズしたものは何もありませんでした):

  1. ソースサイトにおいて、ロールバックでない場合は「メール送信の無効化」を有効にし(必須ではない可能性あり)、読み取り専用モードをオンにします(移行完了後に新しいインスタンスでこれらを元に戻すことを忘れないでください)。バックアップを作成し、完了したら古いインスタンスも停止することを検討してください(./launcher stop app)。ロールバックの有無にかかわらず、DNS の A レコードを更新して新しいサーバーの IP を指すようにします。ダウンタイムを最小限に抑えるために、よりエレガントな方法や順序で行うこともできますが、私のケースではダウンタイムは問題になりませんでした(ロールバックであり、まだフォーラムは公開していません)。

  2. 新しいサーバーに Discourse をインストールし、S3 設定を含む app.yml のすべてのカスタム設定を移行します。Discourse のバージョンは同じか、できるだけ近いものにしてください。

  3. 以下の 2 つのレコードをコメントアウトします(app.yml の他の S3 設定はそのままで構いません):
    DISCOURSE_S3_BACKUP_BUCKET: BucketName
    DISCOURSE_BACKUP_LOCATION: s3

  4. S3 または S3 互換サービスから必要なバックアップを手動でダウンロードします。

  5. /var/discourse/shared/standalone/backups に移動し、‘default’ という名前の新しいフォルダを作成します(存在しない場合、新規インストールでは作成されません)。その後、backups ディレクトリ内で以下を実行します(これは、このフォルダのパーミッションを、Discourse がローカルバックアップを作成した場合の通常の設定に合わせるためのものです。必須かどうかはわかりません):
    chown -R 1000:www-data default

  6. SFTP クライアントを使用してバックアップを backups/default フォルダにアップロードします。バックアップファイルの名前を変更しないでください。

  7. アプリを再構築します:
    cd /var/discourse
    ./launcher rebuild app

  8. アプリに入り、バックアップを有効にして復元します(BackupFileName.tar.gz をリネーム):

./launcher enter app
discourse enable_restore
discourse restore BackupFileName.tar.gz
  1. 完了したら、ステップ 2 の app.yml から 2 つの S3 バックアップファイル行のコメントアウトを解除し、アプリを再構築します。

  2. ローカルの backups/default フォルダと含まれるバックアップ(/var/discourse/shared/standalone/backups)を削除できます。

参考:

「いいね!」 4

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.