Mise à niveau de Discourse via l'interface Web échoue et la mise à niveau SSH met hors service l'instance Discourse

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 :

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 app avant d’exécuter discourse-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

Et si on redémarrait ? À partir d’ici

Cette mise à jour nécessite le redémarrage de Docker.

Donc, oui, votre Discourse sera hors ligne pendant que vous exécutez « ./launcher rebuild app » dans la ligne de commande.

Tout sera à 100 % une fois la reconstruction terminée.

@IAmGav Docker semble fonctionner.

@rmccown ZSm8WzJ7gLigPd08D4tiwt.png)

Je vais essayer d’autres commandes du lanceur pour voir si je peux tout faire fonctionner.

@IAmGav Ran ./discourse-doctor et il a également confirmé que le conteneur Docker est en cours d’exécution.

==================== DOCKER INFO ====================
VERSION DOCKER : Docker version 20.10.11, build dea9396

PROCESSUS DOCKER (docker ps -a)

ID DU CONTENEUR   IMAGE                 COMMANDE        CRÉÉ        STATUT             PORTS                                                                      NOMS
6449ec0061a0   local_discourse/app   « /sbin/boot »   Il y a 7 semaines   En cours depuis environ une heure   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app


Le conteneur Discourse app est en cours d'exécution


@rmccown J’ai essayé start et restart sans succès.

J’obtiens toujours ceci à l’URL.

L’exécution de sudo ./launcher rebuild app échoue à nouveau avec ces messages (je parcours actuellement le fichier pour trouver des messages d’erreur antérieurs).

Quand tout le reste échoue - avez-vous essayé de le débrancher et de le rebrancher ? ;-)\n\nRedémarrez l’instance : reboot now\n\nMettez l’instance à jour : apt-get update et apt-get dist-upgrade\n\nExécutez ensuite la mise à niveau de Discourse.

1 « J'aime »

@omarfilip C’est la première chose que j’ai essayée :wink:

J’ai juste essayé un redémarrage à nouveau (aucun composant d’Ubuntu 18.04.6 à mettre à niveau depuis la mise à niveau précédente).

Mêmes résultats - erreur 502 Bad Gateway à l’URL.

Mais merci pour la suggestion.

1 « J'aime »

J’ai également trouvé ceci de novembre 2020 - Upgrade ends with FAILED TO BOOTSTRAP.

Mais je dois admettre que je ne sais pas exactement ce que signifie « suivre notre canal de publication par défaut ». Je suppose que la mise à niveau via l’interface utilisateur Web est le « canal de publication par défaut ».

Ce serait « tests-passed ». Si vous n’avez pas modifié cette ligne dans votre fichier app.yaml, vous êtes sur le canal de publication par défaut :

  ## Quelle révision Git ce conteneur doit-il utiliser ? (défaut : tests-passed)
  #version: tests-passed

pouvez-vous partager le journal complet, ce n’est pas suffisant pour voir l’erreur réelle.

J’utilise le canal de diffusion par défaut.

Et ma valeur db_shared_buffers n’est pas de 0 Mo (j’ai trouvé ce problème ici).

@IAmGav Voici un gist qui contient la sortie de ./launcher rebuild app - link

La seule indication d’ERREUR se trouve dans le groupe de lignes suivant (voir ci-dessous).

Elles semblent être liées à la création de la base de données et des rôles. Y a-t-il un moyen de contourner ces actions ? (ce que je pense que vous voudriez faire lors d’une mise à niveau puisque vous travaillez avec une instance préexistante)

Lignes 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

La même chose m’est arrivée il y a quelque temps, une mise à jour a échoué au milieu d’une mise à jour de l’interface Web ; même les messages d’erreur après une tentative de reconstruction sont à peu près les mêmes et cela n’est toujours pas résolu ; la seule différence est que j’ai pu mettre à jour via l’interface Web pendant un certain temps, sauf qu’il y a un jour ou deux, après ne pas avoir mis à jour pendant deux semaines environ, il y a maintenant la notification « Vous utilisez une ancienne version de l’image Discourse », et maintenant je ne peux plus du tout mettre à jour. :upside_down_face:

Apparemment, c’est un problème avec redis.

Tout le monde - Mise à jour de mon message original avec les informations recueillies tout au long de la journée. Merci à tous ceux qui ont posté jusqu’à présent.

Non. Il y a une autre erreur. Essayez de supprimer ce plugin.

Gem::ConflictError : Impossible d'activer omniauth-vkontakte-1.7.0, car omniauth-oauth2-1.7.2 entre en conflit avec omniauth-oauth2 (>= 1.5, <= 1.7.1)

3 « J'aime »

Suite au conseil de Michael dans le message ci-dessus, j’ai mis en commentaire un plugin dans le fichier app.yml qui provenait d’une première tentative d’authentification SSO utilisant le plugin VK (nous n’avons jamais retenu cette implémentation mais avons visiblement oublié de supprimer le plugin du fichier app.yml).

## Les plugins vont ici
## voir https://meta.discourse.org/t/19157 pour les détails
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

Après avoir mis en commentaire la ligne ci-dessus, j’ai relancé sudo ./launcher rebuild app. Après la reconstruction, le site du forum semble être opérationnel (en cours de test).

Merci encore à tous ceux qui ont pris le temps de lire mes messages et de commenter. Votre aide a été très appréciée (quelle meilleure façon de passer les fêtes de Thanksgiving ici aux États-Unis :wink:).

Restez en sécurité.

4 « J'aime »

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