Migrate_from_s3: そのタスクを実行する前にS3アップロードを無効にする必要があります

S3 からすべてのデータをサーバーに戻す移行を試みています。しかし、rake uploads:migrate_from_s3 を実行すると「そのタスクを実行する前に S3 アップロードを無効化する必要があります」というエラーが返されます。そこで、Discourse の設定で enable s3 uploads オプションのチェックを外し、app.yml ファイルに DISCOURSE_USE_S3: false を追加しました。しかし、依然として同じエラーが発生します。

[1] pry(main)> SiteSetting.enable_s3_uploads
=> false
[2] pry(main)> GlobalSetting.use_s3
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> true

混乱しています。どのようにして無効化すればよいでしょうか?

「いいね!」 1

app.yml に S3 環境変数が含まれていますか?S3 アップロードを無効にするには、それらを確認する必要があります。

S3 環境変数とは何ですか?私の場合、DISCOURSE_USE_S3 は env の下に保持されています。

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  UNICORN_WORKERS: 2

  ## TODO: この Discourse インスタンスが応答するドメイン名
  DISCOURSE_HOSTNAME: engineersasylum.com

  ## 上記で指定したホスト名(-h オプション)と同じホスト名で
  ## コンテナを起動したい場合はコメントアウトを解除してください(デフォルトは「$hostname-$config」)
  #DOCKER_USE_HOSTNAME: true

  ## TODO: 初期サインアップ時に管理者および開発者として設定されるメールアドレスのリスト(例:'user1@example.com,user2@example.com')
  DISCOURSE_DEVELOPER_EMAILS: 'praveen369gen@gmail.com'

  # S3 設定
  DISCOURSE_USE_S3: false
  DISCOURSE_S3_REGION: ap-south-1
  DISCOURSE_S3_ACCESS_KEY_ID: AKxxxxxxxxxxxxxxxxxxxxxDQ
  DISCOURSE_S3_SECRET_ACCESS_KEY: QWVxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxLigGs
  DISCOURSE_S3_BUCKET: enginxxxxxxxxxxket
  DISCOURSE_S3_BACKUP_BUCKET: enginxxxxxxxxxxxxcket
  DISCOURSE_BACKUP_LOCATION: s3
「いいね!」 1

……そして、@Pravi さん、yml ファイルの大部分の変数を変更した後は、コンテナ(アプリ)を再ビルドすることを忘れないでください。コンテナを停止して起動するだけで変更が反映される場合もありますが、迷った場合は、yml を変更した後にコンテナ(アプリ)を再ビルドしてください。

app.yml ファイルの変更のたびにコンテナを再構築しています。それでも無効のままです。

バックアップの保存場所をローカルに変更してみてください。
効果があるかはわかりませんが、これが最善の策だと思います。

バックアップ場所に local を追加し、コンテナを再構築して移行を試みましたが、依然として成功しませんでした。エラーメッセージとして「そのタスクを実行する前に S3 アップロードを無効にする必要があります」と表示されます。

申し訳ありませんが、この原因が何なのか分かりません。

DISCOURSE_USE_S3=false を yml に設定して再ビルドし、rake タスクを実行しても「S3 アップロードを無効にする必要があります」と表示されますか?管理パネルにも移動して、そこで S3 も無効にしましたか?

現時点での出力は以下の通りです:

SiteSetting.Upload.enable_s3_uploads
SiteSetting.enable_s3_uploads
GlobalSetting.use_s3?

GlobalSetting.use_s3? のロジックは環境変数を同じように使用していません。以下のように実装されています:

  def self.use_s3?
    (@use_s3 ||=
      begin
        s3_bucket &&
        s3_region && (
          s3_use_iam_profile || (s3_access_key_id && s3_secret_access_key)
        ) ? :true : :false
      end) == :true
  end

これが混乱を招く可能性があることは理解できます。誰かに確認してもらいます。

当面は、環境変数から DISCOURSE_USE_S3DISCOURSE_S3_BUCKET の設定を解除することで、S3 からの移行が可能になります。

「いいね!」 2

これは私が得た結果です。

[1] pry(main)> SiteSetting.Upload.enable_s3_uploads
=> true
[2] pry(main)> SiteSetting.enable_s3_uploads
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> true
[4] pry(main)>

はい、app.yml に DISCOURSE_USE_S3=false を追加し、コンテナを再構築してから rake タスクを実行しましたが、同じ出力が表示されます。はい、管理画面でアップロードを無効にしました。

ここで述べられている通り、yml ファイル内でも DISCOURSE_S3_BUCKET を未設定にする必要があります。おそらく、その行の先頭に # を追加するだけで済むでしょう。

現在、コンテナを再構築中です。数分後に結果をお知らせします。

