La actualización de Discourse a través de la interfaz web falla y la actualización SSH derriba la instancia de Discourse

NOTA: Publicación original actualizada el 25/11/21 PM EST con nueva información

Se me notificó sobre actualizaciones críticas de seguridad para mi instalación de Discourse. Intenté actualizar mi instalación usando la Interfaz de Usuario Web (/admin/upgrade) como lo he hecho en el pasado. Había dos piezas de software que necesitaban ser actualizadas: Docker Manager y Discourse.

Docker Manager tuvo que ser actualizado primero (el botón de actualización de Discourse estaba deshabilitado). Inicié la actualización de Docker Manager usando la Interfaz de Usuario Web y se completó con éxito. Luego inicié la actualización de Discourse, pero falló a mitad de camino. Al actualizar la Interfaz de Usuario Web, vi el siguiente mensaje:

Así que, siguiendo las instrucciones en pantalla, me conecté por SSH al servidor, ejecuté git pull y luego sudo ./launcher rebuild app desde la línea de comandos. El proceso terminó, pero falló con un mensaje de error “FAILED TO BOOTSTRAP”.

Aquí está la salida de dos ejecuciones de sudo ./launcher rebuild app en diferentes momentos:

Los números de línea después de cada archivo son donde aparecen los únicos ERRORES. Ambos parecen estar relacionados con la base de datos y los roles (la diferencia entre ambos rangos se debe a que el segundo intentó un git pull desde el repositorio discourse/base).

