Bloccato e perso durante l'aggiornamento del forum, problemi con la migrazione PG

Ciao, scrivo qui dopo aver provato di tutto e mi sono bloccato con il mio aggiornamento.

  • Stavo aggiornando il forum dopo molti mesi. Ho eseguito un backup come al solito e l’ho scaricato.
  • Apparentemente, in questo processo di aggiornamento, c’è una migrazione da PG 13 a 15.
    Funzionava tutto senza problemi finché l’aggiornamento non è fallito, sono stato interrotto a causa della mancanza di spazio su disco.
  • Sono andato al mio droplet Digitalocean, l’ho fermato, ho espanso il disco e l’ho riacceso.
  • Ho eseguito alcuni comandi regolari per liberare spazio su disco (rimuovendo vecchi log, ./launcher cleanup, ecc.)

Quindi ho iniziato la ricostruzione e poi ho colpito il primo muro:

root@discourse-ubuntu-s-2vcpu-4gb-fra1-01:/var/discourse# ./launcher rebuild app
ATTENZIONE: la versione Docker 20.10.1 è obsoleta, si consiglia di eseguire l'aggiornamento alla versione 24.0.7 o successiva.
Rilevata architettura x86_64.
ATTENZIONE: il file containers/app.yml è leggibile da tutti

Aggiornamento:
Sto ancora provando delle cose. A questo punto, voglio solo tornare a una build che supporti PG13 per poter ripristinare il mio backup, ma sono ancora bloccato nel tentativo.

L’hash del commit prima dell’aggiornamento era v3.3.0.beta6 +294, sto provando a ricostruire quello tramite YML, ma continua a dire questo durante la build:

root@discourse-ubuntu-s-2vcpu-4gb-fra1-01:/var/discourse# ./launcher rebuild app
ATTENZIONE: la versione di Docker 20.10.1 è obsoleta, si consiglia di aggiornare alla 24.0.7 o successiva.
Rilevata architettura x86_64.

ATTENZIONE: Stiamo per iniziare a scaricare l'immagine base di Discourse
Questo processo potrebbe richiedere da pochi minuti a un'ora, a seconda della velocità della tua rete

Per favore, sii paziente

