Como resolver erros de Pups exec durante a inicialização do Discourse

Estou criando uma nova instância do Discourse do zero para fins de desenvolvimento e vejo este erro de bootstrap novamente:

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

A configuração do contêiner é com dois contêineres para webonly e dataonly (redis) e com um banco de dados postgresql externo. Comentar as configurações do maxmind não muda nada.

Alguma ideia do que posso fazer aqui?

A melhor suposição seria que você não tem memória suficiente - nesse caso, adicione swap ou mova para uma instância com mais RAM. Tente free -h.

Hmmm, não, temos 4 GB de RAM e bastante espaço em disco (2 x 32 GB), o ambiente geral é o mesmo da outra máquina docker onde as compilações rodam sem problemas.

Status da MEM:

root@docker3a:/var/discourse# free -h
total usado livre partilhado Buff/Cache disponível
Memória: 3,8Gi 819Mi 1,4Gi 22Mi 1,9Gi 3,0Gi
Swap: 974Mi 52Mi 922Mi

1 curtida

Algum erro recente na saída de dmesg que possa ser relevante?

Você pode compartilhar o log inteiro?

Essa é uma suposição estranha, nós não costumamos ver OoM causando erros de migração em Discourses.

x86_64 arch detectado.
Garantindo que o launcher esteja atualizado
Launcher está atualizado
2.0.20250226-0128: Puxando de discourse/base
Digest: sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
Status: Imagem está atualizada para discourse/base:2.0.20250226-0128
docker.io/discourse/base:2.0.20250226-0128
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
18:C 19 Apr 2025 16:38:41.670 # oO0OoO0OoO0Oo Redis está iniciando oO0OoO0OoO0Oo
18:C 19 Apr 2025 16:38:41.670 # Versão do Redis=7.0.15, bits=64, commit=00000000, modificado=0, pid=18, recém iniciado
18:C 19 Apr 2025 16:38:41.670 # Configuração carregada
18:M 19 Apr 2025 16:38:41.670 * Relógio monotônico: POSIX clock_gettime
18:M 19 Apr 2025 16:38:41.670 * Modo de execução=standalone, porta=6379.
18:M 19 Apr 2025 16:38:41.670 # Servidor inicializado
18:M 19 Apr 2025 16:38:41.671 * Carregando RDB produzido pela versão 7.0.15
18:M 19 Apr 2025 16:38:41.671 * Idade do RDB 72606 segundos
18:M 19 Apr 2025 16:38:41.671 * Uso de memória do RDB quando criado 0.82 Mb
18:M 19 Apr 2025 16:38:41.671 * RDB carregado, chaves carregadas: 0, chaves expiradas: 0.
18:M 19 Apr 2025 16:38:41.671 * DB carregado do disco: 0.000 segundos
18:M 19 Apr 2025 16:38:41.671 * Pronto para aceitar conexões
999:C 19 Apr 2025 16:39:59.006 # oO0OoO0OoO0Oo Redis está iniciando oO0OoO0OoO0Oo
999:C 19 Apr 2025 16:39:59.006 # Versão do Redis=7.0.15, bits=64, commit=00000000, modificado=0, pid=999, recém iniciado
999:C 19 Apr 2025 16:39:59.006 # Configuração carregada
999:M 19 Apr 2025 16:39:59.006 * Relógio monotônico: POSIX clock_gettime
999:M 19 Apr 2025 16:39:59.006 # Aviso: Não foi possível criar o socket de escuta TCP do servidor *:6379: bind: Endereço já em uso
999:M 19 Apr 2025 16:39:59.006 # Falha ao escutar na porta 6379 (TCP), abortando.
18:signal-handler (1745080813) SIGTERM recebido, agendando desligamento...
18:M 19 Apr 2025 16:40:13.541 # Desligamento solicitado pelo usuário...
18:M 19 Apr 2025 16:40:13.541 * Salvando o snapshot final do RDB antes de sair.
18:M 19 Apr 2025 16:40:13.549 * DB salvo em disco
18:M 19 Apr 2025 16:40:13.549 # Redis está pronto para sair, até mais...


