最新重建已损坏

I have a long running system, never had any problems before. I always upgrade using a full rebuild, never using the built-in upgrade.

I recently did an apt-get upgrade, docker upgrade to 19.03.5 and tried a rebuild but it’s now broken. System is Ubuntu 16.04.6.

Here is my rebuild snippet:

cd /var/discourse || exit
sudo git pull
sudo docker stop maphub_forum
sudo docker rm maphub_forum
sudo ./launcher rebuild maphub_forum

Here is the full log:
diag.txt (518.9 KB)

I downgraded to Docker 18.09.9 and the problem is the same.

@j.jaffeux Should Discourse.redis be backported to stable and beta? I guess that would be easier than adding code for backwards compatibility to multiple plugins.

Yes I was hoping it wouldnt cause too much issues , but yes probably. It’s multiple commits though.

I backported to beta and stable, let me know if you encounter any issue.

@j.jaffeux Now I cant update from dashboard:

/var/www/discourse/plugins/docker_manager/lib/docker_manager/git_repo.rb:23:in `upgrade_version'
/var/www/discourse/plugins/docker_manager/lib/docker_manager/git_repo.rb:27:in `upgrading?'
/var/www/discourse/plugins/docker_manager/app/controllers/docker_manager/admin_controller.rb:42:in `block in repos'
/var/www/discourse/plugins/docker_manager/app/controllers/docker_manager/admin_controller.rb:29:in `map!'
/var/www/discourse/plugins/docker_manager/app/controllers/docker_manager/admin_controller.rb:29:in `repos'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/abstract_controller/base.rb:196:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/rendering.rb:30:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/abstract_controller/callbacks.rb:42:in `block in process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/callbacks.rb:135:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/abstract_controller/callbacks.rb:41:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/rescue.rb:22:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/instrumentation.rb:33:in `block in process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/notifications.rb:180:in `block in instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/notifications.rb:180:in `instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/instrumentation.rb:32:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/params_wrapper.rb:245:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.1/lib/active_record/railties/controller_runtime.rb:27:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/abstract_controller/base.rb:136:in `process'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionview-6.0.1/lib/action_view/rendering.rb:39:in `process'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.3/lib/mini_profiler/profiling_methods.rb:104:in `block in profile_method'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal.rb:191:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal.rb:252:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/route_set.rb:51:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/route_set.rb:33:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/mapper.rb:18:in `block in <class:Constraints>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/mapper.rb:48:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:49:in `block in serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:32:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:32:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/route_set.rb:837:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/engine.rb:526:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/railtie.rb:190:in `public_send'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/railtie.rb:190:in `method_missing'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/mapper.rb:19:in `block in <class:Constraints>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/mapper.rb:48:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:49:in `block in serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:32:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:32:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/route_set.rb:837:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-protection-2.0.7/lib/rack/protection/frame_options.rb:31:in `call'
/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:68:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/tempfile_reaper.rb:15:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/conditional_get.rb:25:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/head.rb:12:in `call'
/var/www/discourse/lib/content_security_policy/middleware.rb:12:in `call'
/var/www/discourse/lib/middleware/anonymous_cache.rb:274:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:232:in `context'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:226:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/cookies.rb:648:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/callbacks.rb:101:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/actionable_exceptions.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/debug_exceptions.rb:32:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.4.1/lib/logster/middleware/reporter.rb:43:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/rack/logger.rb:38:in `call_app'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/rack/logger.rb:28:in `call'
/var/www/discourse/config/initializers/100-quiet_logger.rb:18:in `call'
/var/www/discourse/config/initializers/100-silence_logger.rb:31:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/request_id.rb:27:in `call'
/var/www/discourse/lib/middleware/enforce_hostname.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/method_override.rb:22:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/executor.rb:14:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/sendfile.rb:111:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/host_authorization.rb:77:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.3/lib/mini_profiler/profiler.rb:296:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/message_bus-2.2.3/lib/message_bus/rack/middleware.rb:57:in `call'
/var/www/discourse/lib/middleware/request_tracker.rb:176:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/engine.rb:526:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/railtie.rb:190:in `public_send'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/railtie.rb:190:in `method_missing'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:68:in `block in call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:605:in `process_client'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:700:in `worker_loop'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:548:in `spawn_missing_workers'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:144:in `start'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/bin/unicorn:128:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `<main>'

Thanks, it works perfect now!

Is this problem even related to the new update?

You need to rebuild the container.

cd /var/discourse
git pull
./launcher rebuild app

I’m quite sure the latest changes break docker_manager as it gets updated before Discourse and thus doesn’t find Discourse.redis.

But git pull; ./launcher rebuild app does the trick, right?

I have a set of clients that I do upgrades for when a new container image is released. I usually do those upgrades soon after (1) a new container is required and (2) a new beta has been released.

I know that your ability to reliably predict the future is somewhat limited, but do you anticipate that there will be a new beta release soon?

We expect to have a beta release today or beginning next week

又出故障了。git pull 和重新构建后的完整日志:

discourse.txt|附件 (24.4 KB)

“stable”分支当前已损坏。

简短总结:tests-passed 方法奏效了,我经历了 1 天的停机。

详细说明:我认为这是当今互联网上质量最高的开源软件之一,拥有稳健的商业模式和优秀的团队。但为何其升级机制如此糟糕?

  1. 应用内升级功能导致我多次停机,因此我决定完全弃用该功能,始终采用重新构建(rebuild)的方式。
  2. 但正如本线程所示,最近两次重新构建也都导致应用严重损坏,这种情况我根本无法自行修复,只能根据这里的建议转而使用“tests-passed”分支。

为何在如此优秀的软件中,升级机制会如此糟糕?为何我运行了 5 年以上的 WordPress 站点,其内置升级机制却从未出现问题?

如果发布版本根本无法使用,那么 Discourse 推出发布版本的意义何在?重新构建始终基于某个 Git 分支,而发布版本与 Git 毫无关联。

对我来说,发布版本应是一个 Git 标签或一个 ZIP 文件。为何我不能像使用任何现代包管理器那样,直接使用 2.3.x 版本进行重新构建?

事实证明,tests-passeddiscourse.org 在其服务器上部署的版本,相比 stable 版本,它经过更充分的测试且更加可靠。如果您继续使用 tests-passed,遇到的问题会更少。如果您希望运行 stable 版本,则需要明白这将比运行 tests-passed 需要更多的工作量,例如在将升级应用到生产环境之前,需要先运行一个测试服务器来验证升级过程。

我只需要稳定可靠的东西,而且基于

tests-passeddiscourse.org 在其服务器上部署的版本,它比 stable 经过更充分的测试,也更加可靠。

我将坚持使用这个版本。但有两点仍然非常奇怪:

  • 如果它确实稳定,为什么叫 test-passed 而不是 stable?“stable”是否可以重命名为某种“legacy”?
  • 发布系统仍然令人费解。如果我们是从 Git 分支构建,那么进行发布究竟有什么意义?例如,我希望能够一直使用 2.3.x 版本,直到 2.4.x 成熟为止,但据我所知,Discourse 的模型完全无法实现这一点。

恕我直言,我不同意这一观点。Stable 版本非常可靠,而且确实稳定。Rubygems 更新了一个依赖项,导致 tests-passedstable 都出现了问题,而解决这一问题只需 回移植 一个 修复 即可。

顺便提一下,如果在 gem update 命令中将 rubygems 锁定到特定版本,本可以避免这个问题。执行 gem update --system 3.0.6 会是安全的。

Stable 版本比 tests-passed 分支修复时间更长,这纯属巧合,而且据我所知是首次出现这种情况。

我们一直这样做(将 stable 作为默认版本),六年来运行了数百个 Discourse 实例,未出现重大问题。

仅在本线程中,就有多次稳定版在重建后处于损坏状态的情况,这绝非首次。如果 discourse.org 的商业实例已通过测试,我将坚持使用它们。

我们坚持将稳定版作为默认版本已逾六年,数百个 Discourse 实例均未出现重大问题。

坚持使用稳定版与坚持使用 2.3.x 版本是截然不同的两回事。例如,稳定版不允许您在 2.4.x 足够成熟之前一直停留在 2.3.x 版本。此外,对于所有生产环境中的事物,我倾向于等到 x.x.3 或 x.x.4 版本发布后再进行升级。据我所知,目前这还无法实现。

我知道这是事实,但你可不是普通的 Discourse 管理员。:wink: 你曾多次帮我解决问题,因此我通常会把你的每句话读两遍以确保自己记住。但我仍然认为,对于大多数普通用户来说,最稳妥的做法是坚持使用 tests-passed 版本。

你可以使用 Git 提交 ID 来代替标签。

但即使我这样做,在稳定版出问题时也救不了我,对吧?在这两种情况下,问题都是缺少反向移植(backport),而我认为在任何 git 提交 ID 中同样也会缺少这一点。

因此,Discourse 并没有所谓的“发布版”,即你无法像下载 WordPress 的 zip 文件那样下载它,也无法像使用 yarn、pip 或 gem 这样的包管理器那样安装它。因为 Discourse 并非被“发布”,而是被“重建”,并且始终使用外部依赖包的实时版本。