خطأ عند الترحيل إلى مثيل postgres خارجي

لقد قمت بإعداد منتدياتي باستخدام discourse-docker مع التكوين الافتراضي المكتفي ذاتيًا. أحتاج إلى التبديل إلى استخدام خادم postgres منفصل.

لقد قمت بتشغيل نسخة احتياطية، ثم عدلت app.yml، وأعدت البناء، وحاولت استعادة النسخة الاحتياطية عبر سطر الأوامر. تفشل الاستعادة، ويبدو أن الاستعادة كانت تستخدم المضيف الصحيح للوصول إلى postgres، ولكنها كانت تستخدم المنفذ الافتراضي (5432) بدلاً من المنفذ الذي قمت بتكوينه (9432).

خطأ:

psql: error: connection to server at "[REDACTED HOST]" ([REDACTED IP]), port 5432 failed: Connection refused
Is the server running on that host and accepting TCP/IP connections?
EXCEPTION: psql failed: 	Is the server running on that host and accepting TCP/IP connections?
/var/www/discourse/lib/backup_restore/database_restorer.rb:92:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:51:in `run'
script/discourse:149:in `restore'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/thor-1.3.0/lib/thor/command.rb:28:in `run'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/thor-1.3.0/lib/thor/invocation.rb:127:in `invoke_command'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/thor-1.3.0/lib/thor.rb:527:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/thor-1.3.0/lib/thor/base.rb:584:in `start'
script/discourse:290:in `<top (required)>'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli/exec.rb:58:in `load'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli/exec.rb:58:in `kernel_load'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli.rb:451:in `exec'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor.rb:527:in `dispatch'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli.rb:34:in `dispatch'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli.rb:28:in `start'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/exe/bundle:28:in `block in <top (required)>'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/exe/bundle:20:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Trying to rollback...
Rolling back...
Cleaning stuff up...
Dropping functions from the discourse_functions schema...
Removing tmp '/var/www/discourse/tmp/restores/default/2024-01-17-201724' directory...
Unpausing sidekiq...
Marking restore as finished...
Notifying 'system' of the end of the restore...
Finished!
[FAILED]

التكوين:
في app.yml، ضمن templates:، قمت بالتعليق على - "templates/postgres.template.yml"

كما أضفت ما يلي ضمن env:

  DISCOURSE_DB_USERNAME: [REDACTED]
  DISCOURSE_DB_PASSWORD: [REDACTED]
  DISCOURSE_DB_HOST:  [REDACTED]
  DISCOURSE_DB_PORT: 9432
  DISCOURSE_DB_NAME: [REDACTED]

عندما قمت بإعادة البناء، هل أنشأ موقعًا جديدًا فارغًا؟ إذا لم يكن كذلك، فهناك مشكلة لديك.

هل يمكنك الوصول إلى قاعدة البيانات من داخل الحاوية باستخدام psql \u003csome switches to point to the database\u003e

داخل الحاوية، إذا قمت بتنفيذ set|grep DB، هل ترى متغيرات البيئة الخاصة بك؟

نعم للثلاثة. يقوم بإنشاء موقع جديد وفارغ، متصل بقاعدة البيانات الصحيحة. يتم تعيين متغيرات البيئة عند البحث عنها باستخدام grep، ويمكنني الاتصال بقاعدة البيانات يدويًا من داخل الحاوية.

هناك احتمال ضئيل بأن نص الاستعادة النصي لا يحترم متغيرات البيئة (ولكن كل شيء آخر يفعل ذلك؟). الطرق للتحقق من ذلك هي النظر إلى الكود ومحاولة إجراء استعادة من واجهة المستخدم. إذا كان يمكنك الاستعادة من واجهة المستخدم، فأعتقد أنه يمكنك نقل هذا إلى Bug.

لقد حاولت إجراء استعادة عبر واجهة المستخدم أيضًا، وحصلت على نفس الخطأ.

إذًا، أعتقد أن ما سأفعله بعد ذلك هو النظر إلى الكود.

من الغريب بشكل خاص أنه يعمل لكل شيء آخر.

هل يمكنك الدخول إلى وحدة تحكم rails ثم عرض القيم التالية لنا:

BackupRestore.database_configuration
BackupRestore::DatabaseRestorer.psql_command

على سبيل المثال:

→ rails c
Loading development environment (Rails 7.0.8)
[1] pry(main)> BackupRestore.database_configuration
=> #<struct BackupRestore::DatabaseConfiguration
   host=nil,
   port=nil,
   username="michael",
   password=nil,
   database="discourse_development">

[2] pry(main)> BackupRestore::DatabaseRestorer.psql_command
=> "psql --dbname='discourse_development' --single-transaction --variable=ON_ERROR_STOP=1 --username=michael"
إعجاب واحد (1)

تفضل! كل ما قمت بحذفه صحيح. المنفذ هو الشيء الوحيد الخاطئ.

[1] pry(main)> BackupRestore.database_configuration
=> #<struct BackupRestore::DatabaseConfiguration
   host="[REDACTED[",
   port=5432,
   username="[REDACTED]",
   password="[REDACTED]",
   database="[REDACTED]">
[2] pry(main)> BackupRestore::DatabaseRestorer.psql_command
=> "PGPASSWORD='[REDACTED]' psql --dbname='[REDACTED]' --single-transaction --variable=ON_ERROR_STOP=1 --host=[REDCATED] --port=5432 --username=[REDACTED]"

سأكرر أيضًا أن المثيل الفارغ قادر على الاتصال بقاعدة البيانات لكل شيء باستثناء الاستعادة من النسخة الاحتياطية.

ما هو

ActiveRecord::Base.connection_pool.db_config.configuration_hash
إعجاب واحد (1)
[3] pry(main)> ActiveRecord::Base.connection_pool.db_config.configuration_hash
=> {:adapter=>"postgresql",
 :pool=>8,
 :connect_timeout=>5,
 :socket=>"/var/run/postgresql",
 :host=>"[REDACTED]",
 :port=>9432,
 :backup_port=>5432,
 :username=>"[REDACTED]",
 :password=>"[REDACTED]",
 :host_names=>["[REDACTED]"],
 :database=>"[REDACTED]",
 :prepared_statements=>false,
 :idle_timeout=>30,
 :reaping_frequency=>30,
 :advisory_locks=>true}

آه! ستحتاج أيضًا إلى تعيين

DISCOURSE_DB_BACKUP_PORT: 9432

وبعد ذلك يجب أن تعمل الأمور.

تحرير: تم وضع هذا الإعداد الافتراضي لفترة من الوقت ولكنه يبدو أنه تسبب في صعوبات أكثر من الفائدة.

FIX: clear db_backup_port default value by Supermathie · Pull Request #25316 · discourse/discourse · GitHub يجب أن يحل هذا أيضًا ويتجنب هذا الارتباك للمسافرين في المستقبل.

إعجابَين (2)

أقدر ذلك كثيراً! شكراً!

إعجاب واحد (1)

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.