Mover banco de dados postgres para servidor de banco de dados central: erro de compilação

Olá,
Estou atualmente migrando de uma configuração clássica de dois contêineres (contêineres web_only e de dados separados) para uma configuração onde o banco de dados é hospedado em um servidor de banco de dados central (não dentro de um contêiner Docker).

O banco de dados central foi criado a partir do dump.sql que faz parte do arquivo de backup. O docker compose web_only.yaml usa

conectar ao banco de dados postgres central

DISCOURSE_DB_SOCKET: ‘’
DISCOURSE_DB_USERNAME: discourse
DISCOURSE_DB_PASSWORD: xxxx
DISCOURSE_DB_HOST: 10.10.10.xx
DISCOURSE_DB_NAME: discourse

Durante a compilação do web_only, recebo o seguinte erro:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' falhou com retorno #<Process::Status: pid 741 exit 1>
Localização da falha: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec falhou com os parâmetros {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap falhou com código de saída 1
** FALHA AO INICIALIZAR ** por favor, role para cima e procure por mensagens de erro anteriores, pode haver mais de uma.

O host do banco de dados é acessível com esses dados. Alguma ideia do que está acontecendo aqui? A mesma compilação com o contêiner de banco de dados padrão termina com sucesso.

Tem certeza de que o banco de dados remoto está disponível no servidor? Parece que não está. Você pode usar o telnet para a porta do banco de dados a partir da máquina do servidor web?

Olá Jay,

Segui o tópico do Falco em Configure Discourse to use a separate PostgreSQL server O servidor de banco de dados está disponível a partir da VM:

root@docker2:/var/discourse# pg_isready -d discourse -h 10.10.10.18 -p 5432 -U discourse    
10.10.10.18:5432 - Conexões são aceitas

(conexões são aceitas)

O nome do banco de dados, usuário e senha em web_only.yml também estão corretos. O erro de compilação é

FALHA
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' falhou com retorno #<Process:
:Status: pid 829 exit 1>
Localização da falha: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec falhou com os parâmetros {\"cd\"=>\"$home\", \"hook\"=>\"db_migrate\", \"cmd\"=>[\"su discourse -c 'bundle exec rake db:migra
te'\"]}
bootstrap falhou com código de saída 1

Não sou um especialista em Ruby, então precisaria de ajuda para depurar a partir do erro que aparece aqui.

Tchau, Thommie

Nesse caso:

Quais plugins você tem? Você tem o plugin de IA?

Qual versão do postgres você está executando?

  • PostgreSQL 13.12
  • nenhum plugin de IA
  • plugins:
cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-shared-edits.git
          - git clone https://github.com/discourse/discourse-chat-integration
          - git clone https://github.com/discourse/wp-discourse
          - git clone https://github.com/discourse/discourse-openid-connect
          - git clone https://github.com/discourse/discourse-calendar
          - git clone https://github.com/discourse/discourse-data-explorer
          - git clone https://github.com/paviliondev/discourse-events
          - git clone https://github.com/paviliondev/discourse-locations
          - git clone https://github.com/discourse/discourse-reactions
          - git clone https://github.com/discourse/discourse-chat
          - git clone https://github.com/discourse/discourse-voting.git
          - git clone https://github.com/discourse/discourse-user-notes.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-footnote.git
          - git clone https://github.com/discourse/discourse-docs.git
          - git clone https://github.com/discourse/discourse-docs-card-filter.git
          - git clone https://github.com/discourse/discourse-assign.git
          - git clone https://github.com/discourse/discourse-templates.git
          - git clone https://github.com/discourse/discourse-saved-searches.git
          - git clone https://github.com/discourse/discourse-tooltips
          - git clone https://github.com/nathan-nz/discourse-wikified-posts
          - git clone https://github.com/discourse/discourse-post-voting.git
          - git clone https://github.com/discourse/discourse-encrypt.git
          - git clone https://github.com/discourse/discourse-zoom.git
          - git clone https://github.com/discourse/discourse-spoiler-alert.git
          - git clone https://github.com/discourse/discourse-category-experts.git

?

?
A mensagem de erro exata no backtrace nos dirá exatamente qual é o problema :smile:

Seu plano é descartar o contêiner de dados?

1 curtida

código de erro:

> FALHA
> --------------------
> Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' falhou com retorno #<Process::Status: pid 816 exit 1>
> Localização da falha: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
> exec falhou com os parâmetros {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
> bootstrap falhou com o código de saída 1

No novo sistema, os dados deverão vir do banco de dados central em vez do banco de dados do docker, se possível.

Será que ter isso definido como um valor em branco em vez de não definido causará problemas.

De qualquer forma, por favor, poste a saída completa.

1 curtida

o log de build completo após

./launcher rebuild web_only

web_only_build.zip (9.4 KB)

o yaml

web_only.zip (2.4 KB)

Em relação ao DISCOURSE_DB_SOCKET: ‘’: como usamos uma conexão remota, eu presumiria que o valor do socket não é relevante em nenhum dos casos (dados em contêiner ou dados remotos)

1 curtida

O erro estava mais adiante no log de compilação:

…
docker_manager já está na versão compatível mais recente
wp-discourse já está na versão compatível mais recente

I, [2023-11-10T21:08:17.388213 #1]  INFO -- : cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate'
O nome do plugin é 'discourse-topic-voting', mas o diretório do plugin é chamado 'discourse-voting'
rake aborted!
ActiveRecord::StatementInvalid: PG::InsufficientPrivilege: ERROR:  permissão negada para a tabela users (ActiveRecord::StatementInvalid)

Então, boas notícias! Está conectando bem, são as permissões do banco de dados que precisam ser ajustadas.

2 curtidas

Hmmmm, estranho, o usuário do banco de dados discourse tem

postgres=# GRANT ALL ON DATABASE discourse TO discourse;

no servidor postgres central. Precisamos de mais alguma coisa para essa função?

Isso não afeta tabelas existentes.

De improviso, talvez:

ALTER DATABASE "discourse" OWNER TO "discourse";

ou:

ALTER DEFAULT PRIVILEGES IN SCHEMA "public" GRANT ALL ON TABLES TO "discourse";

Os logs do postgres também devem informar com mais detalhes quais operações estão falhando.

4 curtidas

… ok ok, parece que tenho mais problemas de permissão aqui, veja /var/log/postgresql/postgresql-13-main.log:

2023-11-10 22:07:58.371 UTC [196127] postgres@postgres STATEMENT:  ALTER DEFAULT PRIVILEGES IN SCHEMA 'public' GRANT ALL ON TABLES TO 'discourse';
2023-11-10 22:10:18.270 UTC [196160] discourse@discourse ERROR:  permission denied for table site_settings
2023-11-10 22:10:18.270 UTC [196160] discourse@discourse STATEMENT:  SELECT name, data_type, value FROM site_settings
2023-11-10 22:10:18.313 UTC [196160] discourse@discourse ERROR:  permission denied for table users
2023-11-10 22:10:18.313 UTC [196160] discourse@discourse STATEMENT:  SELECT COUNT(*) FROM (SELECT 1 AS one FROM "users" LIMIT 20) subquery_for_count

OK, como sempre, foi um “problema de camada 8” :smiling_face_with_tear:
Eu já tinha um banco de dados discourse no postgres, mas o usuário/role do discourse não tinha todos os privilégios necessários nele. E eu perdi algumas diferenças importantes de “comportamento” entre mariadb e postgres…

Agora eu recriei tudo: usuário, banco de dados, permissões para o usuário/role (incluindo ALTER DEFAULT PRIVILEGES FOR ROLE discourse IN SCHEMA public GRANT ALL ON TABLES TO “discourse”; para corresponder às tabelas criadas por este usuário no futuro)

A compilação terminou e a instância está rodando bem com o servidor postgres remoto, então está pronta para importar o backup da instância mais antiga.

4 curtidas

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