Erro na migração para uma instância externa postgres

Configurei meus fóruns usando discourse-docker com a configuração autossuficiente padrão. Preciso mudar para usar um servidor postgres separado.

Fiz um backup, modifiquei o app.yml, reconstruí e tentei restaurar do backup via CLI. A restauração falha e parece que a restauração estava usando o host correto para acessar o postgres, mas estava usando a porta padrão (5432) em vez da que configurei (9432).

Erro:

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]

Configuração:
No app.yml, em templates:, comentei - "templates/postgres.template.yml"

Também adicionei o seguinte em env:

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

Quando você reconstruiu, ele gerou um novo site em branco? Se não, então você tem algum problema aí.

Você consegue acessar o banco de dados de dentro do contêiner com psql \u003calgumas opções para apontar para o banco de dados\u003e)

Dentro do contêiner, se você fizer um set|grep DB, você vê suas variáveis de ambiente?

Sim para os três. Ele gera um novo site em branco, conectado ao banco de dados correto. As variáveis de ambiente são definidas quando eu as procuro com grep, e eu consigo me conectar manualmente ao banco de dados de dentro do contêiner.

Há uma chance remota de que, de alguma forma, o script de restauração não respeite as variáveis de ambiente (mas tudo o mais respeita?). As maneiras de verificar isso são olhar o código e tentar fazer uma restauração a partir da UX. Se você puder restaurar a partir da UX, acho que poderia mover isso para Bug.

Tentei uma restauração pela UX também e obtive o mesmo erro.

Então, acho que o que eu faria a seguir seria olhar o código.

É especialmente estranho que esteja funcionando para todo o resto.

Você pode entrar em um console do Rails e, em seguida, nos mostrar os seguintes valores:

BackupRestore.database_configuration
BackupRestore::DatabaseRestorer.psql_command

por exemplo:

→ 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 curtida

Aqui está! Tudo o que eu censurei está correto. A porta é a única coisa errada.

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

Também reitero que a instância em branco consegue se conectar ao banco de dados para tudo, exceto para restaurar a partir do backup.

O que é

ActiveRecord::Base.connection_pool.db_config.configuration_hash
1 curtida
[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! Você também precisará definir

DISCOURSE_DB_BACKUP_PORT: 9432

e então as coisas devem funcionar.

EDIT: este padrão está em vigor há algum tempo, mas parece ter causado mais dificuldades do que benefícios.

FIX: clear db_backup_port default value by Supermathie · Pull Request #25316 · discourse/discourse · GitHub também deve resolver isso e evitar essa confusão para futuros usuários.

2 curtidas

Muito apreciado! Obrigado!

1 curtida

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