2021-11-25 21:21:38.451 UTC [64] postgres@postgres ERROR:  database "discourse" already exists
2021-11-25 21:21:38.451 UTC [64] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: error: database creation failed: ERROR:  database "discourse" already exists
I, [2021-11-25T21:21:38.454429 #1]  INFO -- :
I, [2021-11-25T21:21:38.454908 #1]  INFO -- : > su postgres -c 'psql discourse -c "create user discourse;"' || true
2021-11-25 21:21:38.531 UTC [68] postgres@discourse ERROR:  role "discourse" already exists
2021-11-25 21:21:38.531 UTC [68] postgres@discourse STATEMENT:  create user discourse;
ERROR:  role "discourse" already exists

Esto parece coincidir con el mensaje de error FAILED que se muestra en la parte inferior de cada intento de Reconstrucción de Launcher.

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 436 exit 1>
Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
13bbdd52e0835ba9dfddc5c367d63b6087a16553c3a77d27ca307734d6e16907
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.

Nota: Estos ERRORES no son el problema raíz. Ver “Solución” abajo.

Algunas personas a continuación han dicho que hay un problema con redis que está impidiendo una reconstrucción exitosa.

Ejecuté sudo ./discourse-doctor en varios momentos del día. Aquí está la salida de dos de las ejecuciones:

  • discourse-doctor-output-0.txt - no se pudo encontrar el contenedor ‘app’ en ejecución; se intentó la reconstrucción pero falló al reiniciar el contenedor
  • discourse-doctor-output-1.txt - ‘app’ se inició manualmente con sudo usr/bin/docker start app antes de ejecutar discourse-doctor

Verifiqué que mi instalación de Docker estuviera funcionando correctamente ejecutando sudo docker run -it --rm hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:cc15c5b292d8525effc0f89cb299f1804f3a725c8d05e158653a563f15e4f685
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

Ejecuté sudo ./launcher cleanup para asegurarme de tener suficiente espacio en disco.

WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
<DETAILS REMOVED>

Total reclaimed space: 3.836GB

$ df -hT /dev/xvda1
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/xvda1     ext4   30G  9.1G   20G  32% /

E incluso revisé la configuración de mi memoria.

$ free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        304M        633M         20M        1.0G        1.5G
Swap:          2.0G          0B        2.0G

Un reinicio del servidor no resolvió el problema, pero noté algo interesante después de reiniciar el servidor.

El contenedor app de Docker se está ejecutando después de un reinicio.

$ sudo docker ps
CONTAINER ID   IMAGE                 COMMAND        CREATED       STATUS          PORTS                                                                      NAMES
6449ec0061a0   local_discourse/app   “/sbin/boot”   7 weeks ago   Up 25 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app

Pero cuando accedo al sitio, obtengo un error “502 Bad Gateway”.

Cuando detengo el contenedor app y accedo al sitio, obtengo un error “Unable To Connect” (lo cual parece correcto ya que el contenedor no se está ejecutando).

Pero esto me desconcierta ya que no tengo Nginx instalado en este servidor.

Puedo ver en la salida de Rebuild dónde el proceso está copiando archivos de Nginx de una ubicación a otra, pero no puedo encontrar los directorios o archivos correspondientes, específicamente nginx.conf en mi servidor en ningún lugar. Ubuntu, Docker y Discourse no son mis habilidades principales, pero supongo que estos archivos se copian “dentro” del contenedor app de Docker.

Gracias de antemano; aprecio cualquier ayuda o dirección adicional con este problema, que parece surgir de vez en cuando durante las actualizaciones de Discourse.

ACTUALIZACIÓN: Resulta que mi suposición sobre que el contenedor app de Docker tiene su propio sistema de archivos interno es correcta. Puedes crear una instantánea del sistema de archivos del contenedor y explorar este sistema de archivos usando bash.

# create image (snapshot) from container filesystem
$ sudo docker commit <container_id> mysnapshot
$ sudo docker run -t -i mysnapshot /bin/bash

En el sistema de archivos de app, hay un directorio nginx que contiene un archivo de configuración de Discourse.

root@f91826d986eb:/etc/nginx/conf.d# ls -l
total 12
-rw-r--r-- 1 root root 10568 Oct  3 21:33 discourse.conf

¿Qué tal reiniciar? Desde aquí

Esta actualización requiere que se reinicie el docker.

Por lo tanto, sí, su discourse estará sin conexión mientras ejecuta ‘./launcher rebuild app’ en la línea de comandos.

Todo estará al 100% una vez que se complete la reconstrucción.

@IAmGav Docker parece estar en ejecución.

@rmccown ZSm8WzJ7gLigPd08D4tiwt.png)

Intentaré con otros comandos del lanzador para ver si puedo poner todo en marcha.

@IAmGav Ejecuta ./discourse-doctor y también confirmó que el contenedor de Docker se está ejecutando.

==================== INFORMACIÓN DE DOCKER ====================
VERSIÓN DE DOCKER: Docker version 20.10.11, build dea9396

PROCESOS DE DOCKER (docker ps -a)

CONTAINER ID   IMAGE                 COMMAND        CREADO        ESTADO             PUERTOS                                                                      NOMBRES
6449ec0061a0   local_discourse/app   “/sbin/boot”   hace 7 semanas   Arriba hace una hora   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app


El contenedor de Discourse app se está ejecutando


@rmccown Intenté tanto start como restart sin éxito.

Todavía obtengo esto en la URL.

Ejecutar sudo ./launcher rebuild app nuevamente falla con estos mensajes (actualmente estoy revisando el archivo en busca de mensajes de error anteriores).

Cuando todo lo demás falle, ¿has probado a desenchufarlo y volver a enchufarlo? :wink:

Reinicia la instancia: reboot now

Actualiza la instancia a la última versión: apt-get update y apt-get dist-upgrade

Luego ejecuta la actualización de Discourse.

1 me gusta

@omarfilip Ese es lo primero que intenté :wink:

Volví a intentar un reinicio (no hay componentes de Ubuntu 18.04.6 para actualizar de una actualización anterior).

Mismos resultados: error 502 Bad Gateway en la URL.

Pero gracias por la sugerencia.

1 me gusta

También acabo de encontrar esto de noviembre de 2020: La actualización termina con FAILED TO BOOTSTRAP.

Pero tengo que admitir que no sé exactamente qué significa “seguir nuestro canal de lanzamiento predeterminado”. Supongo que actualizar a través de la interfaz de usuario web es el “canal de lanzamiento predeterminado”.

Eso sería “tests-passed”. Si no has modificado esta línea en tu archivo app.yaml, entonces estás en el canal de lanzamiento predeterminado:

  ## ¿Qué revisión de Git debe usar este contenedor? (predeterminado: tests-passed)
  #version: tests-passed

¿Puedes compartir el log completo? Esto no es suficiente para ver el error real.

Estoy usando el canal de lanzamiento predeterminado.

Y mi valor de db_shared_buffers no es 0 MB (encontré ese problema aquí).

@IAmGav Aquí tienes un gist que contiene la salida de ./launcher rebuild app - link

La única indicación de ERROR está en el siguiente grupo de líneas (ver abajo).

Parecen estar relacionadas con la creación de la base de datos y los roles. ¿Hay alguna forma de omitir estas acciones? (lo que creo que querrías hacer durante una actualización, ya que estás trabajando con una instancia preexistente)

Líneas 88-95

2021-11-25 21:21:38.451 UTC [64] postgres@postgres ERROR:  database "discourse" already exists
2021-11-25 21:21:38.451 UTC [64] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: error: database creation failed: ERROR:  database "discourse" already exists
I, [2021-11-25T21:21:38.454429 #1]  INFO -- :
I, [2021-11-25T21:21:38.454908 #1]  INFO -- : > su postgres -c 'psql discourse -c "create user discourse;"' || true
2021-11-25 21:21:38.531 UTC [68] postgres@discourse ERROR:  role "discourse" already exists
2021-11-25 21:21:38.531 UTC [68] postgres@discourse STATEMENT:  create user discourse;
ERROR:  role "discourse" already exists

Literalmente me pasó exactamente lo mismo hace un tiempo, una actualización falló en medio de una actualización de la Interfaz de Usuario Web; incluso los mensajes de error después de un intento de reconstrucción son prácticamente los mismos y todavía no está resuelto; la única diferencia es que pude actualizar a través de la Interfaz de Usuario Web por un tiempo, excepto que hace un par de días, después de no actualizar durante unas dos semanas, ahora tiene el aviso de “Estás ejecutando una versión antigua de la imagen de Discourse”, y ahora no puedo actualizar en absoluto. :cara_invertida:

Aparentemente es un problema con redis.

Todos - Actualicé mi publicación original con información recopilada durante el día. Gracias a todos los que han publicado hasta ahora.

No. Hay otro error. Intenta eliminar ese plugin.

Gem::ConflictError: No se puede activar omniauth-vkontakte-1.7.0, porque omniauth-oauth2-1.7.2 entra en conflicto con omniauth-oauth2 (>= 1.5, <= 1.7.1)

3 Me gusta

Siguiendo el consejo de Michael en la publicación anterior, comenté un plugin en el archivo app.yml que provenía de un intento inicial de autenticación SSO usando el plugin VK (nunca seguimos con esta implementación, pero obviamente olvidamos eliminar el plugin del archivo app.yml).

## Los plugins van aquí
## ver https://meta.discourse.org/t/19157 para detalles
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
##          - git clone https://github.com/discourse/discourse-vk-auth.git

Después de comentar la línea anterior, ejecuté sudo ./launcher rebuild app nuevamente. Después de la reconstrucción, el sitio del foro parece estar en funcionamiento (probando ahora).

Gracias de nuevo a todos los que se tomaron el tiempo de revisar mis publicaciones y comentar. Su ayuda fue muy apreciada (qué mejor manera de pasar las vacaciones de Acción de Gracias aquí en EE. UU. :wink:).

Manténganse a salvo.

4 Me gusta

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.