Erreur lors de l'exécution de remap après modification de l'URL du site

J’ai changé l’URL de mon site Discourse et je suis les instructions de Change the domain name or rename your Discourse. Lorsque j’essaie d’exécuter remap, je rencontre continuellement l’erreur suivante. Le message me demande de réexécuter le script, mais la même erreur se produit à chaque fois.[1]

Je ne sais pas quelle est ma prochaine étape ici et je serais reconnaissant pour toute orientation. Merci d’avance ! :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. Je sais que la définition de la folie est de répéter la même chose encore et encore en s’attendant à un résultat différent ! :rofl: ↩︎

Il semble y avoir une collision de contrainte dans la table d’analytique de PostgreSQL. Votre base de données contient déjà des enregistrements du nouveau domaine pour certaines dates, ce qui fait probablement que l’outil de remappage crée des doublons que PostgreSQL rejette.

Je vous conseille de supprimer les enregistrements de l’ancien domaine dans cette table spécifique, uniquement pour les dates où le nouveau domaine possède déjà des données, afin de préserver les données historiques et de débloquer l’outil de remappage. Mais faites d’abord une sauvegarde de sécurité.

Essayez ceci :

cd /var/discourse
./launcher enter app
# créer une sauvegarde de sécurité
discourse backup
# entrer dans la console de la base de données
sudo -u postgres psql discourse
/* trouver le nom exact de la table liée à cet index */
SELECT tablename 
FROM pg_indexes 
WHERE indexname = 'idx_bprd_rollups_date_referrer_unique';

En supposant que la requête ci-dessus retourne browser_pageview_rollup_details, utilisez ce nom de table dans la requête suivante.

/* supprimer les enregistrements d’analytique en collision */
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'
);

/* quitter postgres */
\q

Puis relancez l’outil de remappage.

discourse remap discourse.tobiaseigen.org digitallysovereign.org

Ensuite, utilisez la tâche rake rebake_match au lieu d’un rebake complet.

# rebake uniquement les posts contenant la chaîne du nouveau domaine
rake posts:rebake_match["digitallysovereign.org"]

Je pense que l’idée de Lilly devrait fonctionner.

Ce que je fais, c’est sauvegarder la base de données, changer l’URL, puis restaurer et laisser le remappeur de Discourse faire le travail. Ce code est utilisé par l’hébergement Discourse, et s’il échoue, quelqu’un qui peut le réparer s’en rendra compte. :slight_smile:

Mais oui, ces liens de référant ont causé toutes sortes de problèmes.

Merci, Lilly !

discourse db ne fonctionne pas pour moi — j’utilise sudo -u postgres psql discourse.

La table retournée par la première requête était en fait browser_pageview_referrer_daily_rollups, donc je l’ai utilisée dans la deuxième requête.

Maintenant, j’obtiens une erreur différente. Lorsque je relance cette deuxième requête, elle ne supprime rien.

Erreur : ERREUR :  la valeur de la clé en double vioint la contrainte d’unicité « idx_bprd_rollups_date_referrer_unique »
DÉTAIL :  La clé (date, normalized_referrer)=(2026-06-30, digitallysovereign.org/c/members/32) existe déjà.
Le remappage n’a été appliqué que partiellement en raison de l’erreur ci-dessus. Veuillez réexécuter le script.

ok, je suppose que la requête initiale utilisait une correspondance exacte et qu’elle a manqué toutes les lignes avec des chemins attachés. je tenterais cette requête SQL, je pense (je ne peux vraiment rien tester car je n’ai pas besoin de changer un nom de domaine sur mon serveur DNS).

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

si cela fonctionne sans erreur, exécute ensuite l’outil de remappage et la tâche rake de recuisson que j’ai postée ci-dessus.

j’ai effectivement effectué une migration de forum vers un nouveau serveur et un nouveau nom de domaine il y a quelques mois, mais l’outil de remappage a parfaitement fonctionné pour moi du premier coup.

Encore merci, Lilly ! Tu es une star.

Je progresse lentement dans la base de données, apparemment. 24 enregistrements ont été supprimés ! Je suis maintenant à 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, appliquons la même logique, mais vérifions d’abord :

SELECT tablename 
FROM pg_indexes 
WHERE indexname = 'unique_post_links';

devrait renvoyer topic_links ? donc, c’est l’étape logique suivante :

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

je pense qu’on est près de la fin du schéma de la base de données, donc ça devrait probablement être le dernier obstacle (j’espère) avant d’exécuter le remap et la tâche rake que j’ai postés plus haut…

Terminé ! :rocket:

root@digitallysovereign-app:/var/www/discourse# discourse remap discourse.tobiaseigen.org digitallysovereign.org
Réécriture de toutes les occurrences de discourse.tobiaseigen.org vers digitallysovereign.org
EXÉCUTION SUR LA BD 'default'
Cette tâche va réécrire les données, ÊTES-VOUS SÛR (tapez OUI) : yes

Remappage des tables sur default...

topic_links=1449
topic_search_data=11
topics=11
user_auth_token_logs=5
user_histories=131
Terminé

je suppose que tu devrais marquer l’un d’entre eux comme solution :wink:

Ça marche !

Peux-tu m’expliquer ce qu’est discourse db et pourquoi tu peux le faire et pas moi ? Ça a l’air plus facile à retenir que sudo -u postgres psql discourse !

Je me souvenais mal, car il est rare que j’exécute ce type de requêtes SQL dans le conteneur. Je pensais que c’était la bonne commande. Je crois que c’est parce que Discourse a des commandes intégrées comme discourse backup et discourse remap.

C’est une demande de fonctionnalité déguisée !

:disguised_face:

juste pour le plaisir, j’ai fait une petite PR pour le fichier script/discourse afin d’utiliser discourse db. je ne suis pas vraiment sûr que l’équipe veuille ajouter ça, mais ça facilite l’accès à la console sql à l’intérieur du conteneur.