Upgrade auf 3.0.2: NameError: undefinierte Methode `call' für Klasse `Redis::Client' (mit einem "Fix")

Ich habe gerade versucht, von 3.0.1 auf 3.0.2 zu aktualisieren, und während der rake db:migrate-Phase diesen Fehler erhalten:

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'

Kurz gesagt, ich habe festgestellt, dass das Festlegen der Redis-Version auf 4.8.0 anstelle des Nicht-Spezifizierens der Redis-Version in der Gemfile das Problem behoben hat. D. h. für die Gemfile:

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

Ich fühle mich nicht sehr wohl dabei, hier herumzuspielen, aber es scheint mir, dass dies ein unbeabsichtigter Nebeneffekt der Aktualisierung von Redis an anderer Stelle seit meiner letzten Aktualisierung (auf 3.0.1) ist und dass eine Neuinstallation von Discourse 3.0.1 jetzt das gleiche Problem zeigen würde.

Ich hoffe, das hilft jemandem, und bitte lassen Sie mich wissen, ob mein System dadurch in einem unsicheren Zustand ist :slight_smile:

1 „Gefällt mir“

Wir legen Gem-Versionen in der Gemfile.lock-Datei fest, und sie ist bereits auf dieselbe Version eingestellt

Ziemlich! Seltsam, da ich vorher noch nie von Gemfile oder Gemfile.lock gehört hatte. Aber da ich 20 andere Foren habe, auf denen ich die Installation wiederholen muss (seufz), stellt sich heraus, dass die ganze Sache mit einem anderen Problem während der Installation begann, bei dem die Beschwerden mit der Empfehlung endeten, das Gemfile.lock zu löschen:

Bundler fand widersprüchliche Anforderungen für die Ruby-Version:
  In Gemfile:
    actionmailer (= 7.0.4.3) wurde zu 7.0.4.3 aufgelöst, was davon abhängt
      Ruby (>= 2.7.0)

    sassc-rails wurde zu 2.1.2 aufgelöst, was davon abhängt
      sprockets-rails wurde zu 3.4.2 aufgelöst, was davon abhängt
        Ruby (>= 2.5)

    json wurde zu 2.6.3 aufgelöst, was davon abhängt
      Ruby (>= 2.3)

:
:
:
    json_schemer wurde zu 0.2.23 aufgelöst, was davon abhängt
      ecma-re-validator (~> 0.3) wurde zu 0.4.0 aufgelöst, was davon abhängt
        Ruby (>= 2.6, < 4.0)

    rspec wurde zu 3.12.0 aufgelöst, was davon abhängt
      rspec-expectations (~> 3.12.0) wurde zu 3.12.2 aufgelöst, was davon abhängt
        diff-lcs (>= 1.2.0, < 2.0) wurde zu 1.5.0 aufgelöst, was davon abhängt
          Ruby (>= 1.8)

    web-push wurde zu 3.0.0 aufgelöst, was davon abhängt
      Ruby (>= 3.0)

  Aktuelle Ruby-Version:
    Ruby (= 2.7.6)

Bundler konnte keine kompatiblen Versionen für Gem "hkdf" finden:
  In Snapshot (Gemfile.lock):
    hkdf (= 1.0.0)

  In Gemfile:
    web-push wurde zu 1.0.0 aufgelöst, was davon abhängt
      hkdf (~> 0.2)

Das Löschen Ihrer Gemfile.lock-Datei und die Ausführung von `bundle install` wird Ihren
Snapshot von Grund auf neu erstellen, nur mit
den Gems in Ihrer Gemfile, was den Konflikt beheben kann.

Nachdem ich diesen anfänglichen Fehler behoben hatte, indem ich die Lock-Datei wie vorgeschlagen entfernt hatte, stieß ich auf den NameError: undefined method ‘call’, der zuvor beschrieben wurde. Dies wurde behoben, indem die Redis-Version festgelegt wurde. Dann funktionierte alles.

Mein Skript wurde also modifiziert, um a) Gemfile.lock zu entfernen (wegen des oben zitierten Fehlers) und b) automatisch die Gemfile zu ändern, um Redis auf 4.8.0 festzulegen. Alles paletti… dachte ich. Das funktionierte auf drei der 20 “identischen” Maschinen! Die anderen zeigten diesen neuen Fehler:

