Fehler bei der Migration zu einer externen Postgres-Instanz

Ich habe mein Forum mit discourse-docker unter Verwendung der Standardkonfiguration für in sich geschlossene Systeme eingerichtet. Ich muss zu einem separaten PostgreSQL-Server wechseln.

Ich habe ein Backup erstellt, dann app.yml geändert, neu kompiliert und versucht, das Backup über die CLI wiederherzustellen. Die Wiederherstellung schlägt fehl, und es scheint, dass die Wiederherstellung die korrekte Hostadresse für den Zugriff auf PostgreSQL verwendet hat, aber den Standardport (5432) anstelle des von mir konfigurierten Ports (9432) verwendet hat.

Fehler:

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]

Konfiguration:
In app.yml habe ich unter templates: auskommentiert: - "templates/postgres.template.yml"

Ich habe auch Folgendes unter env hinzugefügt:

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

Als Sie neu kompiliert haben, wurde eine neue leere Seite generiert? Wenn nicht, dann haben Sie ein Problem.

Können Sie von innerhalb des Containers auf die Datenbank zugreifen mit psql <einige Schalter, um auf die Datenbank zu verweisen>?

Sehen Sie innerhalb des Containers, wenn Sie set|grep DB ausführen, Ihre Umgebungsvariablen?

Ja zu allen dreien. Es generiert eine neue, leere Website, die mit der richtigen Datenbank verbunden ist. Die Umgebungsvariablen werden gesetzt, wenn ich nach ihnen suche, und ich kann mich von innerhalb des Containers manuell mit der Datenbank verbinden.

Es besteht eine geringe Chance, dass das Wiederherstellungsskript die Umgebungsvariablen nicht beachtet (aber alles andere tut es?). Die Möglichkeiten, dies zu überprüfen, sind, sich den Code anzusehen und zu versuchen, eine Wiederherstellung über die Benutzeroberfläche durchzuführen. Wenn Sie über die Benutzeroberfläche wiederherstellen können, dann denke ich, dass Sie dies zu Bug verschieben könnten.

Ich habe auch versucht, eine Wiederherstellung über die Benutzeroberfläche durchzuführen, und denselben Fehler erhalten.

Dann würde ich mir wohl als Nächstes den Code ansehen.

Es ist besonders seltsam, dass es für alles andere funktioniert.

Können Sie eine Rails-Konsole öffnen und uns dann die folgenden Werte anzeigen:

BackupRestore.database_configuration
BackupRestore::DatabaseRestorer.psql_command

z. B.:

→ 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 „Gefällt mir“

Hier, bitte! Alles, was ich geschwärzt habe, ist korrekt. Nur der Port ist falsch.

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

Ich wiederhole auch, dass die leere Instanz in der Lage ist, sich mit der Datenbank zu verbinden, außer für die Wiederherstellung aus dem Backup.

Was ist

ActiveRecord::Base.connection_pool.db_config.configuration_hash
1 „Gefällt mir“
[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}

Ah! Sie müssen auch Folgendes festlegen:

DISCOURSE_DB_BACKUP_PORT: 9432

und dann sollten die Dinge funktionieren.

EDIT: Dieser Standardwert ist schon seit einiger Zeit in Kraft, scheint aber mehr Schwierigkeiten als Nutzen gebracht zu haben.

FIX: clear db_backup_port default value by Supermathie · Pull Request #25316 · discourse/discourse · GitHub sollte dies ebenfalls beheben und Verwirrung für zukünftige Reisende vermeiden.

2 „Gefällt mir“

Vielen Dank! Danke!

1 „Gefällt mir“

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