3.0.2へのアップグレード:NameError:未定義のメソッド `call' for class `Redis::Client' ("修正"付き)

3.0.1 から 3.0.2 へのアップグレードを試みたところ、rake db:migrate の段階で次のエラーが発生しました。

rake aborted!
NameError: undefined method `call' for class `Redis::Client'
Did you mean?  caller
/var/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/mini_profiler/profiling_methods.rb:83:in `alias_method'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/mini_profiler/profiling_methods.rb:83:in `profile_method'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-3.0.0/lib/mini_profiler/profiling_methods.rb:65:in `counter_method'
/var/discourse/config/initializers/006-mini_profiler.rb:90:in `<main>'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/engine.rb:667:in `load'

非常に長い話になりますが、Gemfile で redis のバージョンを指定しないままにしておく代わりに、redis をバージョン 4.8.0 に固定したところ、問題が解決しました。つまり、Gemfile は次のようになります。

-gem "redis"
+gem "redis", "4.8.0"

この件についてはあまり詳しくないのですが、私の最後のアップグレード(3.0.1)以降、どこかで redis がアップグレードされたことによる意図しない副作用であるように思われます。そのため、Discourse 3.0.1 を再インストールしても同じ問題が発生する可能性があります。

誰かの役に立てば幸いです。このままにしておくと、私のシステムが脆弱な状態になる可能性があるかどうか、教えていただけると幸いです :slight_smile:

「いいね!」 1

Gemfile.lock ファイルで gem のバージョンを設定しており、すでに同じバージョンに設定されています。

はい!GemfileやGemfile.lockについて聞いたことがなかったので、不思議ですね。しかし、(ため息) 20個のフォーラムでインストールを繰り返した結果、Gemfile.lockを削除することを推奨された別の問題から始まったことがわかりました。

Bundler は Ruby のバージョンに関して競合する要件を見つけました。
  Gemfile では:
    actionmailer (= 7.0.4.3) は 7.0.4.3 に解決されましたが、これは
      Ruby (>= 2.7.0) に依存しています。

    sassc-rails は 2.1.2 に解決されましたが、これは
      sprockets-rails は 3.4.2 に解決されましたが、これは
        Ruby (>= 2.5) に依存しています。

    json は 2.6.3 に解決されましたが、これは
      Ruby (>= 2.3) に依存しています。

    :
    :
    :
    json_schemer は 0.2.23 に解決されましたが、これは
      ecma-re-validator (~> 0.3) は 0.4.0 に解決されましたが、これは
        Ruby (>= 2.6, < 4.0) に依存しています。

    rspec は 3.12.0 に解決されましたが、これは
      rspec-expectations (~> 3.12.0) は 3.12.2 に解決されましたが、これは
        diff-lcs (>= 1.2.0, < 2.0) は 1.5.0 に解決されましたが、これは
          Ruby (>= 1.8) に依存しています。

    web-push は 3.0.0 に解決されましたが、これは
      Ruby (>= 3.0) に依存しています。

  現在の Ruby バージョン:
    Ruby (= 2.7.6)

Bundler は gem "hkdf" の互換性のあるバージョンを見つけることができませんでした。
  スナップショット (Gemfile.lock) では:
    hkdf (= 1.0.0)

  Gemfile では:
    web-push は 1.0.0 に解決されましたが、これは
      hkdf (~> 0.2) に依存しています。

Gemfile.lock ファイルを削除して `bundle install` を実行すると、スナップショットが最初から再構築され、Gemfile の gem のみが使用されるため、競合が解決される可能性があります。

そのため、提案されたようにロックファイルを削除して最初のエラーを回避し、その後、以前に説明した NameError: undefined method ‘call’ に遭遇しました。redis のバージョンを固定することで修正しました。その後、すべてが機能しました。

したがって、私のスクリプトは a) Gemfile.lock を削除し (上記の引用されたエラーのため)、b) Gemfile を自動的に変更して redis を 4.8.0 に固定するように変更されました。うまくいった…と思った。これは 20 台の「同一」マシンのうち 3 台で機能しました!残りは次の新しいエラーが発生しました。

[discourse@in3020-discourse discourse]$ cd $INSTA; RAILS_ENV=production /usr/local/bin/bundle exec rake db:migrate # データベースに多くのものを詰め込む
rake aborted!
NoMethodError: Sidekiq:Module に対する未定義のメソッド `logger='
  Did you mean?  logger
/var/discourse/config/initializers/100-sidekiq.rb:58:in `<main>'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/engine.rb:667:in `load'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/engine.rb:667:in `block in load_config_initializer'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.4.3/lib/active_support/notifications.rb:208:in `instrument'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/engine.rb:666:in `load_config_initializer'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/engine.rb:620:in `block (2 levels) in <class:Engine>'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/engine.rb:619:in `each'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/engine.rb:619:in `block in <class:Engine>'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/initializable.rb:32:in `instance_exec'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/initializable.rb:32:in `run'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/initializable.rb:61:in `block in run_initializers'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/initializable.rb:50:in `each'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/initializable.rb:50:in `tsort_each_child'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/initializable.rb:60:in `run_initializers'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/application.rb:372:in `initialize!'
/var/discourse/config/environment.rb:7:in `<main>'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.16.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.16.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/zeitwerk-2.6.7/lib/zeitwerk/kernel.rb:38:in `require'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/application.rb:348:in `require_environment!'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.4.3/lib/rails/application.rb:511:in `block in run_tasks_blocks'
/var/discourse/vendor/bundle/ruby/2.7.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/cli/exec.rb:58:in `load'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/cli/exec.rb:58:in `kernel_load'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/cli.rb:486:in `exec'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/cli.rb:31:in `dispatch'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/cli.rb:25:in `start'
/usr/local/share/gems/gems/bundler-2.3.26/exe/bundle:48:in `block in <top (required)>'
/usr/local/share/gems/gems/bundler-2.3.26/lib/bundler/friendly_errors.rb:120:in `with_friendly_errors'
/usr/local/share/gems/gems/bundler-2.3.26/exe/bundle:36:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => db:migrate => db:load_config => environment
(See full trace by running task with --trace)

