Distribuzione fallita - exec_command.rb:117:in `spawn

Ciao ragazzi.
Prima che intasi tutto con lunghi log, li ho incollati qui sotto.
Il deployment fallisce ogni volta in questo modo. Qualcuno può condividere qualche suggerimento su quale sia il problema e come risolverlo? Apprezzerei molto.

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 è già alla versione compatibile più 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 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 Mi Piace

Auhh.. quello è Redis - essendo un principiante ci è voluto un po’ - giusto?
Ma se sì, allora come distribuirlo in modo tale che uno ci pensi, lo chiami “replica in standby”? - sì, intendo proprio un’istanza Discourse del genere.

Questa è un’installazione standard, o un’installazione di sviluppo o qualcos’altro? Hai creato il tuo redis? Per un’installazione standard, redis dovrebbe essere nel container e funzionare semplicemente.

1 Mi Piace

Ciao.
Non ho menzionato - ho presunto e lo faccio ancora - che ciò che provo non sia insolito - che sia Redis che pgSQL siano esterni al container di Discourse.
È possibile distribuire Discourse in modo più o meno standard come “standby” - nello stesso modo o in modo simile a Redis - in modo che tale istanza/distribuzione del container non fallisca?

1 Mi Piace

Sì, ma dovrai eseguire il debug del tuo server redis da solo.

L’errore è

Non puoi scrivere su una replica di sola lettura

Sembra che tu abbia creato una replica e che tu debba scrivere su quella principale. Se stai cercando di eseguire un failover, dovrai capire come passare la replica ad essere attiva e smettere di essere una replica.

Dovrai cercare aiuto altrove.

Sì. Ma il fail-over non è il problema che sto riscontrando qui, non ancora.
Qui sto cercando di istanziare un contenitore Discourse “standby/secondario” su un nodo/sistema diverso e separato, dove sia Redis che pgSQL sono repliche di sola lettura - come fare?

L’errore è autoesplicativo e la domanda ovvia è - per me, dato che è la mia primissima esperienza con Discourse - come distribuire ed eseguire un tale contenitore “hot-standby”, se è possibile.

Dovrai far sì che discourse utilizzi il primario. Quando fallisce, dovrai usare dns o haproxy per passare al secondario.

Questo non è un problema di Discourse. Se vuoi imparare a gestire redis e postgres in una configurazione ad alta disponibilità, dovrai cercare altrove.