Aggiornamento di Discourse tramite interfaccia Web fallito e aggiornamento SSH mette fuori uso l'istanza di Discourse

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:

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:

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

Che ne dici di riavviare? Da qui

Questo aggiornamento richiede il riavvio di Docker.

Quindi, sì, il tuo discourse sarà offline mentre esegui ‘./launcher rebuild app’ nella riga di comando.

Tutto sarà al 100% una volta completata la ricostruzione.

@IAmGav Docker sembra essere in esecuzione.

@rmccown ZSm8WzJ7gLigPd08D4tiwt.png)

Proverò alcuni degli altri comandi del launcher per vedere se riesco a far funzionare le cose.

@IAmGav Ran ./discourse-doctor e ha anche confermato che il container Docker è in esecuzione.

==================== INFORMAZIONI DOCKER ====================
VERSIONE DOCKER: Docker version 20.10.11, build dea9396

PROCESSI DOCKER (docker ps -a)

ID CONTAINER   IMMAGINE              COMANDO        CREATO        STATO             PORTE                                                                      NOMI
6449ec0061a0   local_discourse/app   "/sbin/boot"   7 settimane fa   Attivo da circa un'ora   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app


Il container Discourse app è in esecuzione


@rmccown Ho provato sia start che restart senza successo.

Ottengo ancora questo all’URL.

L’esecuzione di sudo ./launcher rebuild app fallisce nuovamente con questi messaggi (attualmente sto esaminando il file per messaggi di errore precedenti).

Quando tutto il resto fallisce, hai provato a scollegarlo e ricollegarlo? :wink:

Riavvia l’istanza: reboot now

Aggiorna l’istanza all’ultima versione: apt-get update e apt-get dist-upgrade

Quindi esegui l’aggiornamento di Discourse.

1 Mi Piace

@omarfilip È la prima cosa che ho provato :wink:

Ho appena riprovato un riavvio (nessun componente di Ubuntu 18.04.6 da aggiornare dal precedente aggiornamento).

Stessi risultati: errore 502 Bad Gateway all’URL.

Ma grazie per il suggerimento.

1 Mi Piace

Ho anche trovato questo di novembre 2020 - Upgrade ends with FAILED TO BOOTSTRAP.

Ma devo ammettere che non so esattamente cosa significhi “seguire il nostro canale di rilascio predefinito”. Presumo che l’aggiornamento tramite l’interfaccia utente Web sia il “canale di rilascio predefinito”.

Sarebbe “tests-passed”. Se non hai modificato questa riga nel tuo file app.yaml, allora sei sul canale di rilascio predefinito:

  ## Quale revisione Git dovrebbe usare questo container? (predefinito: tests-passed)
  #version: tests-passed

puoi condividere l’intero log, questo non è sufficiente per vedere l’errore effettivo.

Sto usando il canale di rilascio predefinito.

E il mio valore di db_shared_buffers non è 0 MB (ho trovato quel problema qui).

@IAmGav Ecco un gist che contiene l’output di ./launcher rebuild app - link

L’unica indicazione di ERRORE si trova nel seguente gruppo di righe (vedi sotto).

Sembrano essere correlate alla creazione del database e dei ruoli. C’è un modo per aggirare queste azioni? (cosa che penso vorresti fare durante un aggiornamento dato che stai lavorando con un’istanza preesistente)

Righe 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

Letteralmente la stessa cosa è successa anche a me un po’ di tempo fa, un aggiornamento è fallito nel bel mezzo di un aggiornamento dell’interfaccia web; anche i messaggi di errore dopo un tentativo di ricostruzione sono praticamente gli stessi e sono ancora irrisolti; l’unica differenza è che ho potuto aggiornare tramite l’interfaccia web per un po’, tranne che un paio di giorni fa, dopo non aver aggiornato per circa due settimane, ora ha l’avviso “Stai eseguendo una versione obsoleta dell’immagine di Discourse”, e ora non posso più aggiornare. :faccina_sottosopra:

Apparentemente è un problema con redis.

Tutti - Ho aggiornato il mio post originale con le informazioni raccolte durante la giornata. Grazie a tutti coloro che hanno postato finora.

No. C’è un altro errore. Prova a rimuovere quel plugin.

Gem::ConflictError: Impossibile attivare omniauth-vkontakte-1.7.0, perché omniauth-oauth2-1.7.2 è in conflitto con omniauth-oauth2 (>= 1.5, <= 1.7.1)

3 Mi Piace

Seguendo il consiglio di Michael nel post precedente, ho commentato un plug-in nel file app.yml che proveniva da un tentativo iniziale di autenticazione SSO utilizzando il plug-in VK (non abbiamo mai adottato questa implementazione ma ovviamente abbiamo dimenticato di rimuovere il plug-in dal file app.yml).

## I plug-in vanno qui
## vedi https://meta.discourse.org/t/19157 per i dettagli
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

Dopo aver commentato la riga sopra, ho eseguito nuovamente sudo ./launcher rebuild app. Dopo la ricostruzione, il sito del forum sembra essere attivo e funzionante (sto testando ora).

Grazie ancora a tutti coloro che hanno dedicato del tempo a rivedere i miei post e a commentare. Il vostro aiuto è stato molto apprezzato (quale modo migliore per trascorrere la festa del Ringraziamento qui negli Stati Uniti :wink:).

State al sicuro.

4 Mi Piace

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