Errore durante la migrazione a un'istanza postgres esterna

Ho configurato i miei forum utilizzando discourse-docker con la configurazione self-contained predefinita. Ho bisogno di passare a un server postgres separato.

Ho eseguito un backup, quindi ho modificato app.yml, ricostruito e tentato di ripristinare dal backup tramite la CLI. Il ripristino fallisce e sembra che il ripristino stesse utilizzando l’host corretto per accedere a postgres, ma stesse utilizzando la porta predefinita (5432) anziché quella che ho configurato (9432).

Errore:

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]

Configurazione:
In app.yml, sotto templates:, ho commentato - "templates/postgres.template.yml"

Ho anche aggiunto quanto segue sotto env:

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

Quando hai ricostruito ha generato un nuovo sito vuoto? Se no, allora hai qualche problema lì.

Puoi accedere al database dall’interno del container con psql \u003calcuni interruttori per puntare al database\u003e)

All’interno del container, se fai un set|grep DB vedi le tue variabili d’ambiente?

Sì a tutti e tre. Genera un sito nuovo e vuoto, collegato al database corretto. Le variabili d’ambiente sono impostate quando le cerco con grep e posso connettermi manualmente al database dall’interno del container.

C’è una remota possibilità che in qualche modo lo script di ripristino non rispetti le variabili d’ambiente (ma tutto il resto lo fa?). I modi per verificarlo sono esaminare il codice e provare a eseguire un ripristino dall’UX. Se riesci a ripristinare dall’UX, penso che potresti spostare questo in Bug.

Ho tentato un ripristino anche tramite l’UX, e ho ottenuto lo stesso errore.

Allora immagino che la prossima cosa che farei sarebbe guardare il codice.

È particolarmente strano che funzioni per tutto il resto.

Puoi accedere a una console Rails ed esporci i seguenti valori:

BackupRestore.database_configuration
BackupRestore::DatabaseRestorer.psql_command

ad es.:

→ 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 Mi Piace

Ecco fatto! Tutto ciò che ho oscurato è corretto. L’unica cosa che non va è la porta.

[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=[REDACTED] --port=5432 --username=[REDACTED]"

Ribadisco inoltre che l’istanza vuota è in grado di connettersi al database per tutto tranne che per il ripristino dal backup.

Cos’è

ActiveRecord::Base.connection_pool.db_config.configuration_hash
1 Mi Piace
[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! Dovrai anche impostare

DISCOURSE_DB_BACKUP_PORT: 9432

e poi le cose dovrebbero funzionare.

MODIFICA: questo valore predefinito è in vigore da un po’ di tempo ma sembra aver causato più difficoltà che benefici.

FIX: clear db_backup_port default value by Supermathie · Pull Request #25316 · discourse/discourse · GitHub dovrebbe anche risolvere questo problema ed evitare questa confusione per i futuri utenti.

2 Mi Piace

Molto apprezzato! Grazie!

1 Mi Piace

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