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:
- launcher-rebuild-app-output-0.txt - Líneas 88-95
- launcher-rebuild-app-output-1.txt - Líneas 100-107
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 appantes de ejecutardiscourse-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








