MODIFICA/Tl;dr: ActiveRecord::Base.connection_pool.db_config.configuration_hash ha il nome utente in user, non username, ma Discourse lo cerca in username.
PR banale: FIX: backup_restore.rb wants db user from user, not username by pfaffman · Pull Request #28229 · discourse/discourse · GitHub
…
Ho un’istanza multisito che utilizza postgres ospitato da Digital Ocean. Funziona bene ma quando provo a fare un backup, ricevo un errore che
[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"
Ma l’utente non è discourse. Sta usando l’utente corretto altrove, inclusi ActiveRecord::Base.connection_pool.db_config.configuration_hash e BackupRestore.database_configuration (quando eseguo quei comandi in RAILS_DB=sitename rails c). PG_USER non è impostato nell’ambiente (per quanto posso vedere).
Sembra che questo sia il colpevole:
L’ho modificato nel container (per estrarlo da DISCOURSE_DB_USER, che sembrava una buona idea al momento) e il backup ora funziona. Non so se si suppone che si possano estrarre le informazioni di connessione da multisite.yml o meno, ma ignorare DB_USER sembra sbagliato.
O forse dovrei semplicemente rendere l’utente discourse come immagino facciano tutti gli altri?
MODIFICA: Aspetta. No.
config['username'] dovrebbe essere config['user']
config = ActiveRecord::Base.connection_pool.db_config.configuration_hash
restituisce questo!
=> {: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}
Quindi
config["username"] || username || ENV["USER"] || "postgres",
dovrebbe essere
config["user"] || username || ENV["USER"] || "postgres",