Falha de remapeamento ao alterar o domínio do discurso

Olá,
Tentei alterar um nome de domínio do Discourse, seguindo Change the domain name or rename your Discourse. As coisas pareciam corretas até eu executar o comando

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

Recebi o seguinte:

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.

Parecia que se referia ao erro relatado aqui, mas era ligeiramente diferente. Acho que o bug está relacionado ao fato de que o novo domínio foi discutido no fórum.

Para superar isso, não consegui executar algo como db:exec para forçar comandos de banco de dados via rake. Então fiz isso diretamente via postgres:

  1. conecte o banco de dados:
# cd /var/discourse/
# ./launcher enter app
# su - postgres
$ psql
postgres=# \c discourse
  1. tente substituir diretamente a url na tabela
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. em caso de erro: force uma substituição que não quebre a unicidade, por exemplo, forum.plop.fr/:
discourse=# update topic_links set url=REPLACE(url, 'plop.domain.fr', 'forum.plop.fr/') where topic_id=274;
  1. repita 3. até que 2. termine sem erro. Em seguida, saia do pg.
discourse=# update topic_links set url=REPLACE(url, 'plop.domain.fr', 'forum.plop.fr');
UPDATE 1349
discourse=#
\q
  1. reinicie o remap e o rebake:
$ exit
# discourse remap plop.domain.fr forum.plop.fr
  1. Verifique e corrija manualmente os tópicos problemáticos (cujo conteúdo pode ser inconsistente), visitando forum.plop.fr/t/topic/274 e outros.
1 curtida

Se eu entender corretamente o problema a posteriori, o doc poderia sugerir remover todas as ocorrências antigas de talk.bar.com antes de executar este comando. Poderia ser feito simplesmente via

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

(Eu não tentei.)

1 curtida