Fallo de reasignación al cambiar el dominio del discurso

Hola,
Intenté cambiar el nombre de dominio de Discourse, siguiendo Change the domain name or rename your Discourse. Las cosas parecían correctas hasta que ejecuté el comando

discourse remap talk.foo.com talk.bar.com

Obtuve lo siguiente:

root@plop:/var/www/discourse# discourse remap plop.domain.fr forum.plop.fr
Rewriting all occurrences of plop.domain.fr to forum.plop.fr
THIS TASK WILL REWRITE DATA, ARE YOU SURE (type YES)
YES
backup_metadata=1
email_logs=991
javascript_caches=1
post_revisions=126
post_search_data=20
posts=782
stylesheet_cache=446
theme_settings=1
Error: ERROR:  duplicate key value violates unique constraint "unique_post_links"
DETAIL:  Key (topic_id, post_id, url)=(274, 455, http://forum.plop.fr) already exists.
The remap has only been partially applied due to the error above. Please re-run the script again.

Parecía similar al error reportado aquí, pero era ligeramente diferente. Supongo que el error está relacionado con el hecho de que el nuevo dominio se ha discutido en el foro.

Para superarlo, no pude ejecutar algo como db:exec para forzar comandos de base de datos a través de rake. Así que lo hice directamente a través de postgres:

  1. Conecta la base de datos:
# cd /var/discourse/
# ./launcher enter app
# su - postgres
$ psql
postgres=# \c discourse
  1. Intenta reemplazar directamente la url en la tabla
discourse=# update topic_links set url=REPLACE(url, 'plop.domain.fr', 'forum.plop.fr');
ERROR:  duplicate key value violates unique constraint "unique_post_links"
DETAIL:  Key (topic_id, post_id, url)=(274, 455, http://forum.plop.fr) already exists.
  1. En caso de error: fuerza un reemplazo que no rompa la unicidad, por ejemplo, forum.plop.fr/:
discourse=# update topic_links set url=REPLACE(url, 'plop.domain.fr', 'forum.plop.fr/') where topic_id=274;
  1. Repite el paso 3 hasta que el paso 2 se complete sin errores. Luego sal de pg.
discourse=# update topic_links set url=REPLACE(url, 'plop.domain.fr', 'forum.plop.fr');
UPDATE 1349
discourse=#
\q
  1. Reinicia el remap y el rebake:
$ exit
# discourse remap plop.domain.fr forum.plop.fr
  1. Comprueba y corrige manualmente los temas problemáticos (cuyo contenido puede ser inconsistente), visitando forum.plop.fr/t/topic/274 y otros.
1 me gusta

Si entiendo correctamente el problema a posteriori, el doc podría sugerir eliminar todas las ocurrencias antiguas de talk.bar.com antes de ejecutar este comando. Simplemente se podría hacer mediante

discourse remap talk.bar.com talk.foo-or-bar-that-s-the-question.com

(No lo he intentado).

1 me gusta