Sauvegarde multisite utilisant l'utilisateur discourse plutôt que DB_USER ou la valeur de multisite.yml

EDIT/Tl;dr : ActiveRecord::Base.connection_pool.db_config.configuration_hash contient le nom d’utilisateur dans user, pas username, mais Discourse le recherche dans username.
PR trivial : FIX: backup_restore.rb wants db user from user, not username by pfaffman · Pull Request #28229 · discourse/discourse · GitHub

J’ai une instance multisite utilisant le postgres hébergé de Digital Ocean. Cela fonctionne bien, mais lorsque j’essaie de sauvegarder, j’obtiens une erreur qui dit :

[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"

Mais l’utilisateur n’est pas discourse. Il utilise le bon utilisateur ailleurs, y compris ActiveRecord::Base.connection_pool.db_config.configuration_hash et BackupRestore.database_configuration (lorsque j’exécute ces commandes dans RAILS_DB=sitename rails c). PG_USER n’est pas défini dans l’environnement (d’après ce que je peux voir).

Il semble que ce soit la cause :

Je l’ai modifié dans le conteneur (pour le tirer de DISCOURSE_DB_USER, ce qui semblait une bonne idée à l’époque) et la sauvegarde fonctionne maintenant. Je ne sais pas si vous êtes censé pouvoir extraire les informations de connexion de multisite.yml ou non, mais ignorer DB_USER semble faux.
Ou peut-être devrais-je simplement faire en sorte que l’utilisateur soit discourse comme tout le monde le fait, je suppose ?

EDIT : Attendez. Non.
config['username'] devrait être config['user']

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

renvoie ceci !

   
=> {: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}

Donc

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

devrait être

    config["user"] || username || ENV["USER"] || "postgres",
2 « J'aime »

@pfaffman Je crains que nous ayons dû annuler ceci, car cela a empêché la restauration des sauvegardes dans nos environnements de production.

Notre exemple de configuration multisite (et en effet, la configuration de production) l’a sous ‘username’ :

2 « J'aime »

Désolé ! Je ne comprends toujours pas comment cela fonctionne pour tout sauf la sauvegarde.

Hmm.

C’est peut-être mon problème. Mais comment cela fonctionne-t-il pour tout le reste ?

Peut-être que tout le reste utilise le paramètre global d’une variable d’environnement.

2 « J'aime »

Je suis tellement désolé.

Il ne m’est pas venu à l’esprit que ActiveRecord::Base.connection_pool.db_config.configuration_hash était juste n’importe quelle absurdité que j’avais mise dans le fichier multisite.yml.

J’ai renommé tous mes champs user: erronés en username: et maintenant ma sauvegarde fonctionne.

Mon explication (que je n’ai pas testée) est que le reste de Rails surcharge le db_username de GlobalSettings s’il y en a un défini, mais lorsqu’il va chercher ces informations pour faire l’appel externe à pg_dump, il les extrait de la configuration multisite.

Je pense toujours que c’est un bug que la sauvegarde obtienne un utilisateur différent et que la solution serait d’inclure la récupération de env['DISCOURSE_DB_USERNAME'] quelque part dans cette instruction d’assignation, mais je ne suis pas prêt à risquer de casser la production à nouveau, et maintenant ça fonctionne.

Vous devriez ne pas aimer mon message et retirer mon badge ! :crying_cat_face:

2 « J'aime »

Pas de souci, ces choses arrivent. Idéalement, cela aurait été détecté dans l’intégration continue (CI), mais je suppose que nous n’avons pas de couverture pour cette logique (peut-être difficile, puisque la configuration de la base de données est toute différente dans les tests de toute façon).

Merci d’avoir documenté ce que vous avez trouvé - je suis sûr que cela aidera d’autres personnes à l’avenir. Je suis d’accord que l’incohérence ici est mauvaise, et qu’il serait bon de la corriger à un moment donné.

3 « J'aime »