Errore durante l'esecuzione di remap dopo aver cambiato l'URL del sito

Ho cambiato l’URL del mio sito Discourse e sto seguendo le istruzioni in Change the domain name or rename your Discourse. Quando provo a eseguire il remapping, continuo a ricevere il seguente errore. Mi dice di riavviare lo script, ma poi si verifica lo stesso errore ogni volta.[1]

Non sono sicuro del mio prossimo passo qui e sarei grato per qualche indicazione. Grazie in anticipo! :seedling:

root@digitallysovereign:/var/discourse# ./launcher enter app
x86_64 arch detected.
root@digitallysovereign-app:/var/www/discourse# discourse remap discourse.tobiaseigen.org digitallysovereign.org
Rewriting all occurrences of discourse.tobiaseigen.org to digitallysovereign.org
WILL RUN ON 'default' DB
THIS TASK WILL REWRITE DATA, ARE YOU SURE (type YES): YES

Remapping tables on default...

ai_api_audit_logs=919
ai_secrets=1
backup_metadata=1
browser_pageview_events=3664
Error: ERROR:  duplicate key value violates unique constraint "idx_bprd_rollups_date_referrer_unique"
DETAIL:  Key (date, normalized_referrer)=(2026-07-01, digitallysovereign.org) already exists.
The remap has only been partially applied due to the error above. Please re-run the script again.
root@digitallysovereign-app:/var/www/discourse# discourse remap discourse.tobiaseigen.org digitallysovereign.org
Rewriting all occurrences of discourse.tobiaseigen.org to digitallysovereign.org
WILL RUN ON 'default' DB
THIS TASK WILL REWRITE DATA, ARE YOU SURE (type YES): YES

Remapping tables on default...

Error: ERROR:  duplicate key value violates unique constraint "idx_bprd_rollups_date_referrer_unique"
DETAIL:  Key (date, normalized_referrer)=(2026-07-01, digitallysovereign.org) already exists.
The remap has only been partially applied due to the error above. Please re-run the script again.
root@digitallysovereign-app:/var/www/discourse# discourse remap discourse.tobiaseigen.org digitallysovereign.org
Rewriting all occurrences of discourse.tobiaseigen.org to digitallysovereign.org
WILL RUN ON 'default' DB
THIS TASK WILL REWRITE DATA, ARE YOU SURE (type YES): YES

Remapping tables on default...

Error: ERROR:  duplicate key value violates unique constraint "idx_bprd_rollups_date_referrer_unique"
DETAIL:  Key (date, normalized_referrer)=(2026-07-01, digitallysovereign.org) already exists.
The remap has only been partially applied due to the error above. Please re-run the script again.

  1. So che la definizione di follia è ripetere la stessa cosa ancora e ancora e aspettarsi un risultato diverso! :rofl: ↩︎

Sembra esserci un conflitto di vincoli nella tabella di analisi di PostgreSQL. Il tuo database include già registrazioni del nuovo dominio per date specifiche, quindi lo strumento di rimappatura sta probabilmente creando duplicati che PostgreSQL sta rifiutando.

Prova a eliminare i record del vecchio dominio nella tabella specifica solo per le date in cui il nuovo dominio ha già dati, in modo da preservare i dati storici e sbloccare lo strumento di rimappatura. Fai prima un backup di sicurezza.

Prova questo:

cd /var/discourse
./launcher enter app
# crea un backup di sicurezza
discourse backup
# entra nella console del database
sudo -u postgres psql discourse
/* trova il nome esatto della tabella associata a questo indice */
SELECT tablename 
FROM pg_indexes 
WHERE indexname = 'idx_bprd_rollups_date_referrer_unique';

Assumendo che la query sopra restituisca browser_pageview_rollup_details, usa quel nome di tabella nella query successiva

/* elimina i record di analisi in conflitto */
DELETE FROM browser_pageview_rollup_details 
WHERE normalized_referrer = 'discourse.tobiaseigen.org' 
AND date IN (
    SELECT date 
    FROM browser_pageview_rollup_details 
    WHERE normalized_referrer = 'digitallysovereign.org'
);

/* esci da postgres */
\q

Poi esegui di nuovo lo strumento di rimappatura

discourse remap discourse.tobiaseigen.org digitallysovereign.org

Poi usa il task rake rebake_match invece di un ribaking completo

# ribake solo i post contenenti la stringa del nuovo dominio
rake posts:rebake_match["digitallysovereign.org"]

Penso che l’idea di Lilly dovrebbe funzionare.

Quello che faccio io è fare il backup del database, cambiare l’URL e poi ripristinare e lasciare che il remapper di Discourse faccia il suo lavoro. Quel codice viene utilizzato da Discourse hosting e se fallisce, qualcuno che può risolverlo se ne accorgerà. :slight_smile:

Ma sì, quei link di riferimento hanno causato ogni tipo di problemi.

Grazie, Lilly!

discourse db non funziona per me: sto usando sudo -u postgres psql discourse.

La tabella restituita dalla prima query era in realtà browser_pageview_referrer_daily_rollups, quindi l’ho usata nella seconda query.

