Problemas con la actualización autoalojada a 3.x: no se puede revertir

Esta actualización está fallando y, en este momento, mis 3 foros de Discourse están caídos.

La ventana de la consola en la pantalla de Actualización no muestra nada, pero el resto de la interfaz de usuario sugiere que la actualización todavía está en curso (pero esto ya ha llevado mucho más tiempo que cualquier actualización que haya hecho).

¿Alguien más está experimentando esto? ¿Alguna idea sobre cómo puedo completar la actualización con éxito?

1 me gusta

@pearsonified dado que esto incluye una actualización del componente Rails, esta es una de esas versiones que necesita una actualización desde la línea de comandos.

2 Me gusta

Ahh, ¿es ese el problema con el error de ruby 3.0 y web-push-3.0.0?

La interfaz de usuario de actualización de administrador debería decirle eso al usuario en lugar de permitirle hacer clic en “actualizar todo” y terminar con un foro completamente roto. Ahorraría muchas palpitaciones a los usuarios.

1 me gusta

Ni idea; yo personalmente nunca uso la GUI para las actualizaciones, yo personalmente solo las hago desde la línea de comandos. No vi ningún error que pareciera así. Pero tampoco lo habría hecho.

La mayoría de las veces, cuando ves un mensaje de error genérico, si el escenario específico se hubiera previsto lo suficiente como para un mensaje de error específico, se habría evitado.

Supongo que es bueno que el problema de “ayuda, mi actualización de la GUI falló” sea tan raro que la mayoría de la gente no se dé cuenta de que lo primero que hay que hacer es simplemente ir a git pull; ./launcher rebuild app para la implementación predeterminada. Casi siempre es la respuesta aquí.

Pero es lo que hay que hacer en general si la actualización de la GUI falla.

3 Me gusta

He estado usando Discourse durante muchos años. ¿Como 7? De todos modos, nunca antes una actualización web había fallado catastróficamente. Por supuesto, ha fallado, pero el foro siempre volvió a la vida porque se revirtió y se inició el contenedor antiguo.

No es un error genérico, lo de Ruby está bastante claro.

web-push-3.0.0 requiere la versión de Ruby >= 3.0, que es incompatible con la
versión actual, 2.7.6
Docker Manager: FALLÓ LA ACTUALIZACIÓN

Me estaría quejando en voz alta sobre esto si pagara por Discourse. No porque haya un gran error que mató a nuestro foro, los errores ocurren, sino porque no se ha solucionado en al menos los últimos 3 días. Tal como está, solo un poco de emoción al final del día.

1 me gusta

Desde la perspectiva del administrador de Docker, ese código, en el momento en que se escribió la versión que ya se estaba ejecutando, no sabía que en el futuro ocurriría este problema. Entiendo que estás frustrado, pero lo que pides podría no tener sentido técnico.

Si pagaras por Discourse, ellos gestionarían este proceso y tú nunca lo verías. :smiling_face:

3 Me gusta

Incluso si es técnicamente imposible de arreglar, podrías enviar correos electrónicos a los usuarios para advertirles que actualicen a través de la CLI. Haz ruido al respecto. Romper foros sin posibilidad de reversión es malo.

¿Acaso Discourse también vendía soporte para uso en instalaciones locales? De todos modos, no puedo quejarme demasiado fuerte ya que no soy un cliente de pago, pero, por Dios, 3 días no está nada mal.

1 me gusta

Me alegro de que sea la primera vez en siete años que tienes que recurrir a esto, pero:

Voy a calificar eso como una tergiversación. CDCK recomienda copias de seguridad antes de las actualizaciones como una buena práctica. He visto muchas veces aquí en meta la nota de que si la actualización de la GUI falla, recurre a la reconstrucción desde la línea de comandos, como parte de las expectativas normales para administrar tu propio foro. No rompieron foros sin reversión, por lo que tu implicación es falsa.

No me voy a quedar aquí discutiendo durante horas. Simplemente creo que no estás siendo completamente razonable aquí.

Además, actualizar un servidor de producción sin pasar dicha actualización por algún tipo de entorno de staging es pedir problemas.

No tiene que ser una copia a gran escala, un VPS de $5 será suficiente para la mayoría. Si quieres evitar el tiempo de inactividad y la necesidad de recurrir a tus copias de seguridad, es el seguro más barato que puedes conseguir.

1 me gusta

Acabo de probar esto en una instancia de DO de prueba que no se ha actualizado en mucho tiempo:

y como se informó, falló:

