最新のリビルドが壊れています

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

It broke down again. Full log after git pull + rebuild:

discourse.txt (24.4 KB)

The “stable” branch is currently broken.

短い要約:tests-passed は機能しました。1 日間のダウンタイムがありました。

詳細版:私はこれが現在インターネット上で書かれている最高品質のオープンソースソフトウェアの一つであり、堅実なビジネスモデルと素晴らしいチームを持っていると思います。なぜアップグレードメカニズムがこれほど壊れているのでしょうか?

  1. アプリ内アップグレード機能により、多くのダウンタイムが発生したため、使用を中止し、常に再構築を行うことにしました。
  2. しかし、このスレッドからわかるように、最近の 2 回の再構築のうち 2 回とも、非常に壊れたアプリが生成されました。これは私が自分で修正できず、ここでの推奨に基づいて「tests-passed」を使用するしかありませんでした。

なぜ、これほどよく書かれたソフトウェアでアップグレードメカニズムがこれほど壊れているのでしょうか?なぜ、5 年以上稼働している WordPress サイトは、組み込みのアップグレードメカニズムで問題なく動作しているのでしょうか?

Discourse にリリースがある意味は何でしょうか?それを使用する方法がまったくないのであれば。再構築は常に git ブランチから行われ、リリースは git とは何の関係もありません。

私にとって、リリースとは git タグか zip ファイルのどちらかです。なぜ、現代のあらゆるパッケージマネージャーのように、2.3.x で再構築を使用できないのでしょうか?

実は、tests-passeddiscourse.org がサーバーでデプロイしており、stable よりもテストが十分で信頼性が高いです。tests-passed を使用し続ければ、問題が少なくなります。stable を実行したい場合は、本番環境でアップグレードを実行する前にステージングサーバーでテストするなど、tests-passed を実行するよりも多くの作業が必要になることを理解しておく必要があります。

私は単に安定して信頼できるものを求めています。それは

tests-passed は、discourse.org がサーバーでデプロイしているものであり、stable よりもテストが行き届いており、より信頼性が高いものです

これに固執します。しかし、まだ 2 つの点が非常に奇妙です:

  • もし本当に安定しているなら、なぜこれを stable ではなく test-passed と呼ぶのでしょうか。「stable」は「legacy」のような名称に変更されるべきかもしれません。
  • リリースシステムがいまだに理にかなっていません。Git ブランチからビルドしているなら、そもそもリリースを行う意味は何なのでしょうか。例えば、2.4.x が成熟するまで 2.3.x に固執したいと思うのですが、Discourse のモデルではそれが全く不可能だと考えています。

失礼ながら、これには同意できません。Stable は非常に信頼性が高く、まさに「安定」しています。Rubygems が依存関係を更新したことで、tests-passedstable の両方が壊れましたが、解決策は バックポート するだけでした 修正

余談ですが、これは gem update コマンドで rubygems を特定のバージョンに固定することで回避できたはずです。gem update --system 3.0.6 とすれば安全でした。

Stable が tests-passed よりも長く壊れていたという事実は単なる偶然であり、記憶している限り、これは初めてのことです。

私たちは過去 6 年以上にわたり、多くの Discourse インスタンスでデフォルトとして stable に固執してきましたが、重大な問題はありませんでした。

このスレッド内だけでも、stable(安定版)の再構築が破損した状態で完了する事例が複数あります。初めてのことではありません。discourse.org の商用インスタンスがテストをパスしているなら、私はそれに固執するつもりです。

私たちはこの方針(デフォルトとして stable を維持すること)を、重大な問題なく、数百もの Discourse インスタンスに対して 6 年以上実施してきました。

stable に固執することと、2.3.x に固執することは全く異なります。例えば、stable では 2.4.x が十分に成熟するまで 2.3.x に留まることができません。本番環境のすべての事柄と同様に、私は x.x.3 または x.x.4 がリリースされるまでアップグレードしないことを好みます。これは現在、おそらく不可能だと思われます。

その通りだと理解しています。しかし、あなたは平均的なDiscourse管理者ではありませんね。:wink: 何度も助けていただき、普段はあなたの発言は二度読みして確実に理解するようにしていますが、それでも大多数の一般ユーザーにとっては「tests-passed」に固執するのが最も安全だと考えています。

タグの代わりにGitのコミットIDを使用することができます。

しかし、それでも安定版が破損している状況では救われませんよね?どちらの場合も問題の原因はバックポートの欠落であり、それは任意の git コミット ID でも同様に欠落しているはずです。

したがって、WordPress のように ZIP ファイルをダウンロードしたり、yarn/pip/gem のようなパッケージマネージャを使用したりする Discourse の「リリース」というものは存在しません。Discourse はリリースされるものではなく、外部パッケージのライブバージョンを常に使用して「再構築」されるものだからです。