Erreur lors de la migration vers une instance postgres externe

J’ai configuré mes forums en utilisant discourse-docker avec la configuration autonome par défaut. Je dois passer à l’utilisation d’un serveur postgres séparé.

J’ai effectué une sauvegarde, puis modifié app.yml, reconstruit et tenté de restaurer à partir de la sauvegarde via la ligne de commande. La restauration échoue, et il semble que la restauration utilisait l’hôte correct pour accéder à postgres, mais elle utilisait le port par défaut (5432) plutôt que celui que j’ai configuré (9432).

Erreur :

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]

Configuration :
Dans app.yml, sous templates:, j’ai commenté - "templates/postgres.template.yml"

J’ai également ajouté ce qui suit sous env :

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

Lorsque vous avez reconstruit, a-t-il généré un nouveau site vierge ? Sinon, vous avez un problème.

Pouvez-vous accéder à la base de données depuis l’intérieur du conteneur avec psql \u003cquelques commutateurs pour pointer vers la base de données\u003e)

À l’intérieur du conteneur, si vous faites un set|grep DB, voyez-vous vos variables d’environnement ?

Oui aux trois. Il génère un nouveau site vierge, connecté à la bonne base de données. Les variables d’environnement sont définies lorsque je les recherche avec grep, et je peux me connecter manuellement à la base de données depuis le conteneur.

Il y a une faible possibilité que, d’une manière ou d’une autre, le script de restauration ne respecte pas les variables d’environnement (mais que tout le reste le fasse ?). Les moyens de vérifier cela sont de regarder le code et d’essayer de faire une restauration à partir de l’interface utilisateur. Si vous pouvez restaurer à partir de l’interface utilisateur, je pense que vous pourriez déplacer cela vers Bug.

J’ai également tenté une restauration via l’interface utilisateur et j’ai obtenu la même erreur.

Alors, je suppose que la prochaine étape serait d’examiner le code.

Il est particulièrement étrange que cela fonctionne pour tout le reste.

Pouvez-vous accéder à une console Rails, puis nous montrer les valeurs suivantes :

BackupRestore.database_configuration
BackupRestore::DatabaseRestorer.psql_command

par exemple :

→ 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 « J'aime »

Voici! Tout ce que j’ai masqué est correct. Le port est la seule chose qui est fausse.

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

Je réitère également que l’instance vide est capable de se connecter à la base de données pour tout sauf la restauration à partir de la sauvegarde.

Qu’est-ce que

ActiveRecord::Base.connection_pool.db_config.configuration_hash
1 « J'aime »
[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 ! Vous devrez également définir

DISCOURSE_DB_BACKUP_PORT : 9432

et ensuite les choses devraient fonctionner.

EDIT : cette valeur par défaut est en place depuis un certain temps mais semble avoir causé plus de difficultés que de bénéfices.

FIX: clear db_backup_port default value by Supermathie · Pull Request #25316 · discourse/discourse · GitHub devrait également résoudre ce problème et éviter cette confusion pour les futurs utilisateurs.

2 « J'aime »

Beaucoup apprécié ! Merci !

1 « J'aime »

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