Ho il seguente problema. Gestisco un forum Discourse da oltre 10 anni e, dato che non sono riuscito a installare aggiornamenti da qualche tempo, volevo configurare un nuovo server:
Il server vecchio esegue: 3.4.0.beta4-dev
Il nuovo server: Ultima versione
Il backup ha già una dimensione di 673,2 MB come file .gz, escludendo gli allegati.
Purtroppo, il ripristino continua a interrompersi. Il file di log contiene questo errore:
[2026-06-16 07:54:52] ERROR: could not create unique index “index_incoming_referers_on_path_and_incoming_domain_id”
[2026-06-16 07:54:52] DETAIL: Key (path, incoming_domain_id)=(//, 5) is duplicated.
[2026-06-16 07:54:52] EXCEPTION: psql failed: DETAIL: Key (path, incoming_domain_id)=(//, 5) is duplicated.
[2026-06-16 07:54:52] /var/www/discourse/lib/backup_restore/database_restorer.rb:93:in 'BackupRestore::DatabaseRestorer#restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in ‘BackupRestore::DatabaseRestorer#restore’
/var/www/discourse/lib/backup_restore/restorer.rb:61:in 'BackupRestore::Restorer#run'
/var/www/discourse/script/spawn_backup_restore.rb:20:in ‘Object#restore’
/var/www/discourse/script/spawn_backup_restore.rb:33:in ‘block in ’
/var/www/discourse/script/spawn_backup_restore.rb:4:in 'Kernel#fork'
/var/www/discourse/script/spawn_backup_restore.rb:4:in ‘’
[2026-06-16 07:54:52] Trying to rollback...
Cosa posso fare per risolvere questo problema senza perdere gli ultimi 10 anni di dati?
La tabella incoming_referers tiene traccia dei percorsi URL che hanno inviato i visitatori al tuo forum. Possiede un indice univoco, il che significa che non possono esistere due righe con la stessa combinazione percorso + dominio.
Il tuo database contiene due righe con path='//' e incoming_domain_id=5. Quando tenta di ricostruire questo indice univoco durante il ripristino, rileva la duplicazione e interrompe l’intera transazione di ripristino.
Dovrai quindi trovare e rimuovere quella duplicazione in incoming_referers e creare un nuovo backup da ripristinare sul nuovo server.
Scusa se ti disturbo, ma sembra che io stia facendo qualcosa di sbagliato: dopo aver eseguito il comando “discourse=# select * from incoming_referers where path LIKE ‘%/search/’ ORDER BY incoming_domain_id;”, ricevo un errore di sintassi.
Ok, ora ho installato anche “apt install postgresql-client-common”. Tuttavia, ricevo ancora l’errore “Errore: è necessario installare almeno un pacchetto postgresql-client-.”
Mi dispiace davvero tanto per il comportamento sciocco che ho avuto.
Ho installato Rails e sembra che funzioni. L’ho eseguito anche con “rails c”. Sembra funzionare anche quello, ma quando inserisco il comando, appare così:
“root@community:/var/discourse# ActiveRecord::Base.connection.execute(<<~SQL)
-bash: errore di sintassi vicino al token imprevisto `<<’
root@community:/var/discourse# SELECT id, path, incoming_domain_id
SELECT: comando non trovato
root@community:/var/discourse# FROM incoming_referers
FROM: comando non trovato
root@community:/var/discourse# WHERE path = ‘//’
WHERE: comando non trovato
root@community:/var/discourse# AND incoming_domain_id = 5
AND: comando non trovato
root@community:/var/discourse# SQL”
Non preoccuparti, forse le mie istruzioni non sono poi così chiare
Ti confesso che sono un po’ perplesso: dici di aver appena installato Rails ma di non riuscire ad accedere al database. Forse la situazione è diversa perché si tratta di una versione più vecchia, ma onestamente penso di aver raggiunto i miei limiti.
Comunque, una volta dentro Rails, il prompt dovrebbe essere diverso. Dal tuo output, sembra che tu non sia ancora nella console di Rails.
A dire il vero, non credo nemmeno che tu sia dentro il container. Hai provato a eseguire ./launcher enter app?
Quindi, ntuples=1 significa che è stata trovata solo una riga, mentre secondo il registro degli errori dovrebbe esserci un duplicato…
Mi dispiace, non so cosa provare oltre. Ti consiglio di navigare nel forum: sembrano esserci molti casi simili (vedi sotto questo argomento nella sezione correlata), forse lì troverai il prossimo indizio.
(oppure aspetta che passi qualcuno più esperto ;))
Sembra che il tuo vecchio server non sia un’installazione standard. Comunque,… ecco cosa è successo in breve: un indice sul tuo vecchio server si è corrotto nel corso degli anni (questo può accadere dopo aggiornamenti del sistema operativo), quindi due righe identiche sono finite nella tabella incoming_referers. Il backup le copia così come sono, e il nuovo server le rifiuta. Quindi prima risolviamo il problema sul server vecchio, poi creiamo un nuovo backup.
Sul server VECCHIO, apri la console di Rails:
./launcher enter app
rails c
Poi incolla queste righe, una dopo l’altra:
db = ActiveRecord::Base.connection.current_database
DB.exec("DELETE FROM incoming_referers a USING incoming_referers b WHERE a.id > b.id AND a.path = b.path AND a.incoming_domain_id = b.incoming_domain_id")
DB.exec("REINDEX DATABASE #{ActiveRecord::Base.connection.quote_table_name(db)}")
Questo rimuove i duplicati e ricostruisce tutti gli indici (nel caso in cui anche altre tabelle siano interessate).
Se REINDEX termina senza errori, digita exit, crea un nuovo backup sul vecchio server e ripristina quel nuovo file. Se mostra un errore relativo a un’altra tabella, incollalo qui.
Esci dalla console di Rails (digita exit) e, restando sempre all’interno del container (./launcher enter app), esegui:
su postgres -c "reindexdb discourse"
Una volta completata l’operazione senza errori, crea un nuovo backup sul vecchio server e ripristina questo nuovo file. Se dovesse comparire un errore relativo a una tabella specifica, incollalo pure qui.
Grazie infinite! Tutto è andato alla perfezione e, senza il tuo aiuto, non avrei avuto nessuna possibilità e avrei dovuto ricominciare il forum da capo, con grande fatica, molto presto! GRAZIE!