NOTA: Post originale aggiornato il 25/11/21 EST con nuove informazioni
Avvisato di aggiornamenti critici di sicurezza alla mia installazione di Discourse, ho tentato di aggiornare la mia installazione utilizzando l’interfaccia utente Web (/admin/upgrade) come ho fatto in passato. C’erano due pezzi di software che dovevano essere aggiornati: Docker Manager e Discourse.
Docker Manager doveva essere aggiornato per primo (il pulsante di aggiornamento di Discourse era disabilitato). Ho avviato l’aggiornamento di Docker Manager utilizzando l’interfaccia utente Web e questo è stato completato con successo. Ho quindi avviato l’aggiornamento di Discourse, ma è fallito a metà. Quando ho aggiornato l’interfaccia utente Web, ho visto il seguente messaggio:
Quindi, seguendo le istruzioni a schermo, mi sono collegato via SSH al server, ho eseguito un git pull e poi ho eseguito sudo ./launcher rebuild app dalla riga di comando. Il processo è terminato ma è fallito con un messaggio di errore FAILED TO BOOTSTRAP.
Ecco l’output di due esecuzioni di sudo ./launcher rebuild app in momenti diversi:
- launcher-rebuild-app-output-0.txt - Righe 88-95
- launcher-rebuild-app-output-1.txt - Righe 100-107
I numeri di riga dopo ogni file sono dove compaiono gli unici ERRORI. Entrambi sembrano essere relativi al database e ai ruoli (la differenza tra entrambi gli intervalli è dovuta al fatto che il secondo ha tentato un git pull dal repository 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
Questo sembra coincidere con il messaggio di errore FAILED visualizzato in fondo a ogni tentativo di Rebuild di 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: Questi ERRORI non sono il problema principale. Vedere “Soluzione” sotto.
Alcune persone qui sotto hanno affermato che c’è un problema con redis che impedisce un rebuild riuscito.
Ho eseguito sudo ./discourse-doctor in vari momenti della giornata. Ecco l’output di due delle esecuzioni:
- discourse-doctor-output-0.txt - impossibile trovare il container ‘app’ in esecuzione; tentato il rebuild ma il container non è stato riavviato
- discourse-doctor-output-1.txt - ‘app’ avviato manualmente con
sudo usr/bin/docker start appprima di eseguirediscourse-doctor
Ho verificato che la mia installazione di Docker funzionasse correttamente eseguendo 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.
Ho eseguito sudo ./launcher cleanup per assicurarmi di avere abbastanza spazio su 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 ho persino controllato le mie impostazioni di 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 riavvio del server non ha risolto il problema, ma ho notato qualcosa di interessante dopo il riavvio del server.
Il container Docker app è in esecuzione dopo un riavvio.
$ 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
Ma quando accedo al sito, ricevo un errore “502 Bad Gateway”.
Quando interrompo il container app e accedo al sito, ricevo un errore “Unable To Connect” (il che sembra giusto dato che il container non è in esecuzione).
Ma questo mi lascia perplesso perché non ho installato Nginx su questo server.
Posso vedere nell’output del Rebuild dove il processo sta copiando i file Nginx da una posizione all’altra, ma non riesco a trovare le directory o i file corrispondenti, in particolare nginx.conf sul mio server. Ubuntu, Docker e Discourse non sono le mie competenze principali, ma suppongo che questi file vengano copiati “all’interno” del container Docker app.
Grazie in anticipo; apprezzo qualsiasi ulteriore aiuto o indicazione su questo problema, che sembra emergere di tanto in tanto durante gli aggiornamenti di Discourse.
AGGIORNAMENTO: Si scopre che la mia ipotesi riguardo al container Docker app che ha il proprio filesystem interno è corretta. È possibile creare uno snapshot del filesystem del container ed esplorare questo filesystem usando bash.
# create image (snapshot) from container filesystem
$ sudo docker commit <container_id> mysnapshot
$ sudo docker run -t -i mysnapshot /bin/bash
Nel filesystem dell’app, c’è una directory nginx che contiene un file di configurazione di Discourse.
root@f91826d986eb:/etc/nginx/conf.d# ls -l
total 12
-rw-r--r-- 1 root root 10568 Oct 3 21:33 discourse.conf








