Backup multisito utilizzando user discourse invece di DB_USER o del valore da multisite.yml

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",
2 Mi Piace

@pfaffman Mi dispiace, abbiamo dovuto annullare questa modifica, perché ha interrotto il ripristino dei backup nei nostri ambienti di produzione.

La nostra configurazione multisito di esempio (e, di fatto, la configurazione di produzione) la ha sotto ‘username’:

2 Mi Piace

Mi dispiace molto! Sono ancora confuso su come funzioni per tutto tranne che per il backup.

Hmm.

Forse questo è il mio problema. Ma come funziona per tutto il resto?

Forse tutto il resto utilizza l’impostazione globale da una variabile d’ambiente.

2 Mi Piace

Mi dispiace tantissimo.

Non mi ero reso conto che ActiveRecord::Base.connection_pool.db_config.configuration_hash fosse solo una sciocchezza qualunque che avevo inserito nel file multisite.yml.

Ho rinominato tutti i miei campi user: errati in username: e ora il mio backup funziona.

La mia spiegazione (che non ho testato) è che il resto di Rails sovrascrive db_username da GlobalSettings se uno è impostato lì, ma quando va a recuperare quelle informazioni per effettuare la chiamata esterna a pg_dump le estrae dalla configurazione multisite.

Penso ancora che sia un bug che il backup ottenga un utente diverso e che la soluzione sarebbe includere il recupero di env['DISCOURSE_DB_USERNAME'] da qualche parte in quella dichiarazione di assegnazione, ma non sono disposto a rischiare di rompere di nuovo la produzione, e ora funziona.

Dovresti non mettere “mi piace” al mio post e rimuovere il mio badge! :crying_cat_face:

2 Mi Piace

Nessun problema, queste cose succedono. Idealmente, sarebbe stato rilevato nel CI, ma immagino che non abbiamo copertura per questa logica (forse difficile, dato che l’impostazione del database è completamente diversa nei test comunque)

Grazie per aver documentato ciò che hai trovato: sono sicuro che aiuterà altri in futuro. Concordo sul fatto che l’incoerenza qui sia negativa e sarebbe bene risolverla a un certo punto.

3 Mi Piace