Última reconstrucción rota

Tengo un sistema de ejecución prolongada que nunca había tenido problemas antes. Siempre actualizo mediante una reconstrucción completa, nunca usando la actualización integrada.

Recientemente ejecuté un apt-get upgrade, actualicé Docker a la versión 19.03.5 e intenté una reconstrucción, pero ahora está roto. El sistema es Ubuntu 16.04.6.

Aquí está mi fragmento de reconstrucción:

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

Aquí está el registro completo:
diag.txt|adjunto (518.9 KB)

He retrocedido a Docker 18.09.9 y el problema persiste.

@j.jaffeux ¿Debería Discourse.redis ser retrocompatibilizado en stable y beta? Supongo que eso sería más fácil que agregar código para compatibilidad hacia atrás en múltiples plugins.

Sí, esperaba que no causara demasiados problemas, pero sí, probablemente. Aunque son múltiples commits.

Lo he retrotraído a beta y estable. Avísame si encuentras algún problema.

@j.jaffeux Ahora no puedo actualizar desde el panel de control:

/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>'

¡Gracias, ahora funciona perfecto!

¿Está este problema relacionado con la nueva actualización?

Necesitas reconstruir el contenedor.

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

Estoy bastante seguro de que los últimos cambios rompen docker_manager, ya que se actualiza antes que Discourse y, por lo tanto, no encuentra Discourse.redis.

Pero git pull; ./launcher rebuild app sí funciona, ¿verdad?

Tengo un conjunto de clientes para los que realizo actualizaciones cuando se lanza una nueva imagen de contenedor. Por lo general, realizo esas actualizaciones poco después de que (1) se requiera un nuevo contenedor y (2) se haya lanzado una nueva versión beta.

Sé que tu capacidad para predecir el futuro de manera fiable es algo limitada, pero ¿esperas que haya una nueva versión beta pronto?

Esperamos tener una versión beta hoy o a principios de la próxima semana

Se ha vuelto a estropear. Registro completo tras git pull + reconstrucción:

discourse.txt|adjunto (24.4 KB)

La rama “stable” está actualmente rota.

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.