Ora sto ottenendo un errore diverso. Quando eseguo di nuovo quella seconda query, non cancella nulla.

Errore: ERRORE:  il valore della chiave duplicata viola il vincolo univoco "idx_bprd_rollups_date_referrer_unique"
DETTAGLI:  La chiave (date, normalized_referrer)=(2026-06-30, digitallysovereign.org/c/members/32) esiste già.
Il rimappaggio è stato applicato solo parzialmente a causa dell'errore sopra. Si prega di eseguire di nuovo lo script.

ok, immagino che la query iniziale utilizzasse una corrispondenza esatta e abbia quindi ignorato tutte le righe con i percorsi allegati. Proverei con questa query SQL, penso (non posso davvero testare nulla di tutto questo perché non ho bisogno di cambiare il nome di dominio sul mio nameserver).

DELETE FROM browser_pageview_referrer_daily_rollups old_table
WHERE old_table.normalized_referrer LIKE '%discourse.tobiaseigen.org%'
AND EXISTS (
    SELECT 1 
    FROM browser_pageview_referrer_daily_rollups new_table
    WHERE new_table.date = old_table.date
    AND new_table.normalized_referrer = REPLACE(old_table.normalized_referrer, 'discourse.tobiaseigen.org', 'digitallysovereign.org')
);
\q

se funziona senza errori, esegui lo strumento di rimappatura e il task rake di ribake che ho postato sopra.

ho effettivamente fatto una migrazione del forum su un nuovo server e un nuovo nome di dominio qualche mese fa, ma lo strumento di rimappatura ha funzionato perfettamente per me alla prima.

Grazie ancora, Lilly! Sei una stella.

Sembra che stia procedendo a piccoli passi nel database. 24 record sono stati eliminati! Ora sono arrivato a unique_post_links.

root@digitallysovereign-app:/var/www/discourse# discourse remap discourse.tobiaseigen.org digitallysovereign.org
Rewriting all occurrences of discourse.tobiaseigen.org to digitallysovereign.org
WILL RUN ON 'default' DB
THIS TASK WILL REWRITE DATA, ARE YOU SURE (type YES): yes

Remapping tables on default...

browser_pageview_referrer_daily_rollups=1466
categories=2
chat_message_links=4
chat_message_search_data=4
chat_messages=5
discourse_activity_pub_collections=1
discourse_activity_pub_objects=1
drafts=4
email_logs=797
group_histories=2
groups=2
incoming_emails=21
moved_posts=2
notifications=10
post_localizations=51
post_revisions=31
post_search_data=226
posts=774
site_settings=1
stylesheet_cache=1168
Error: ERROR:  duplicate key value violates unique constraint "unique_post_links"
DETAIL:  Key (topic_id, post_id, url)=(581, 3696, https://digitallysovereign.org) already exists.
The remap has only been partially applied due to the error above. Please re-run the script again.

ok, proviamo la stessa logica, ma verifichiamo prima:

SELECT tablename 
FROM pg_indexes 
WHERE indexname = 'unique_post_links';

dovrebbe restituire topic_links? quindi questo è il prossimo passo logico:

DELETE FROM topic_links old_link
WHERE old_link.url LIKE '%discourse.tobiaseigen.org%'
AND EXISTS (
    SELECT 1 
    FROM topic_links new_link
    WHERE new_link.topic_id = old_link.topic_id
    AND new_link.post_id = old_link.post_id
    AND new_link.url = REPLACE(old_link.url, 'discourse.tobiaseigen.org', 'digitallysovereign.org')
);
\q

penso che siamo vicini alla fine dello schema del database, quindi dovrebbe essere l’ultimo ostacolo (spero) prima di eseguire il remap e il task rake che ho postato sopra…

Tutto fatto! :rocket:

root@digitallysovereign-app:/var/www/discourse# discourse remap discourse.tobiaseigen.org digitallysovereign.org
Riscrittura di tutte le occorrenze di discourse.tobiaseigen.org in digitallysovereign.org
VERRÀ ESEGUITO SUL DB 'default'
QUESTA OPERAZIONE RISCIVERÀ I DATI, SEI SICURO (digita YES): yes

Rimappatura delle tabelle su default...

topic_links=1449
topic_search_data=11
topics=11
user_auth_token_logs=5
user_histories=131
Fatto

immagino che tu debba segnare uno di questi come soluzione :wink:

Ci sto!

Puoi spiegarmi cos’è discourse db e perché tu puoi farlo e io no? Sembra più facile da ricordare rispetto a sudo -u postgres psql discourse!

Stavo solo ricordandomi male, perché è raro che esegua questo tipo di SQL nel container. Pensavo che fosse il comando corretto. Credo che sia perché Discourse ha comandi integrati come discourse backup e discourse remap.

È una richiesta di funzionalità in incognito!

:disguised_face:

Beh, solo per curiosità, ho fatto una rapida PR per il file script/discourse in modo da usare discourse db. Non sono sicuro che sia qualcosa che il team vorrebbe aggiungere, ma rende più facile entrare nella console sql all’interno del container.