部署失败 - exec_command.rb:117:in `spawn

大家好。
在我在此处用长日志充斥之前,我已将日志粘贴在下方。
部署每次都以这种方式失败。任何人都可以提供有关问题是什么以及如何修复的建议吗?我将非常感激。

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 is already at latest compatible version

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 个赞

啊……那是 Redis——作为新手花了一段时间——对吧?
但是,如果是的话,那么如何部署才能让人想到它,称之为“备用副本”呢?——是的,我指的是这样的 Discourse 实例。

这是标准安装,还是开发安装,或者是其他什么?您自己制作了 Redis 吗?对于标准安装,Redis 应该在容器内,并且可以正常工作。

1 个赞

您好。
我没有提到——我推测并且仍然认为,我尝试的不是不常见的——Redis 和 pgSQL 都独立于 Discourse 容器。
是否有可能以“备用”的、或多或少标准的方式部署 Discourse——以与 Redis 相同/相似的方式——这样就不会出现容器实例化/部署失败的情况?

1 个赞

是的,但您需要自行调试您的 redis 服务器。

错误是

您无法写入只读副本

看起来您创建了一个副本,并且需要写入主副本。如果您正在尝试故障转移,那么您需要弄清楚如何将副本切换为活动状态,而不是作为副本。

您需要到别处寻求帮助。

是的。但故障转移不是我这里遇到的问题,至少目前不是。
我在这里尝试在另一个独立的节点/系统上实例化一个“备用/次要”的 Discourse 容器,其中 Redis 和 pgSQL 都是只读副本——该如何操作?

错误信息不言自明,显而易见的问题是——对我来说,这是我第一次接触 Discourse——如何部署和运行这样一个“热备用”容器,如果可能的话。

您需要让 discourse 使用主服务器。当它失败时,您可以使用 DNS 或 haproxy 切换到备用服务器。

这不是 discourse 的问题。如果您想了解如何在高可用性设置中管理 redis 和 postgres,您需要到别处去查找。