Problema nell'aggiornamento di Discourse

Ciao,

Sto aggiornando Discourse da v2.3.0.beta8 +212 a 2.4.0.beta1.

Per prima cosa ho aggiornato il gestore Docker tramite l’interfaccia web. Successivamente, l’interfaccia web mi ha comunicato che era necessario eseguire l’aggiornamento da riga di comando, quindi l’ho fatto.

Ho riscontrato errori ripetuti durante l’aggiornamento. Eseguito:

cd /var/discourse
su ./launcher rebuild app

Il processo gira per alcuni minuti, quindi fallisce durante l’aggiornamento del database. Ho riavviato il server, che ha riportato Discourse online (ma non aggiornato), e ho riprovato. Lo stesso errore.

Hai qualche suggerimento su come procedere?

Ecco le ultime righe visualizzate quando eseguo il rebuild:

Optimizing site icons...
I, [2019-07-09T01:22:18.589503 #13]  INFO -- : Terminating async processes
I, [2019-07-09T01:22:18.589624 #13]  INFO -- : Sending INT to HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/10/bin/postmaster -D /etc/postgresql/10/main pid: 67
I, [2019-07-09T01:22:18.589816 #13]  INFO -- : Sending TERM to exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 183
2019-07-09 01:22:18.589 UTC [67] LOG:  received fast shutdown request
183:signal-handler (1562635338) Received SIGTERM scheduling shutdown...
2019-07-09 01:22:18.593 UTC [67] LOG:  aborting any active transactions
2019-07-09 01:22:18.599 UTC [67] LOG:  worker process: logical replication launcher (PID 76) exited with exit code 1
2019-07-09 01:22:18.599 UTC [71] LOG:  shutting down
2019-07-09 01:22:18.629 UTC [67] LOG:  database system is shut down
183:M 09 Jul 2019 01:22:18.645 # User requested shutdown...
183:M 09 Jul 2019 01:22:18.645 * Saving the final RDB snapshot before exiting.
183:M 09 Jul 2019 01:22:18.672 * DB saved on disk
183:M 09 Jul 2019 01:22:18.672 # Redis is now ready to exit, bye bye...


FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 366 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'"]}
cbaaf74d12f5c22faf7f054d391f3570b5e7d8dd3b8bce421c57ef17c4b43c55
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one

Modifica: Gli unici errori nel log completo sono questi:

I, [2019-07-09T01:21:35.162142 #13]  INFO -- : > su postgres -c 'createdb discourse' || true
2019-07-09 01:21:35.330 UTC [80] postgres@postgres ERROR:  database "discourse" already exists
2019-07-09 01:21:35.330 UTC [80] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: database creation failed: ERROR:  database "discourse" already exists
I, [2019-07-09T01:21:35.332706 #13]  INFO -- :
I, [2019-07-09T01:21:35.333101 #13]  INFO -- : > su postgres -c 'psql discourse -c "create user discourse;"' || true
2019-07-09 01:21:35.444 UTC [91] postgres@discourse ERROR:  role "discourse" already exists
2019-07-09 01:21:35.444 UTC [91] postgres@discourse STATEMENT:  create user discourse;
ERROR:  role "discourse" already exists

Ho notato che si interrompe dopo “Optimizing Site Icons…” — forse c’è un problema qui?

Potresti provare a cercare “error role discourse already exists”

Ho cercato con quel termine, ma non ho trovato nulla di utile.

  • Alcuni post menzionavano plugin; ho disattivato i plugin in app.yml
  • Ho ricevuto un messaggio riguardo a una versione obsoleta di Docker e l’ho aggiornata
  • Ho eseguito discourse doctor

Stessi errori.

In allegato c’è l’output di launch rebuild.

Qualche suggerimento su come procedere?

rebuild script.txt (140,9 KB)

Vale la pena notare che nel mio app.xml ho un root URL relativo. Potrebbe questo stare causando problemi all’aggiornamento?

env:
  DISCOURSE_RELATIVE_URL_ROOT: /epicenter/support

run:
  - exec: echo "Inizio dei comandi personalizzati"

  - exec:
        cd: $home
        cmd:
          - mkdir -p public/epicenter/support
          - cd public/epicenter/support && ln -s ../../uploads && ln -s ../../backups
          - rm public/uploads
          - rm public/backups
  - replace:
       global: true
       filename: /etc/nginx/conf.d/discourse.conf
       from: proxy_pass http://discourse;
       to: |
          rewrite ^/(.*)$ /epicenter/support/$1 break;
          proxy_pass http://discourse;
  - replace:
       filename: /etc/nginx/conf.d/discourse.conf
       from: etag off;
       to: |
          etag off;
          location /epicenter/support {
             rewrite ^/epicenter/support/?(.*)$ /$1;
          }
  - replace:
         filename: /etc/nginx/conf.d/discourse.conf
         from: $proxy_add_x_forwarded_for
         to: $http_fastly_client_ip
         global: true

Infine ho fatto funzionare tutto durante la mia terza o quarta sessione di lavoro. Il problema sembrava essere la mancanza di immagini nella cartella “uploads”. La soluzione è stata creare una nuova installazione, utilizzare lo stesso file “app.yml” e ripristinare dal backup con file fittizi per le immagini mancanti.

Parallelamente al problema originale, ho notato che dopo un precedente aggiornamento varie icone e immagini erano scomparse. Quando ho provato a ricostruire, i log mostravano che il processo si interrompeva dopo “ottimizzazione delle immagini del sito”. Penso che si sia bloccato su un’immagine mancante e si sia arrestato senza registrare quell’errore specifico. (non c’era alcun indizio che il problema fosse la mancanza di immagini o quali file di immagine mancassero).

Alla fine, ho creato una nuova installazione di Discourse con l’ultima versione. Ho ripristinato dal backup seguendo le istruzioni qui. Ci sono voluti tre tentativi.

Innanzitutto, lo script di backup ha generato un errore cercando i file caricati, quindi ho copiato la cartella uploads/default dai miei file di backup precedenti.

Ho eseguito nuovamente lo script di ripristino. Questa volta ha restituito un errore indicando che non riusciva a trovare un file immagine specifico. Ho creato un file immagine fittizio, gli ho dato lo stesso nome e l’ho posizionato nel punto indicato.

Ho eseguito lo script di ripristino per la terza volta. E voilà! Il mio sito è stato ripristinato dal backup ed è ora sulla versione più recente.