これは本当に奇妙でした。なぜなら、機能したマシンと失敗したマシンの両方で、/var/discourse/config/initializers/100-sidekiq.rb ファイルは同一であり、‘logger=’ ではなく ‘logger = …’ というステートメントが含まれていたからです。

最終的に、機能したマシンでは /usr/local/bin/bundle のバージョンが 2.3.26 ではなく 2.3.20 であったことを突き止めました。したがって、要約すると、discourse の bundler インストール にこれを追加すると、私にとってはうまくいきました (bundler インストール後に bundler を 2.3.20 に固定するコマンドを実行するだけでは十分ではなく、それより前に実行する必要がありました)。

rm Gemfile.lock
perl -pi.bak -e 's/gem \"redis\"/gem \"redis\",\"4.8.0\"/;' Gemfile

/usr/bin/gem uninstall bundler -v 2.3.26
/usr/bin/gem install bundler -v 2.3.20
RAILS_ENV=production /usr/local/bin/bundle install
RAILS_ENV=production /usr/local/bin/bundle exec rake db:migrate
RAILS_ENV=production /usr/local/bin/bundle exec rake assets:precompile

なぜそれらのマシンのいくつかに bundler 2.3.26 があり、他のものには 2.3.20 があったのかは全くわかりません… しかし、おそらくあなたのせいではありません :laughing:

だから安定版を使っているのです:laughing:

Ruby 2.7 は EOL(サポート終了)であり、弊社ではサポートしておりません。標準のインストールガイドに従って Discourse をインストールしても、しばらくの間はこのバージョンは取得できません。カスタムインストールであると推測しますが、いかがでしょうか?

Discourse スタックに精通している方であっても、公式のサポートされているインストールガイドに従うことをお勧めします。これは、技術に不慣れな方にとってはさらに重要です。

はい、公式の方法で行えば、ほとんど間違いなく頭痛の種は減ったでしょう(おそらくゼロだったでしょう)。問題は、ITセキュリティ部門によって事前に承認されていないDockerイメージの使用が許可されていないことです。そして、あなたのイメージは承認されていません。

そのため、これはRHEL8マシンへのカスタムネイティブインストールであり、動作させるためにはSELinuxの工夫も必要でした。

同じ問題を抱えている人が他にいるかもしれません。私のインストール手順をトピックとして投稿すると、彼らに役立つかもしれません。もしよろしければ、遠慮なく反対意見を述べてください。これは、厳密には必要ない場合でも、このようにインストールすることを「奨励」していると受け取られる可能性があり、あなたへの質問が増える可能性があることがわかります。

ちなみに、SELinuxの問題の解決策をGoogleで検索すると、最も頻繁に見つかるアドバイスは「無効にする方法」です(笑)。しかし、ここではそれは選択肢ではありません。

ご協力ありがとうございました!

コンテキストをありがとうございます。ここではカスタムインストールの無料サポートは提供していないことにご注意ください。

このインストールでは、Discourse の現在のバージョンと互換性のない Ruby のバージョンが使用されており、注意深く管理されている gem のバージョンを尊重しておらず、手動で管理されている OS レベルの共有ライブラリをすべて使用していません。したがって、問題が発生するかどうかではなく、いつ発生するかの問題です。

「いいね!」 3

セキュリティチームに、開発者が使用し、審査済みのイメージは、唯一の仕事でもない限り、把握できないものにセキュリティパッチを適用しようとするよりもはるかに安全であると提案することもできます。

…しかし、それはおそらく役に立たないでしょう。

はは、はい(おそらく画像の方が安全でしょう)そしていいえ(役に立ちませんが、コメントありがとうございます😊)。

これは確かに私の本業ではありません。私はパイロットプログラムとして、これらのフォーラムを「私ができるから」運営しているだけなので、IT部門に採用してもらい、オスロ大学全体で運営してもらうことができます。

幸いなことに、それはうまくいったようですので、このショーを運営しなければならないのは今学期が最後になることを願っています。IT部門は画像を使用するでしょうね… :wink:

そして、@Falcoさん、Rubyのバージョンに不一致があることを指摘してくれてありがとう。将来のアップデートで問題が発生した場合に確認します。

「いいね!」 1

信じられない!米国のいくつかの大学で教員を務めた経験から、非常に感銘を受けています。

「いいね!」 1

おっと、ずっと前に返信ボタンを押すのを忘れていました…

@pfaffman はは、はい。まだ完全に安心できるわけではありません。IT部門が承認しても、公式なコミュニケーションチャネルとして最初に(大学理事会によって)トップで承認される必要があります。幸いなことに、自然科学部は全面的に協力してくれており、彼らがこの件を推進してくれています。

これらのパイロットインスタンスを実行できたことを非常に誇りに思っています。セキュリティポリシーの範囲内で、IT部門以外の人間でこれほどできる人は多くないでしょう。(私は理論天体物理学研究所に所属しています)彼らは一貫してこれを「アストロ・ディスコース」と呼んでいます :laughing:

しかし今… この状況で、さらに1学期は続行しなければならないようです。現在のDiscourseリリースは、どのpgsqlバージョンと互換性がありますか?