[discourse@in3020-discourse discourse]$ cd $INSTA; RAILS_ENV=production /usr/local/bin/bundle exec rake db:migrate # stuffing a lot of stuff into the database
rake aborted!
NoMethodError: undefined method `logger=' for Sidekiq:Module
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)

Was wirklich, wirklich seltsam war, denn die Dateien /var/discourse/config/initializers/100-sidekiq.rb waren auf allen Maschinen identisch und enthielten sicherlich nicht ‘logger=’, sondern eine ‘logger = …’-Anweisung.

Ich fand schließlich heraus, dass auf den Maschinen, auf denen es funktionierte, /usr/local/bin/bundle Version 2.3.20 war und nicht 2.3.26 wie auf den Maschinen, auf denen es fehlschlug. Zusammenfassend lässt sich sagen, dass das Hinzufügen von Folgendem vor dem Installationsbefehl für Discourse den Trick für mich gemacht hat (es reichte nicht aus, die Bundler-Festlegung auf 2.3.20 nach der Bundler-Installation von Discourse vorzunehmen, es musste vorher geschehen):

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

Warum auf einigen dieser Maschinen bundler 2.3.26 und auf anderen 2.3.20 war, weiß ich nicht… aber es ist wahrscheinlich nicht Ihre Schuld :laughing:.

Und deshalb benutze ich die stabile Version :laughing:

Ruby 2.7 ist EOL und wird von uns nicht mehr unterstützt. Sie erhalten diese Version nicht mehr, wenn Sie Discourse gemäß der Standardinstallationsanleitung installieren. Daher gehe ich davon aus, dass es sich um eine benutzerdefinierte Installation handelt?

Ich empfehle, sich auch für Personen, die mit dem Discourse-Stack vertraut sind, an die unterstützte offizielle Installationsanleitung zu halten, und das ist für Personen, die mit den verwendeten Technologien nicht vertraut sind, noch wichtiger.

Ja, auf dem offiziellen Weg hätte ich mir mit ziemlicher Sicherheit weniger Kopfzerbrechen bereitet (höchstwahrscheinlich gar keine). Das Problem ist, dass ich keine Docker-Images verwenden darf, die nicht von unserer IT-Sicherheitsabteilung vorab genehmigt wurden – und Ihres gehört nicht dazu.

Daher handelt es sich tatsächlich um eine benutzerdefinierte, native Installation auf RHEL8-Maschinen, die auch einige SELinux-Tricks erforderte, um zu funktionieren.

Vielleicht gibt es andere mit demselben Problem – vielleicht wäre es für sie nützlich, wenn ich ein Thema mit meiner Installationsprozedur poste? Fühlen Sie sich frei zu protestieren – ich kann verstehen, dass dies als „Ermutigung“ angesehen werden könnte, es auf diese Weise zu installieren, auch wenn es nicht unbedingt notwendig ist, was zu mehr Fragen für Sie führen könnte.

Nebenbei bemerkt, wenn man bei Google nach Lösungen für SELinux-Probleme sucht, ist der häufigste Ratschlag, den man findet: „So deaktivieren Sie es“ :laughing:. Aber das ist hier keine Option.

Vielen Dank für Ihre Hilfe!

Danke für den Kontext. Beachten Sie, dass wir hier keinen kostenlosen Support für benutzerdefinierte Installationen anbieten.

Diese Installation verwendet bereits eine Ruby-Version, die nicht mit den aktuellen Versionen von Discourse funktioniert, keine der sorgfältig verwalteten Gem-Versionen berücksichtigt und nicht alle manuell verwalteten, gemeinsam genutzten Betriebssystembibliotheken verwendet, die wir ausliefern. Daher ist ein Bruch keine Frage des Ob, sondern eher des Wann.

3 „Gefällt mir“

Sie könnten Ihrem Sicherheitsteam vorschlagen, dass ein Image, das von den Entwicklern geprüft und verwendet wird, viel, viel sicherer ist, als wenn Sie versuchen, Sicherheitspatches auf Dinge anzuwenden, die Sie nicht im Griff haben können, es sei denn, es ist Ihre einzige Aufgabe.

. . . . Aber das ist wahrscheinlich nicht hilfreich.

Haha, ja (wahrscheinlich sicherer mit deinen Bildern) und nein (nicht hilfreich - aber danke für den Kommentar trotzdem😊).

Das ist tatsächlich nicht mein Hauptberuf, ich betreibe diese Foren nur „weil ich derjenige war, der es tun konnte“ als Pilotprojekt, damit wir unsere IT-Abteilung davon überzeugen können, es für die gesamte Universität Oslo zu übernehmen und zu betreiben.

Glücklicherweise scheint das funktioniert zu haben, also hoffe ich, dass dies das letzte Semester ist, in dem ich die Leitung habe. Ich wette, die IT-Abteilung wird die Bilder verwenden… :wink:

Und danke, @Falco, dass du darauf hingewiesen hast, dass es eine Ruby-Versionsinkongruenz gibt. Ich werde sie mir ansehen, wenn/falls ich bei zukünftigen Updates auf Probleme stoße.

1 „Gefällt mir“

Heilige Kuh! Nachdem ich an mehreren Universitäten in den USA als Fakultätsmitglied tätig war, bin ich ziemlich beeindruckt.

1 „Gefällt mir“

Ups, habe vergessen, vor langer Zeit auf die Antwort-Schaltfläche zu klicken…

@pfaffman Haha, ja. Wir sind noch nicht zu 100 % aus dem Schneider, auch wenn die IT grünes Licht gibt: Es muss erst noch ganz oben (vom Universitätsrat) als offizieller Kommunikationskanal genehmigt werden. Glücklicherweise haben wir die Naturwissenschaftliche Fakultät mit ins Boot geholt, und sie treibt es durch die Instanzen.

Ich bin ziemlich stolz darauf, diese Pilotinstanzen betreiben zu können – nicht viele Leute außerhalb der IT-Abteilung hätten das gekonnt (im Rahmen der erforderlichen Sicherheitsrichtlinien). Die Leute von den Naturwissenschaften bezeichnen es durchweg als „Astro-Discourse“ (ich bin am Institut für Theoretische Astrophysik) :laughing:.

Aber jetzt… scheint es, dass ich diese Show noch ein Semester lang leiten muss, mit demselben nicht standardmäßigen Setup. Ich frage mich, mit welcher(n) pgsql-Version(en) die aktuelle Discourse-Version kompatibel ist?