Multisite-Backup unter Verwendung von user discourse anstelle von DB_USER oder Wert aus multisite.yml

EDIT/Tl;dr: ActiveRecord::Base.connection_pool.db_config.configuration_hash hat den Benutzernamen in user und nicht in username, aber Discourse sucht danach unter username.
Trivialer PR: FIX: backup_restore.rb wants db user from user, not username by pfaffman · Pull Request #28229 · discourse/discourse · GitHub

Ich habe eine Multisite-Instanz mit Digital Oceans gehostetem Postgres. Es funktioniert einwandfrei, aber wenn ich versuche, ein Backup zu erstellen, erhalte ich eine Fehlermeldung, dass

[2024-08-05 16:13:31] pg_dump: error: connection to server at "private-forum-cluster-postgresql-prod-do-user-1230.j.db.ondigitalocean.com" (10.11.1.6), port 25060 failed: FATAL:  password authentication failed for user "discourse"

Aber der Benutzer ist nicht discourse. Er verwendet den richtigen Benutzer an anderen Stellen, einschließlich ActiveRecord::Base.connection_pool.db_config.configuration_hash und BackupRestore.database_configuration (wenn ich diese Befehle in RAILS_DB=sitename rails c ausführe). PG_USER ist nicht in der Umgebung gesetzt (soweit ich sehen kann).

Es sieht so aus, als wäre das schuld:

Ich habe es im Container bearbeitet (um es aus DISCOURSE_DB_USER zu ziehen, was damals eine gute Idee schien) und das Backup funktioniert jetzt. Ich weiß nicht, ob man Verbindungsinformationen aus multisite.yml ziehen soll oder nicht, aber das Ignorieren von DB_USER scheint falsch zu sein.
Oder sollte ich den Benutzer einfach discourse nennen, wie es anscheinend alle anderen tun?

EDIT: Moment. Nein.
config['username'] sollte config['user'] sein

    config = ActiveRecord::Base.connection_pool.db_config.configuration_hash

gibt das zurück!


=> {:adapter=>"postgresql",
 :database=>"theDatabase",
 :pool=>25,
 :port=>25060,
 :timeout=>5000,
 :host=>"private-forum-cluster-postgresql-prod-do-user-123-0.j.db.ondigitalocean.com",
 :user=>"theCurrentUsername",
 :password=>"supersecret",
 :host_names=>["forum.example.com"],
 :db_key=>"mydb",
 :prepared_statements=>false}

Also

    config["username"] || username || ENV["USER"] || "postgres",

sollte sein

    config["user"] || username || ENV["USER"] || "postgres",
2 „Gefällt mir“

@pfaffman Ich fürchte, wir mussten das zurücknehmen, da es die Wiederherstellung von Backups in unseren Produktionsumgebungen unterbrochen hat.

Unsere Beispiel-Multisite-Konfiguration (und tatsächlich die Produktionskonfiguration) hat ihn unter ‘username’:

2 „Gefällt mir“

Es tut mir sehr leid! Ich bin immer noch verwirrt, wie es für alles außer dem Backup funktioniert.

Hmm.

Vielleicht ist das mein Problem. Aber wie funktioniert es für alles andere?

Vielleicht verwenden alle anderen die globale Einstellung aus einer Umgebungsvariable.

2 „Gefällt mir“

Es tut mir sehr leid.

Mir ist nicht eingefallen, dass ActiveRecord::Base.connection_pool.db_config.configuration_hash nur der Unsinn war, den ich in die multisite.yml-Datei geschrieben habe.

Ich habe alle meine fehlerhaften user:-Felder in username: umbenannt und jetzt funktioniert mein Backup.

Meine Erklärung (die ich nicht getestet habe) ist, dass der Rest von Rails den db_username von GlobalSettings überschreibt, wenn er dort gesetzt ist, aber wenn er diese Informationen abruft, um den externen Aufruf an pg_dump zu machen, zieht er ihn aus der multisite-Konfiguration.

Ich halte es immer noch für einen Fehler, dass das Backup einen anderen Benutzer erhält und dass die Lösung darin bestünde, env['DISCOURSE_DB_USERNAME'] irgendwo in diese Zuweisung aufzunehmen, aber ich bin nicht bereit, die Produktion erneut zu riskieren, und jetzt funktioniert es.

Sie sollten meinen Beitrag nicht mehr mögen und mir meine Auszeichnung entziehen! :crying_cat_face:

2 „Gefällt mir“

Keine Sorge, so etwas passiert. Idealerweise wäre das in der CI aufgefallen, aber ich schätze, wir haben keine Abdeckung für diese Logik (vielleicht schwierig, da das DB-Setup in Tests sowieso ganz anders ist).

Danke, dass Sie dokumentiert haben, was Sie gefunden haben – ich bin sicher, es wird anderen in Zukunft helfen. Ich stimme zu, dass die Inkonsistenz hier schlecht ist und irgendwann behoben werden sollte.

3 „Gefällt mir“