NOTE : Publication originale mise à jour le 25/11/21 HNE avec de nouvelles informations
J’ai été informé de mises à jour de sécurité critiques pour mon installation Discourse. J’ai tenté de mettre à jour mon installation en utilisant l’interface Web (/admin/upgrade) comme je l’ai fait par le passé. Deux logiciels devaient être mis à niveau : Docker Manager et Discourse.
Docker Manager devait être mis à niveau en premier (le bouton de mise à niveau de Discourse était désactivé). J’ai lancé la mise à niveau de Docker Manager via l’interface Web, et elle s’est terminée avec succès. J’ai ensuite lancé la mise à niveau de Discourse, mais elle a échoué à mi-chemin. Lorsque j’ai actualisé l’interface Web, j’ai vu le message suivant :
J’ai donc suivi les instructions à l’écran, je me suis connecté au serveur via SSH, j’ai exécuté git pull puis sudo ./launcher rebuild app depuis la ligne de commande. Le processus s’est terminé mais a échoué avec un message d’erreur FAILED TO BOOTSTRAP.
Voici la sortie de deux exécutions de sudo ./launcher rebuild app à différents moments :
- launcher-rebuild-app-output-0.txt - Lignes 88-95
- launcher-rebuild-app-output-1.txt - Lignes 100-107
Les numéros de ligne après chaque fichier indiquent où se trouvent les seules ERREURS. Les deux semblent liées à la base de données et aux rôles (la différence entre les deux plages est due au fait que la seconde a tenté un git pull depuis le dépôt 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
Cela semble correspondre au message d’erreur FAILED affiché en bas de chaque tentative de reconstruction 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.
Note : Ces ERREURS ne sont pas le problème racine. Voir la “Solution” ci-dessous.
Certaines personnes ont mentionné ci-dessous un problème avec redis qui empêche une reconstruction réussie.
J’ai exécuté sudo ./discourse-doctor à différents moments de la journée. Voici la sortie de deux des exécutions :
- discourse-doctor-output-0.txt - impossible de trouver le conteneur ‘app’ en cours d’exécution ; tentative de reconstruction mais échec du redémarrage du conteneur
- discourse-doctor-output-1.txt - ‘app’ démarré manuellement avec
sudo usr/bin/docker start appavant d’exécuterdiscourse-doctor
J’ai vérifié que mon installation Docker fonctionnait correctement en exécutant 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.
J’ai exécuté sudo ./launcher cleanup pour m’assurer que j’avais suffisamment d’espace disque.
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% /
Et j’ai même vérifié mes paramètres de mémoire.
$ 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 redémarrage du serveur n’a pas résolu le problème, mais j’ai remarqué quelque chose d’intéressant après le redémarrage du serveur.
Le conteneur Docker app est en cours d’exécution après un redémarrage.
$ 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
Mais lorsque je vais sur le site, j’obtiens une erreur “502 Bad Gateway”.
Lorsque j’arrête le conteneur app et que je vais sur le site, j’obtiens une erreur “Unable To Connect” (ce qui semble normal puisque le conteneur n’est pas en cours d’exécution).
Mais cela me laisse perplexe car je n’ai pas Nginx installé sur ce serveur.
Je vois dans la sortie de reconstruction où le processus copie des fichiers Nginx d’un emplacement à un autre, mais je ne trouve pas les répertoires ou fichiers correspondants, en particulier nginx.conf sur mon serveur. Ubuntu, Docker et Discourse ne sont pas mes compétences principales, mais je suppose que ces fichiers sont copiés “à l’intérieur” du conteneur Docker app.
Merci d’avance ; j’apprécie toute aide ou orientation supplémentaire sur ce problème, qui semble survenir de temps à autre lors des mises à niveau de Discourse.
MISE À JOUR : Il s’avère que mon hypothèse concernant le système de fichiers interne du conteneur Docker app est correcte. Vous pouvez créer un instantané du système de fichiers du conteneur et explorer ce système de fichiers en utilisant bash.
# create image (snapshot) from container filesystem
$ sudo docker commit <container_id> mysnapshot
$ sudo docker run -t -i mysnapshot /bin/bash
Dans le système de fichiers app, il y a un répertoire nginx qui contient un fichier de configuration Discourse.
root@f91826d986eb:/etc/nginx/conf.d# ls -l
total 12
-rw-r--r-- 1 root root 10568 Oct 3 21:33 discourse.conf