FALHOU
--------------------
Pups::ExecError: cd /var/www/discourse &amp;&amp; su discourse -c 'bundle exec rake db:migrate' falhou com retorno #&lt;Process::Status: pid 1002 exit 1&gt;
Localização da falha: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec falhou com os parâmetros {"cd"=>"$home", "tag"=>"migrate", "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.
./discourse-doctor pode ajudar a diagnosticar o problema.
48b8aa6c912bbabc42d6b9373808088f5aa9079de1e1f7360fc858891a48556b

Se este é um contêiner apenas para web, por que ele tem redis nele?

Você pode compartilhar suas definições de contêiner yml? E por que você está executando uma instalação de dois contêineres?

Ei Falco
você está certo e eu sou estúpido :wink:
Vou corrigir isso …

OK, corrigi a separação de web_only e redis. A mensagem de erro agora é

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

Mas talvez seja um mal-entendido / falta de conhecimento da minha parte:

O banco de dados deve ser externo em outro contêiner lxc que possui um banco de dados postgresql. O usuário e o banco de dados existem, mas o banco de dados está vazio antes do primeiro bootstrap de web_only. O script cria o banco de dados em si no sistema remoto na primeira compilação? Ou eu tenho que primeiro criar o contêiner do banco de dados e depois exportar seu esquema padrão e os dados manualmente para o daemon postgresql externo?

Visualização da configuração geral

forum2 Setup.excalidraw

Obrigado pelo diagrama. É uma configuração bastante sofisticada - você faria isso se tivesse um bom motivo e conhecesse o território.

Se você ainda estiver vendo o seguinte, acho que é a indicação do que está errado. O Redis não consegue abrir a porta em que precisa estar escutando.

Portanto, as perguntas são se o redis deveria estar fazendo isso, neste contêiner, e se sim, onde mais na máquina outro redis está em execução. lsof pode ser uma ferramenta útil aqui.

Olá @Ed_S
obrigado pela dica sobre a porta que faltava. Primeiro, quero aguardar a resposta de Falco sobre minhas perguntas sobre a configuração geral do discourse com um banco de dados postgres externo.

Sim, a configuração é um pouco sofisticada em comparação com o padrão com apenas um contêiner de aplicativo. Eu executo tudo em uma máquina root dedicada com Proxmox (https://p\u003eroxmox.com) como ambiente de virtualização em hetzner.de

1 curtida

Você ainda precisa compartilhar os logs completos, incluindo a parte em que a migração falhou. Minha suposição (e é uma suposição, já que você não compartilhou o erro) é que você está usando o plugin de IA e seu banco de dados não tem o complemento necessário.

Não, é uma instalação sem o plugin de IA, embora esta instância seja um playground para recursos de IA no futuro.

Em anexo está um tarball com

./launcher bootstrap web_only >> web_only_bootstrap.log

e os ymls para redis e web_only, senhas foram removidas.

forum2_build.tar.gz (3,3 KB)

Longshot:

links:
  - link:
      name: redis
      alias: data

por que não é alias: redis?

1 curtida

o arquivo de /samples/web_only.yml tem

# Use 'links' key to link containers together, aka use Docker --link flag.
links:
- link:
name: data
alias: data

No meu caso, o container de dados é um container redis

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
a27999b28a90 local_discourse/redis \"/sbin/boot\" 2 days ago Up 20 hours

portanto name: redis e alias: data

De acordo com a documentação do Docker, este é um recurso legado, mas ainda pode ser usado, veja Legacy container links | Docker Docs

Agora acho que a melhor abordagem seria criar uma configuração padrão “tudo em um” primeiro (app.yml). E então fazer um dump SQL do esquema inicial e dos dados do container para uma máquina postgres externa. @Falco o que você acha?

Mas são apenas 28 linhas, então faltam a maioria delas.

Minha nova suposição é que ele não está contatando seu banco de dados, embora possa ser o redis com o qual ele não está se comunicando.

Tente

./launcher bootstrap web_only >> web_only_bootstrap.log 2>&1

O instalador criará automaticamente tudo o que for necessário, desde que receba credenciais válidas e consiga acessar o banco de dados. Isso está documentado em Configurar o Discourse para usar um servidor PostgreSQL separado

web_only_bootstrap2.tar.gz (9.1 KB)

Este deve ser melhor :wink:

Esta é uma nova instalação ou uma que você está movendo para um novo servidor?

Então você vai querer olhar o arquivo de log e procurar por “migrate” para encontrar o erro de migração.

Aqui está o erro:

PG::DuplicateObject: ERROR:  type "hotlinked_media_status" already exists

Pode ser um problema com algo que foi migrado e depois um commit foi revertido. Isso está relacionado, mas não é a sua solução: Restore fails with "hotlinked_media_status" already exists. Talvez isto: Upgrading 2.7 to 3.1 failing: "hotlinked_media_status" already exists - #5 by merefield

Além disso, você deve corrigir isso, embora não esteja realmente prejudicando nada:

Plugin name is 'discourse-topic-voting', but plugin directory is named 'discourse-voting'

Se você fizer isso novamente, por favor, apenas vincule o arquivo sem colocá-lo em um tar.

1 curtida