Fallo en el despliegue - exec_command.rb:117:in `spawn

Hola chicos.
Antes de saturar aquí con registros largos, los pegué abajo.
El despliegue falla cada vez de esta manera. ¿Alguien puede compartir alguna sugerencia sobre cuál es el problema y cómo solucionarlo? Lo agradecería mucho.

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 ya está en la última versión compatible

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 You can't write against a read only replica. script: bcec1d9b3bbcfb089dc0b7316771be9f011872b6, on @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' failed with return #<Process::Status: pid 687 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
1 me gusta

Auhh.. eso es Redis - ser un novato tomó tiempo - ¿verdad?
Pero si es así, ¿cómo desplegarlo de una manera tal que uno pensaría en ello, lo llamaría “réplica en espera”? - sí, esa instancia de Discourse me refiero.

¿Es esta una instalación estándar, una instalación de desarrollo o algo más? ¿Hiciste tu propia instancia de Redis? Para una instalación estándar, Redis debería estar en el contenedor y funcionar sin problemas.

1 me gusta

Hola.
No mencioné, asumí y sigo asumiendo que lo que intento no es poco común: que tanto Redis como pgSQL están fuera del contenedor de Discourse.
¿Es posible implementar Discourse de una manera más o menos estándar como “standby”, de la misma o similar manera que Redis, para que la instancia/implementación de dicho contenedor no falle?

1 me gusta

Sí, pero tendrás que depurar tu servidor redis por tu cuenta.

El error es

No puedes escribir contra una réplica de solo lectura

Parece que has creado una réplica y necesitas escribir en la principal. Si intentas conmutar por error, tendrás que averiguar cómo cambiar la réplica para que esté activa y deje de ser una réplica.

Necesitarás obtener esa ayuda en otro lugar.

Sí. Pero la conmutación por error no es el problema que tengo aquí, todavía no.
Aquí estoy intentando instanciar un contenedor de Discourse “en espera/secundario” en un nodo/sistema diferente y separado, donde tanto Redis como pgSQL son réplicas de solo lectura. ¿Cómo hacerlo?

El error se explica por sí mismo y la pregunta obvia es, para mí, ya que es mi primera incursión en Discourse, ¿cómo desplegar y ejecutar un contenedor “en espera activa” de este tipo, si es que es posible?

Necesitarás que discourse use el primario. Cuando falle, usarás dns o haproxy para cambiar al secundario.

Esto no es un problema de Discourse. Si quieres aprender a gestionar redis y postgres en una configuración de alta disponibilidad, tendrás que buscar en otro lugar.