DB_USERまたはmultisite.ymlの値ではなく、ユーザーディスコースを使用したマルチサイトバックアップ

編集/要約: ActiveRecord::Base.connection_pool.db_config.configuration_hash には、username ではなく user にユーザー名が含まれていますが、Discourse は username で検索しています。

簡単なPR: FIX: backup_restore.rb wants db user from user, not username by pfaffman · Pull Request #28229 · discourse/discourse · GitHub

マルチサイトインスタンスで Digital Ocean のホストされている postgres を使用しています。正常に動作していますが、バックアップしようとすると、次のエラーが発生します。

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

しかし、ユーザーは discourse ではありません。他の場所でも、ActiveRecord::Base.connection_pool.db_config.configuration_hashBackupRestore.database_configuration (これらを RAILS_DB=sitename rails c で実行した場合) を含む、正しいユーザーを使用しています。PG_USER は環境変数で設定されていません (私が見る限り)。

これが原因のようです:

コンテナ内でこれを編集しました (当時良い考えだと思った DISCOURSE_DB_USER から取得するように) 、バックアップは現在機能しています。multisite.yml から接続情報を取得できるのかどうかはわかりませんが、DB_USER を無視するのは間違っているように思えます。

それとも、他の皆がやっているように、ユーザーを discourse にすべきなのでしょうか?

編集:いや。

config['username']config['user'] であるべきです。

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

はこれを返します!

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

なので

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

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

であるべきです。

「いいね!」 2

@pfaffman 申し訳ありませんが、本番環境でのバックアップ復元に問題が発生したため、この変更を元に戻さなければなりませんでした。

当社のサンプルマルチサイト構成(および本番構成)では、‘username’ の下にあります。

「いいね!」 2

申し訳ありません!バックアップ以外のすべてについて、それがどのように機能するのかまだわかりません。

うーん。

それが私の問題かもしれません。しかし、他のすべてについてはどのように機能しているのでしょうか?

おそらく、他のすべては環境変数からのグローバル設定を使用しています。

「いいね!」 2

大変申し訳ありません。

ActiveRecord::Base.connection_pool.db_config.configuration_hashmultisite.yml ファイルに記述した適当な値にすぎないことに気づきませんでした。

私の不適切な user: フィールドをすべて username: に変更したところ、バックアップが機能するようになりました。

私の説明(テストしていません)は、Rails の他の部分が GlobalSettings から db_username が設定されている場合にそれを上書きしますが、外部呼び出し pg_dump を行うための情報を取得するためにその情報にアクセスするときには、multisite 設定から取得するということです。

バックアップが異なるユーザーを取得するのはバグであり、修正は env['DISCOURSE_DB_USERNAME'] をその代入ステートメントのどこかに含めることだと思いますが、本番環境を再び壊すリスクを冒したくはありません。そして今、それは機能しています。

私の投稿の「いいね!」を解除し、私のバッジを削除してください! :crying_cat_face:

「いいね!」 2

心配いりません、こういうことは起こります。理想的にはCIで検出されるべきでしたが、おそらくこのロジックのカバレッジがないのでしょう(テストではDBのセットアップがすべて異なるため、難しいのかもしれません)。

見つけたことを文書化してくれてありがとう。きっと将来の他の人の助けになるでしょう。この不整合は良くないこと、そしていつかは修正すべきであることに同意します。

「いいね!」 3