Última reconstrucción rota

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.

Resumen breve: tests-passed funcionó, tuve un tiempo de inactividad de 1 día.

Versión más larga: Creo que este es uno de los programas de código abierto de mayor calidad escritos en internet hoy en día, con un modelo de negocio sólido y un gran equipo. ¿Cómo es posible que el mecanismo de actualización esté tan roto?

  1. La función de actualización dentro de la aplicación me causó tantos tiempos de inactividad que decidí no usarla en absoluto, y en su lugar siempre realizar una reconstrucción.
  2. Pero como pueden ver en este hilo, en las últimas 2 de 2 ocasiones, la reconstrucción también dejó la aplicación muy rota, algo que no podía arreglar por mí mismo, salvo acudir a “tests-passed” siguiendo las recomendaciones aquí.

¿Por qué el mecanismo de actualización está tan roto en un software tan bien escrito? ¿Por qué tengo sitios de WordPress de más de 5 años funcionando sin problemas con su mecanismo de actualización integrado?

¿Cuál es el punto de tener versiones en Discourse si literalmente no hay forma de usarlas? Una reconstrucción siempre es desde una rama de git y las versiones no tienen nada que ver con git.

Para mí, una versión sería o bien una etiqueta de git o un archivo zip. ¿Por qué no puedo simplemente usar reconstrucción con 2.3.x, como podría hacerlo con cualquier gestor de paquetes moderno hoy en día?

Resulta que tests-passed es la versión que discourse.org despliega en sus servidores, y está mejor probada y es más fiable que stable. Si te mantienes en tests-passed, tendrás menos problemas. Si deseas ejecutar stable, debes tener en cuenta que requerirá más trabajo que ejecutar tests-passed, como poner en marcha un servidor de staging para probar las actualizaciones antes de aplicarlas en producción.

Solo quiero algo que sea estable y confiable, y basado en

tests-passed es lo que discourse.org despliega en sus servidores y está mejor probado y es más confiable que stable.

Me quedaré con esto. Dos cosas siguen siendo muy extrañas:

  • ¿Por qué se llama test-passed y no stable, si realmente es estable? “stable” podría renombrarse a algo como “legacy”.
  • El sistema de lanzamientos aún no tiene sentido. Si estamos construyendo desde una rama de Git, ¿cuál es el propósito de hacer lanzamientos en absoluto? Me encantaría poder quedarme con la versión 2.3.x hasta que la 2.4.x madure, por ejemplo, y creo que con el modelo de Discourse esto no es posible en absoluto.

Con todo respeto, pero no estoy de acuerdo con esto. Stable es muy fiable y, bueno, estable. Rubygems actualizó una dependencia que rompió tanto tests-passed como stable, y resolverlo fue simplemente cuestión de hacer un backport de una solución.

Por cierto, esto se podría haber evitado fijando rubygems a una versión específica en el comando gem update. gem update --system 3.0.6 habría sido seguro.

El hecho de que stable estuviera roto por más tiempo que tests-passed es solo una coincidencia y, hasta donde recuerdo, una primera vez.

Hemos estado haciendo esto (mantener stable como predeterminado) durante más de seis años con cientos de instancias de Discourse sin problemas significativos.

Solo en este hilo hay múltiples ocasiones en las que la versión estable dejó de funcionar correctamente, definitivamente no es la primera vez. Si las instancias comerciales de discourse.org han superado las pruebas, me quedaré con esa.

Hemos estado haciendo esto (mantener la versión estable como predeterminada) durante más de seis años con cientos de instancias de Discourse sin problemas significativos.

Mantenerse en la versión estable y mantenerse en la 2.3.x son cosas muy diferentes. Por ejemplo, la versión estable no te permite quedarte en la 2.3.x hasta que la 2.4.x madure lo suficiente. Por ejemplo, con todo lo que está en producción, prefiero no actualizar hasta que salga la x.x.3 o la x.x.4. Creo que hoy en día esto no es posible.

Sé que es cierto, pero tú no eres el administrador promedio de Discourse. :wink: Me has salvado un montón de veces y, por norma general, leo todo lo que dices dos veces para asegurarme de recordarlo, pero sigo pensando que para la mayoría de las personas normales lo más seguro es quedarse con tests-passed.

Puedes usar un ID de commit de git en lugar de una etiqueta.

Pero incluso si lo hago, eso no me salvará en una situación donde la versión estable esté rota, ¿verdad? En ambos casos, el problema fue la falta de un backport, y eso también faltaría en cualquier ID de commit de git, creo.

Por lo tanto, no existe algo así como una “versión” de Discourse donde descargues un archivo zip al estilo de WordPress o uses un gestor de paquetes como yarn/pip/gem, simplemente porque Discourse no se “lanza”, sino que se “reconstruye” siempre utilizando versiones en vivo de paquetes externos.