環境変数を false に設定して再構築したのに、最後のものが true になる理由がわかりません。SiteSetting の値は管理パネルから、GlobalSettings は app.yml 経由で設定されます。

管理パネルの SiteSetting が無効になっています。

s3

S3 設定

  #DISCOURSE_USE_S3: false
  DISCOURSE_S3_REGION: ap-south-1
  DISCOURSE_S3_ACCESS_KEY_ID: AKXXXXXXXXXXXXXXXDQ
  DISCOURSE_S3_SECRET_ACCESS_KEY: AvsvsxxxxxxxxxxxxxxxxvcccccccLigGs
  #DISCOURSE_S3_BUCKET: engineers-leakybucket
  DISCOURSE_S3_BACKUP_BUCKET: engineers-backupbucket
  DISCOURSE_BACKUP_LOCATION: s3
  #DISCOURSE_S3_CDN_URL: https://engineers-leakybucket.s3.dualstack.ap-south-1.amazonaws.com

DISCOURSE_USE_S3DISCOURSE_S3_BUCKET の設定を解除すると、以下のエラーが発生します。

root@ip-172-31-7-247-app:/var/www/discourse# rake uploads:migrate_from_s3
Migrating uploads from S3 to local storage for 'default'...
rake aborted!
NoMethodError: undefined method `downcase' for nil:NilClass
/var/www/discourse/app/models/global_setting.rb:107:in `s3_bucket_name'
/var/www/discourse/app/models/site_setting.rb:157:in `absolute_base_url'
/var/www/discourse/lib/tasks/uploads.rake:138:in `migrate_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:118:in `block in migrate_all_from_s3'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:68:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:78:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:118:in `migrate_all_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:93:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_from_s3
(See full trace by running task with --trace)

更新:

DISCOURSE_USE_S3DISCOURSE_S3_BUCKET の設定を解除する前

[1] pry(main)> SiteSetting.Upload.enable_s3_uploads
=> true
[2] pry(main)> SiteSetting.enable_s3_uploads
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> true
[4] pry(main)> 

DISCOURSE_USE_S3DISCOURSE_S3_BUCKET の設定を解除した後

[1] pry(main)> SiteSetting.Upload.enable_s3_uploads
=> false
[2] pry(main)> SiteSetting.enable_s3_uploads
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> false
[4] pry(main)>
「いいね!」 1

@Pravi さん、こんにちは

はい、今まさにそう提案しようとしていました。これらすべての ENV 設定をコメントアウトして、以下を試してみてください。

DISCOURSE_USE_S3: false
#DISCOURSE_S3_REGION: ap-south-1
#DISCOURSE_S3_ACCESS_KEY_ID: AKXXXXXXXXXXXXXXXDQ
#DISCOURSE_S3_SECRET_ACCESS_KEY: AvsvsxxxxxxxxxxxxxxxxvcccccccLigGs
##DISCOURSE_S3_BUCKET: engineers-leakybucket
#DISCOURSE_S3_BACKUP_BUCKET: engineers-backupbucket
#DISCOURSE_BACKUP_LOCATION: s3
#DISCOURSE_S3_CDN_URL: https://engineers-leakybucket.s3.dualstack.ap-south-1.amazonaws.com 

その後、あなたの最新アップデート(詳細をありがとうございます)を読みましたが、どうやら進展しているようです。

進展を遂げられたことをおめでとうございます。素晴らしいですね!

私も試しました。DISCOURSE_USE_S3: false 以外をすべてコメントアウトしましたが、以前と同じエラーが表示されます。

root@ip-172-31-7-247-app:/var/www/discourse# rake uploads:migrate_from_s3
Migrating uploads from S3 to local storage for 'default'...
rake aborted!
NoMethodError: undefined method `downcase' for nil:NilClass
/var/www/discourse/app/models/global_setting.rb:107:in `s3_bucket_name'
/var/www/discourse/app/models/site_setting.rb:157:in `absolute_base_url'
/var/www/discourse/lib/tasks/uploads.rake:138:in `migrate_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:118:in `block in migrate_all_from_s3'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:68:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:78:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:118:in `migrate_all_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:93:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_from_s3
(See full trace by running task with --trace)

SiteSetting と GlobalSettings は無効化されています。

root@ip-172-31-7-247-app:/var/www/discourse# rails c
[1] pry(main)> SiteSetting.Upload.enable_s3_uploads
=> false
[2] pry(main)> SiteSetting.enable_s3_uploads
=> false
[3] pry(main)> GlobalSetting.use_s3?
=> false
[4] pry(main)> 

ありがとうございます。しかし、進展したかどうかはわかりません。今度はこの新しいエラーに対処する必要があります。

この問題を解決する方法をご存知の方はいらっしゃいますか?