Error al ejecutar remap después de cambiar la URL del sitio

Cambié la URL de mi sitio de Discourse y estoy siguiendo las instrucciones en Change the domain name or rename your Discourse. Al intentar ejecutar remap, recibo repetidamente el siguiente error. El sistema insiste en que vuelva a ejecutar el script, pero cada vez aparece el mismo error.[1]

No estoy seguro de cuál es mi siguiente paso y agradecería cualquier orientación. ¡Gracias de antemano! :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. ¡Ya sé que la definición de locura es repetir lo mismo una y otra vez esperando un resultado diferente! :rofl: ↩︎

parece que hay una colisión de restricciones en la tabla de análisis de Postgres. tu base de datos ya incluye registros del nuevo dominio en fechas específicas, por lo que es probable que la herramienta de remapeo esté creando duplicados y Postgres los esté rechazando.

te sugiero que intentes eliminar los registros del dominio antiguo en la tabla específica solo para las fechas en las que el nuevo dominio ya tiene datos, con el fin de preservar los datos históricos y desbloquear la herramienta de remapeo. haz una copia de seguridad primero, por si acaso.

prueba esto:

cd /var/discourse
./launcher enter app
# crea una copia de seguridad
discourse backup
# entra en la consola de la base de datos
sudo -u postgres psql discourse
/* busca el nombre exacto de la tabla asociada a este índice */
SELECT tablename 
FROM pg_indexes 
WHERE indexname = 'idx_bprd_rollups_date_referrer_unique';

asumiendo que la consulta anterior devuelve browser_pageview_rollup_details, usa ese nombre de tabla en la siguiente consulta

/* elimina los registros de análisis que colisionan */
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'
);

/* sale de postgres */
\q

luego ejecuta la herramienta de remapeo nuevamente

discourse remap discourse.tobiaseigen.org digitallysovereign.org

y usa la tarea rake rebake_match en lugar de un rebake completo

# rehornea solo las publicaciones que contienen la cadena del nuevo dominio
rake posts:rebake_match["digitallysovereign.org"]

Creo que la idea de Lilly debería funcionar.

Lo que yo hago es hacer una copia de seguridad de la base de datos, cambiar la URL y luego restaurar y dejar que el remapeador de Discourse haga el trabajo. Ese código es utilizado por Discourse hosting y si falla, alguien que pueda solucionarlo se dará cuenta. :slight_smile:

Pero sí, esos enlaces de referencia han causado todo tipo de problemas.

Gracias, Lilly.

discourse db no funciona para mí, así que estoy usando sudo -u postgres psql discourse.

La tabla que devolvió la primera consulta era en realidad browser_pageview_referrer_daily_rollups, así que la usé en la segunda consulta.

Ahora estoy obteniendo un error diferente. Cuando vuelvo a ejecutar esa segunda consulta, no elimina nada.

Error: ERROR:  el valor de clave duplicada viola la restricción única «idx_bprd_rollups_date_referrer_unique»
DETALLE:  La clave (date, normalized_referrer)=(2026-06-30, digitallysovereign.org/c/members/32) ya existe.
El remapeo solo se ha aplicado parcialmente debido al error anterior. Vuelva a ejecutar el script.

ok, supongo que la consulta inicial usó una coincidencia exacta y omitió todas las filas con rutas adjuntas. Intentaría esta consulta SQL, creo (no puedo probar nada de esto porque no necesito cambiar un nombre de dominio en mi servidor de nombres).

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 eso funciona sin errores, entonces ejecuta la herramienta de remapeo y la tarea rake de rehorneado que publiqué arriba.

hice una migración de un foro a un servidor nuevo y un nombre de dominio nuevo hace unos meses, pero la herramienta de remapeo funcionó perfectamente para mí la primera vez.

¡Gracias de nuevo, Lilly! Eres una estrella.

Parece que estoy avanzando poco a poco por la base de datos. ¡Se eliminaron 24 registros! Ahora estoy en 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, probemos con la misma lógica, pero primero verifiquemos:

SELECT tablename 
FROM pg_indexes 
WHERE indexname = 'unique_post_links';

¿debería devolver topic_links? así que este es el siguiente paso lógico:

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

creo que esto está cerca del final del esquema de la base de datos, así que probablemente sea el último obstáculo (espero) antes de ejecutar el remapeo y la tarea rake que publiqué arriba…

¡Todo listo! :rocket:

root@digitallysovereign-app:/var/www/discourse# discourse remap discourse.tobiaseigen.org digitallysovereign.org
Reescribiendo todas las ocurrencias de discourse.tobiaseigen.org a digitallysovereign.org
SE EJECUTARÁ EN LA BD 'default'
ESTA TAREA REESCRIBIRÁ DATOS, ¿ESTÁS SEGURO? (escribe SÍ): yes

Remapeando tablas en default...

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

supongo que deberías marcar uno de estos como solución :wink:

¡Hecho!

¿Me puedes explicar qué es discourse db y por qué tú puedes usarlo y yo no? ¡Parece más fácil de recordar que sudo -u postgres psql discourse!

Simplemente me estaba equivocando al recordar, porque es raro que haga este tipo de SQL en el contenedor. Creí que ese era el comando correcto. Creo que se debe a que Discourse tiene comandos integrados como discourse backup y discourse remap.

¡Eso es una solicitud de funcionalidad disfrazada!

:disguised_face:

bueno, solo por curiosidad, hice un PR rápido para el archivo script/discourse para usar discourse db. No estoy seguro de que al equipo le interese añadirlo, pero facilita entrar en la consola sql dentro del contenedor.