نسخ احتياطي لعدة مواقع باستخدام المستخدم التابع لـ discourse بدلاً من DB_USER أو القيمة من multisite.yml

تحرير/ملخص: ActiveRecord::Base.connection_pool.db_config.configuration_hash يحتوي على اسم المستخدم في user، وليس username، لكن Discourse يبحث عنه في username.
طلب سحب بسيط: FIX: backup_restore.rb wants db user from user, not username by pfaffman · Pull Request #28229 · discourse/discourse · GitHub

لدي مثيل متعدد المواقع يستخدم قاعدة بيانات PostgreSQL المستضافة من Digital Ocean. إنها تعمل بشكل جيد ولكن عندما أحاول النسخ الاحتياطي، أحصل على خطأ يفيد بأن

[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_hash و BackupRestore.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 أخشى أننا اضطررنا إلى التراجع عن هذا، لأنه أدى إلى كسر استعادة النسخ الاحتياطية في بيئات الإنتاج لدينا.

تكوين multisite النموذجي الخاص بنا (وبالفعل، تكوين الإنتاج) يحتوي عليه تحت ‘username’:

إعجابَين (2)

أعتذر بشدة! ما زلت مرتبكًا بشأن كيفية عمله لكل شيء باستثناء النسخ الاحتياطي.

هممم.

ربما هذه هي مشكلتي. ولكن كيف يعمل لكل شيء آخر؟

ربما يستخدم كل شيء آخر الإعداد العام من متغير بيئة.

إعجابَين (2)

أنا آسف جدًا.

لم يخطر ببالي أن ActiveRecord::Base.connection_pool.db_config.configuration_hash كان مجرد أي هراء وضعته في ملف multisite.yml.

لقد أعدت تسمية جميع حقول user: الخاطئة الخاصة بي إلى username: والآن يعمل النسخ الاحتياطي الخاص بي.

تفسيري (الذي لم أختبره) هو أن بقية إطار عمل Rails يتجاوز db_username من GlobalSettings إذا تم تعيينه هناك، ولكن عندما يذهب للحصول على تلك المعلومات لإجراء استدعاء خارجي لـ pg_dump فإنه يسحبها من تكوين multisite.

ما زلت أعتقد أنه خطأ أن النسخ الاحتياطي يحصل على مستخدم مختلف وأن الإصلاح سيكون تضمين سحب env['DISCOURSE_DB_USERNAME'] في مكان ما في بيان التعيين هذا، ولكني لست على استعداد للمخاطرة بكسر الإنتاج مرة أخرى، والآن يعمل.

يجب عليك إلغاء الإعجاب بمنشوري وإزالة شارتي! :crying_cat_face:

إعجابَين (2)

لا تقلق على الإطلاق، تحدث هذه الأمور. من الناحية المثالية، كان يجب اكتشاف ذلك في CI، لكنني أفترض أننا لا نغطي هذا المنطق (ربما يكون الأمر صعبًا، نظرًا لأن إعداد قاعدة البيانات مختلف تمامًا في الاختبارات على أي حال)

شكرًا لك على توثيق ما وجدته - أنا متأكد من أنه سيساعد الآخرين في المستقبل. أتفق على أن عدم الاتساق هنا سيء، وسيكون من الجيد إصلاحه في وقت ما.

3 إعجابات