Fetching gem metadata from https://rubygems.org/.........
Fetching https://github.com/rails/sprockets
web-push-3.0.0 requires ruby version >= 3.0, which is incompatible with the
current version, 2.7.6
Docker Manager: FAILED TO UPGRADE
#<RuntimeError: RuntimeError>
/var/www/discourse/plugins/docker_manager/lib/docker_manager/upgrader.rb:209:in `run'
/var/www/discourse/plugins/docker_manager/lib/docker_manager/upgrader.rb:93:in `upgrade'
/var/www/discourse/plugins/docker_manager/scripts/docker_manager_upgrade.rb:19:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/fork_tracker.rb:20:in `block in fork'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/fork_tracker.rb:18:in `fork'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-7.0.3.1/lib/active_support/fork_tracker.rb:18:in `fork'
/var/www/discourse/plugins/docker_manager/scripts/docker_manager_upgrade.rb:6:in `<main>'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/commands/runner/runner_command.rb:43:in `load'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/commands/runner/runner_command.rb:43:in `perform'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.2.1/lib/thor/command.rb:27:in `run'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.2.1/lib/thor/invocation.rb:127:in `invoke_command'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.2.1/lib/thor.rb:392:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/command/base.rb:87:in `perform'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/command.rb:48:in `invoke'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/railties-7.0.3.1/lib/rails/commands.rb:18:in `<main>'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/bootsnap-1.13.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:32:in `require'
bin/rails:18:in `<main>'
Spinning up 3 Unicorn worker(s) that were stopped initially

y la página de actualización ahora muestra:

y el sitio principal devuelve un error 500. En /logs veo este error:

NoMethodError (undefined method `navigation_menu' for #<Class:0x00007fdffcb1b2f8>)
lib/wizard/builder.rb:98:in `block in build'
lib/wizard.rb:25:in `append_step'
lib/wizard/builder.rb:61:in `build'
lib/wizard.rb:110:in `requires_completion?'
lib/wizard.rb:117:in `user_requires_completion?'
app/serializers/site_serializer.rb:171:in `include_wizard_required?'
...

@pearsonified @mcdanlj ¿Pueden pegar los errores que estaban recibiendo?

No sé si podemos hacer algo ahora para evitar esto a futuros usuarios, pero lo investigaremos.

Mientras tanto, ¿los siguientes pasos ayudaron?

6 Me gusta

Ejecutaré las actualizaciones de la línea de comandos esta mañana y veré qué tal va. Los foros llevan 18 horas caídos :pensive_face:

2 Me gusta

Si me preguntaras, sí, la reconstrucción de la CLI funcionó bien. Soy un SA decente y encontré la solución en los foros de aquí, pero parece que otros propietarios de foros como @pearsonified se vieron gravemente afectados. 18 horas de inactividad, uff.

La gente que habla de entornos de staging y producción está fuera de sí. Hay mucha gente no corporativa alojando foros de Discourse en pequeñas VMs. “Deberías estar probando en un entorno de staging” es una respuesta insultante y santurrona que no justifica en absoluto haber roto su instalación. Nada justifica eso.

Solo quiero enfatizar que aprecio que este excelente software sea completamente gratuito. Estoy agradecido por eso, y los tropiezos ocasionales no cambian mis sentimientos.

2 Me gusta

Discourse es gratuito, los servidores, dominios y nuestro tiempo no lo son.

Esto no tiene nada que ver con entornos corporativos, es simplemente sentido común cuando hay tantas variables en juego. Se hace mucho trabajo para que las actualizaciones sean fluidas y si prefieres dedicar tu tiempo de forma gratuita para resolver problemas importantes, es tu decisión, pero personalmente prefiero saber que las comunidades sin fines de lucro y voluntarias que alojo estarán caídas una vez para una actualización sin problemas, en lugar de un período prolongado.

El VPS más pequeño en DO será suficiente para reducir el riesgo de las actualizaciones, siempre que la prueba sea representativa. Si eres un buen SA, esos $5 son el costo de una taza de café y una fracción de tu tarifa de mercado por hora.

La VM de stg también tendría que albergar los datos del foro, lo que duplicaría nuestros costos de alojamiento. De todos modos, no es necesario, es un foro de videojuegos y un poco de inactividad (¡no 18 horas!) está bien. En el peor de los casos, tenía una instantánea de la VM antes de la actualización, por lo que podría haberla revertido.

Encuentro preocupante que esto haya permanecido roto durante 4 días. Los fallos en las actualizaciones sin reversión deberían desencadenar un momento de “maldición, ¡esto debe arreglarse AHORA!”. Esa no debería ser una declaración controvertida.

1 me gusta

Yo también tuve el error de web-push Ruby. Foro normal, sin plugins personalizados.

web-push-3.0.0 requiere una versión de ruby >= 3.0, que es incompatible con la
versión actual, 2.7.6

Ha habido ocasiones anteriores en las que se ha dicho que debe actualizarse a través de la línea de comandos. ¿Quizás esa opción podría habilitarse ahora para la versión que esté causando este problema?

Editar: ¡Oh, de hecho lo dice!

El problema es que cuando haces una actualización de docker_manager y luego simplemente haces clic en la pestaña de arriba en lugar de actualizar la página. ¿Podría cambiarse para que se actualice a través de HTTP en lugar de simplemente cambiar pestañas con JS?

1 me gusta