Falha na implantação - exec_command.rb:117:in `spawn

Olá pessoal.
Antes que eu sobrecarregue este espaço com logs longos, colei-os abaixo.
A implantação falha sempre desta maneira. Alguém pode compartilhar alguma sugestão sobre qual é o problema e como corrigi-lo? Agradeceria muito.

I, [2023-06-20T14:08:40.997134 #1]  INFO -- : ` cd /var/www/discourse ` & su discourse -c 'LOAD_PLUGINS=0 bundle exec rake plugin:pull_compatible_all'
I, [2023-06-20T14:08:43.104608 #1]  INFO -- : docker_manager já está na versão compatível mais recente

I, [2023-06-20T14:08:43.104825 #1]  INFO -- : ` cd /var/www/discourse ` & su discourse -c 'bundle exec rake db:migrate'
rake aborted!
Redis::CommandError: READONLY Você não pode escrever em um réplica somente leitura. script: bcec1d9b3bbcfb089dc0b7316771be9f011872b6, em @user_script:8.
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/redis-4.8.1/lib/redis/client.rb:162:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rack-mini-profiler-3.1.0/lib/mini_profiler/profiling_methods.rb:85:in `block in profile_method'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/redis-4.8.1/lib/redis.rb:270:in `block in send_command'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/redis-4.8.1/lib/redis.rb:269:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/redis-4.8.1/lib/redis.rb:269:in `send_command'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/redis-4.8.1/lib/redis/commands/scripting.rb:110:in `_eval'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/redis-4.8.1/lib/redis/commands/scripting.rb:97:in `evalsha'
/var/www/discourse/lib/discourse_redis.rb:273:in `eval'
/var/www/discourse/lib/distributed_mutex.rb:82:in `get_lock'
/var/www/discourse/lib/distributed_mutex.rb:50:in `block in synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:34:in `synchronize'
/var/www/discourse/lib/tasks/db.rake:221:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
I, [2023-06-20T14:08:45.555646 #1]  INFO -- :

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' falhou com retorno #<Process::Status: pid 687 exit 1>
Localização da falha: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117: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.
./discourse-doctor pode ajudar a diagnosticar o problema.
1 curtida

Auhh.. isso é Redis - ser um novato levou um tempo - certo?
Mas se sim, então como implantar de uma maneira que se pense nisso, chamaria de “réplica em espera”? - sim, é essa instância do Discourse que eu quero dizer.

Esta é uma instalação padrão, ou uma instalação de desenvolvimento ou algo mais? Você criou seu próprio redis? Para uma instalação padrão, o redis deve estar no contêiner e funcionar.

1 curtida

Olá.
Não mencionei - presumi e ainda presumo que o que tento não é incomum - que tanto o Redis quanto o pgSQL são externos ao contêiner do Discourse.
É possível implantar o Discourse de forma mais ou menos padrão como “standby” - da mesma forma ou de forma semelhante ao Redis - para que a instanciação/implantação de tal contêiner não falhe?

1 curtida

Sim, mas você precisará depurar seu servidor redis por conta própria.

O erro é

Você não pode escrever em uma réplica somente leitura

Parece que você criou uma réplica e precisa escrever na principal. Se você está tentando um failover, precisará descobrir como mudar a réplica para ativa e parar de ser uma réplica.

Você precisará de ajuda em outro lugar.

Sim. Mas a falha de redundância não é o problema que estou tendo aqui, ainda não.
Aqui estou tentando instanciar um contêiner Discourse “standby/secundário” em um nó/sistema diferente e separado, onde tanto o Redis quanto o pgSQL são réplicas somente leitura - como fazer isso?

O erro é autoexplicativo e a pergunta óbvia é - para mim, já que esta é minha primeira incursão no Discourse - como implantar e executar um contêiner “hot-standby” desse tipo, se é que é possível.

Você precisará ter o discourse usando o primário. Quando falhar, você usará DNS ou haproxy para mudar para o secundário.

Isso não é um problema do Discourse. Se você quiser aprender como gerenciar redis e postgres em uma configuração de alta disponibilidade, você precisará procurar em outro lugar.