2.0.20250226-0128: Pulling from discourse/base
af302e5c37e9: Pull complete
ed49ab5c933d: Pull complete
4d13d450f300: Pull complete
a67afd5cca97: Pull complete
d22a5b6769a6: Pull complete
83c133b53b22: Pull complete
fec147508f0c: Pull complete
21850d8b3ba1: Pull complete
02e250b6bcc4: Pull complete
71ba5ea7da00: Pull complete
ddcfbf6d2647: Pull complete
9c3e54d34536: Pull complete
29ce98d2d62d: Pull complete
4c9694455fd5: Pull complete
58a8ebcc6563: Pull complete
9c8966f1f999: Pull complete
b3dde96c4217: Pull complete
f934de9e2e8d: Pull complete
834e25f513a1: Pull complete
85d3cf606a95: Pull complete
94331a6982ee: Pull complete
14936beb0e9f: Pull complete
3ef05b122d47: Pull complete
6c2dff13a1e7: Pull complete
7682543ad38b: Pull complete
f16f8d5c5a04: Pull complete
06d7037d56ef: Pull complete
bc6c17ae1969: Pull complete
d19f089ead0e: Pull complete
Digest: sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
Status: Downloaded newer image for discourse/base:2.0.20250226-0128
docker.io/discourse/base:2.0.20250226-0128
ATTENZIONE: il file containers/app.yml è leggibile da tutti. Puoi proteggere questo file eseguendo: chmod o-rwx containers/app.yml
Verifica che il launcher sia aggiornato
Recupero origine
Il launcher è aggiornato
2.0.20250226-0128: Pulling from discourse/base
Digest: sha256:6f18aa2cd22bba0deb91d69194e577d4f96130ad555ae8ec646a8792cbfe37db
Status: Image is up to date for discourse/base:2.0.20250226-0128
docker.io/discourse/base:2.0.20250226-0128
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
I, [2025-06-11T09:54:52.350929 #1]  INFO -- : Lettura da stdin
I, [2025-06-11T09:54:52.357807 #1]  INFO -- : 	DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-15 postgresql-client-15 postgresql-contrib-15 postgresql-15-pgvector
E: Problema durante l'esecuzione degli script DPkg::Post-Invoke 'rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true'
E: Il sottoprocesso ha restituito un codice di errore
I, [2025-06-11T09:54:53.837808 #1]  INFO -- : Lettura degli elenchi dei pacchetti...
Creazione dell'albero delle dipendenze...
Lettura delle informazioni sullo stato...
I seguenti pacchetti sono stati installati automaticamente e non sono più richiesti:
  libcommon-sense-perl libio-pty-perl libipc-run-perl libjson-perl
  libjson-xs-perl libllvm19 libtypes-serialiser-perl libz3-4
  postgresql-client-common postgresql-common postgresql-common-dev ssl-cert
Usare 'apt autoremove' per rimuoverli.
I seguenti pacchetti verranno RIMOSSI:
  postgresql-15* postgresql-15-pgvector* postgresql-client-15*
0 aggiornati, 0 installati di nuovo, 3 da rimuovere e 0 non aggiornati.
Dopo quest'operazione, verranno liberati 60,9 MB di spazio su disco.
(Lettura del database ... 33951 file e directory attualmente installati.)
Rimozione di postgresql-15-pgvector (0.8.0-1.pgdg120+1) ...
Rimozione di postgresql-15 (15.12-1.pgdg120+1) ...
invoke-rc.d: impossibile determinare il runlevel corrente
update-alternatives: attenzione: forzando la reinstallazione dell'alternativa /usr/share/postgresql/15/man/man1/psql.1.gz perché il gruppo di link psql.1.gz è rotto
Rimozione di postgresql-client-15 (15.12-1.pgdg120+1) ...
Elaborazione dei trigger per postgresql-common (274.pgdg120+1) ...
Costruzione di dizionari PostgreSQL dai pacchetti myspell/hunspell installati...
Rimozione di file di dizionario obsoleti:
(Lettura del database ... 31913 file e directory attualmente installati.)
Eliminazione dei file di configurazione per postgresql-15 (15.12-1.pgdg120+1) ...
Eliminazione del cluster principale...



FALLITO
--------------------
Pups::ExecError: DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-15 postgresql-client-15 postgresql-contrib-15 postgresql-15-pgvector non è riuscito con il ritorno #														<Process::Status: pid 7 exit 100
Posizione dell'errore: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec non riuscito con i parametri "DEBIAN_FRONTEND=noninteractive apt-get purge -y postgresql-15 postgresql-client-15 postgresql-contrib-15 postgresql-15-pgvector"
bootstrap non riuscito con codice di uscita 100
** AVVIO NON RIUSCITO ** scorrere verso l'alto e cercare messaggi di errore precedenti, potrebbero essercene più di uno.
./discourse-doctor può aiutare a diagnosticare il problema.
a609309cf458b146e5650d21103bf084e9bf66843e46e627827f50b6f8c03376

Se hai effettuato un backup come hai detto, la cosa più semplice è avviare un nuovo droplet, seguire Spostare un sito Discourse su un altro VPS con rsync (ma non copiare i file del database), e quindi ripristinare il tuo backup.

3 Mi Piace

Ciao

Ciao Jay! grazie mille per la risposta. Ho appena iniziato a farlo, il droplet si sta configurando in questo momento.

Domanda veloce: ho scaricato il mio file di backup prima di iniziare l’aggiornamento, questo è il file: forumname-2025-06-11-060249-v20240807024301.tar.gz (4,6GB compresso) La versione del forum era v3.3.0.beta6 +294 con PG13.

Avevo intenzione di inizializzare il nuovo droplet forzando questa versione in app.yml, come:

## questo è il template del container Docker di Discourse standalone, tutto in uno
##
## Dopo aver apportato modifiche a questo file, DEVI ricostruire
## /var/discourse/launcher rebuild app
##
## FAI MOLTA ATTENZIONE QUANDO MODIFICHI!
## I FILE YAML SONO SUPER SUPER SENSIBILI A ERRORI DI SPAZIATURA O ALLINEAMENTO!
## visita http://www.yamllint.com/ per validare questo file se necessario

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Decommenta queste due righe se desideri aggiungere Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## quali porte TCP/IP deve esporre questo container?
## Se vuoi che Discourse condivida una porta con un altro webserver come Apache o nginx,
## vedi https://meta.discourse.org/t/17247 per i dettagli
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Imposta db_shared_buffers al massimo del 25% della memoria totale.
  ## verrà impostato automaticamente da bootstrap in base alla RAM rilevata, o puoi sovrascriverlo
  db_shared_buffers: "1024MB"

  ## può migliorare le prestazioni di ordinamento, ma aumenta l'utilizzo della memoria per connessione
  #db_work_mem: "40MB"

  ## Quale revisione Git dovrebbe usare questo container? (default: tests-passed)
  version: v3.3.0.beta6

E poi, con il nuovo forum attivo e funzionante, importare il backup da lì.

Ha senso? o mi manca qualche parametro o passaggio importante?

1 Mi Piace

È tutto.

Vedi anche Ripristina un backup dalla riga di comando

3 Mi Piace

Grazie ancora, Jay, per aver risposto. Apprezzo molto il tuo tempo nell’aiutarmi in questo incubo.

Sto provando a farlo in quel modo (forzando la versione nello YML) ma apparentemente discourse_docker non è (ancora) felice di questo cambiamento:

FAILED
--------------------
Pups::ExecError: grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \"before-server\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 ) failed with return #<Process::Status: pid 2788 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in spawn'
exec failed with the params {"cmd"=>["cp $home/config/nginx.sample.conf /etc/nginx/conf.d/discourse.conf", "rm /etc/nginx/sites-enabled/default", "mkdir -p /var/nginx/cache", "grep -q 'outlets/before-server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \\\"before-server\\\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "grep -q 'outlets/server' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \\\"server\\\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "grep -q 'outlets/discourse' /etc/nginx/conf.d/discourse.conf || ( >&2 echo 'The \\\"discourse\\\" Nginx outlet is missing. This version of discourse_docker is not compatible with the chosen Discourse version.' ; exit 1 )", "mkdir -p /etc/nginx/conf.d/outlets/before-server", "touch /etc/nginx/conf.d/outlets/before-server/20-redirect-http-to-https.conf", "touch /etc/nginx/conf.d/outlets/before-server/30-ratelimited.conf", "mkdir -p /etc/nginx/conf.d/outlets/server", "touch /etc/nginx/conf.d/outlets/server/10-http.conf", "touch /etc/nginx/conf.d/outlets/server/20-https.conf", "touch /etc/nginx/conf.d/outlets/server/30-offline-page.conf", "mkdir -p /etc/nginx/conf.d/outlets/discourse", "touch /etc/nginx/conf.d/outlets/discourse/20-https.conf", "touch /etc/nginx/conf.d/outlets/discourse/30-ratelimited.conf"]}
bootstrap failed with exit code 1
** 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.
d511b0ec31ac912c99c682611c35bbb446dde1488e1762aa07ccd24690c63164


2/2


Prima di aggiornare ho fatto uno screenshot della versione attuale, nel caso. C’è un modo per forzare discourse_docker a una versione precedente compatibile?

Sto cercando su Google e qui su Meta, ma ancora nulla su come fare.

[citazione=“skozz, post:6, topic:369694”]
In quel modo (
[/citazione]

Non farlo.

Fai semplicemente una normale installazione dell’ultima versione di tutto e ripristina il database.

1 Mi Piace

[citazione=“pfaffman, post:7, topic:369694”]
Basta fare una normale installazione dell’ultima versione di tutto e ripristinare il database.
[/citazione]

Capito, proverò subito.

Tuttavia, una domanda veloce: se il backup proviene da una versione così vecchia di Discord che utilizzava PG13, si avranno problemi a importare il backup nell’ultima versione di Discord con PG15?

1 Mi Piace

Scusa @pfaffman, ho scritto un messaggio precedente pensando che il problema fosse risolto, ma poi c’è stato un colpo di scena.

Dopo una lunga importazione, ho visto che il forum era di nuovo online, elencando tutti i post e così via.

Nel terminale, il log era:

[...]

-- execute("DELETE FROM site_settings WHERE name='warn_reviving_old_topic_age'")
   -	0.0002s
== 20250609115711 RemoveComposerTipsSiteSettings: migrated (0.0012s) ==========

Ricconnessione al database...
Ricaricamento delle impostazioni del sito...
Disabilitazione delle e-mail in uscita per gli utenti non dello staff...
Disabilitazione della modalità di sola lettura...
Pulizia della cache delle categorie...
Ricaricamento delle traduzioni...
Riassegnazione degli upload (uploads)...
Ripristino degli upload, potrebbe richiedere un po' di tempo...
Migrazione degli upload su S3 per 'default'...
Caricamento dei file su S3...
 - Elenco dei file locali
 =	5 file
 - Elenco dei file S3
............................................................................................................................................................................ =	171490 file
 - Sincronizzazione dei file su S3
.....
Aggiornamento degli URL nel database...

Sono stato lì per un po’ e ho pensato che fosse solo la mia connessione al terminale. Tuttavia, pochi minuti dopo, ha continuato a terminare fallendo:

490 file
 - Sincronizzazione dei file su S3
.....
Aggiornamento degli URL nel database...
Rimozione delle vecchie immagini ottimizzate...
Contrassegno di tutti i post contenenti lightboxes per il rebake (ribakare)...
76198 post sono stati contrassegnati per un rebake
EXCEPTION: 903 post non sono rimappati al nuovo URL di upload S3. La migrazione S3 non è riuscita per il db 'default'.
/var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:81:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:383:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:59:in `migrate'
/var/www/discourse/lib/file_store/s3_store.rb:354:in `copy_from'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:69:in `restore_uploads'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:49:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:167:in `restore_uploads'
/var/www/discourse/lib/backup_restore/restorer.rb:71:in `run'
script/discourse:191:in `restore'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor/command.rb:28:in `run'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor/invocation.rb:127:in `invoke_command'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor.rb:538:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/thor-1.3.2/lib/thor/base.rb:584:in `start'
script/discourse:345:in `	
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `kernel_load'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:452:in `exec'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor.rb:538:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:35:in `dispatch'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/cli.rb:29:in `start'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:28:in `block in 	'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
/usr/local/lib/ruby/gems/3.3.0/gems/bundler-2.6.4/exe/bundle:20:in `	'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `
Tentativo di rollback (ripristino)...
Rollback in corso...
Pulizia...
Rimozione delle funzioni dallo schema discourse_functions...
Rimozione della directory temporanea '/var/www/discourse/tmp/restores/default/2025-06-11-121115'...
Ripristino di sidekiq...
Contrassegno del ripristino come terminato...
Notifica a 'system' della fine del ripristino...
Finito!
[FALLITO]
Ripristino completato.
```Improvvisamente, il forum che era stato "ripristinato" online, tutti i post sono svaniti, lasciando solo un paio di argomenti attivi.

Dal momento che il log dice "76198 post sono stati contrassegnati per un rebake", ho pensato che fosse solo che ora devono essere ribakizzati, quindi sono andato su Sidekiq ma non c'è nulla in sospeso da elaborare :(

![Screenshot 2025-06-11 at 15.07.25|690x344](upload://eTbBQ2YFhHB53eiZav2gFFOlEVV.jpeg)

![Screenshot 2025-06-11 at 15.07.52|690x221](upload://jndXpOTWcvpiv94CczGn2SRRqVU.jpeg)

Aggiornamento:

Ho effettuato l’accesso alla console di Rails e apparentemente ci sono solo 10 post, non tutti quelli da importare :thinking:
/var/www/discourse# rails c
Caricamento dell’ambiente di produzione (Rails 7.2.2.1)
discourse(prod)> Post.count
=> 10
discourse(prod)> Post.where("baked_version IS NULL").count
=> 0

1 Mi Piace

Sospirare. Stai usando lo stesso hostname? (Forse sì?)

Questo è il tuo problema ora.

Hai configurato S3 nel database o nel file yml? Immagino sia la prima opzione. La cosa più semplice sarebbe ripristinare solo il database, ma è difficile da spiegare (estrarre il file sql e poi nominarlo con lo stesso nome del file tar.gz)

Puoi provare questo

discourse restore --pause <backup_filename>

Questo si fermerà prima di tentare di ripristinare le cose di S3. Poi, se sapessi cosa fare, potresti risolvere il problema con gli upload errati.

Vedi Issues with restoring backup to discourse - #16 by gerhard

Un’altra cosa sarebbe impostare DISCOURSE_USE_S3 su false nel tuo app.yml. Potrebbe essere necessario impostare anche le altre cose relative a S3, come quelle che dicono di usare gli upload S3 e/o i bucket S3.

1 Mi Piace

[citazione=“pfaffman, post:12, topic:369694”]
Sigh. Stai usando lo stesso hostname? (Forse sì?)
[/citazione]

Sì, ma ora che lo menzioni.

  • Il forum ha 10 anni ormai.
  • Ho impostato S3 tempo fa per un periodo, ma poi l’ho rimosso, quindi quei post con immagini S3 sono piuttosto vecchi.

C’è un modo per identificarli e ignorarli/rimuoverli, in modo che l’importazione possa funzionare senza intoppi?

Un’altra cosa sarebbe impostare DISCOURSE_USE_S3 su false nel tuo app.yml. Potrebbe essere necessario impostare anche l’altra roba di S3 come quelle che dicono di usare i caricamenti su S3 e/o i bucket di S3.

Lo proverò anche io, perché alla fine, non ci interessano quei file o post S3, è solo che non so ancora come gestirlo per ignorarli

Se non ti interessano davvero, potresti mettere in pausa e, quando si mette in pausa, aprire un altro terminale, entrare in rails e fare qualcosa del genere

bad=Upload.where("url like '%the-s3-url%'")
bad.destroy_all

A proposito, se sei ancora bloccato e disperato e hai un budget, puoi contattarmi via email o PM o chiedere in Marketplace.

1 Mi Piace

Avresti dovuto dirmelo fin dall’inizio! Avrei pagato volentieri in primo luogo! hehe

Ora è attivo e funzionante.

Dopo aver provato tonnellate di cose, ho finito per fare qualcosa di controintuitivo, ma che ora funziona:

  • Configura S3 nella nuova istanza correttamente (tramite pannello di amministrazione)
  • Ho eseguito l’importazione con la [cosa –pause ma nel secondo passaggio, ho semplicemente interrotto il processo. Mi aspettavo che il forum non funzionasse o avesse problemi con le immagini, ma è attivo e le vecchie immagini si caricano senza problemi.

Sto ancora testando le cose, forse troverò qualcosa di rotto più tardi, ma per ora, dopo 12 ore di risoluzione dei problemi, lo considererò una vittoria per ora.

2 Mi Piace

Non è corretto. Vedi Configurare un provider di archiviazione oggetti compatibile con S3 per i caricamenti. Vuoi tutte quelle impostazioni nei tuoi file yml.

1 Mi Piace