Здравствуйте,
Я попытался изменить доменное имя Discourse, следуя инструкции Change the domain name or rename your Discourse. Всё выглядело правильно до запуска команды
discourse remap talk.foo.com talk.bar.com
Я получил следующее сообщение:
root@plop:/var/www/discourse# discourse remap plop.domain.fr forum.plop.fr
Перезапись всех вхождений plop.domain.fr на forum.plop.fr
ЭТА ОПЕРАЦИЯ ПЕРЕПИШЕТ ДАННЫЕ, УВЕРЕНЫ? (введите 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: duplicate key value violates unique constraint "unique_post_links"
DETAIL: Ключ (topic_id, post_id, url)=(274, 455, http://forum.plop.fr) уже существует.
Из-за ошибки выше операция remap была применена только частично. Пожалуйста, запустите скрипт снова.
Казалось, что это похоже на ошибку, описанную здесь, но с небольшими отличиями. Я предполагаю, что проблема связана с тем, что новый домен уже обсуждался на форуме.
Чтобы обойти это, я не смог выполнить команду типа db:exec для принудительного выполнения команд базы данных через rake. Поэтому я сделал это напрямую через PostgreSQL:
- Подключиться к базе данных:
# cd /var/discourse/
# ./launcher enter app
# su - postgres
$ psql
postgres=# \c discourse
- Попытаться напрямую заменить URL в таблице
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: Ключ (topic_id, post_id, url)=(274, 455, http://forum.plop.fr) уже существует.
- При ошибке: принудительно выполнить замену, не нарушающую уникальность, например,
forum.plop.fr/:
discourse=# update topic_links set url=REPLACE(url, 'plop.domain.fr', 'forum.plop.fr/') where topic_id=274;
- Повторять шаг 3, пока шаг 2 не завершится без ошибок. Затем выйти из pg.
discourse=# update topic_links set url=REPLACE(url, 'plop.domain.fr', 'forum.plop.fr');
UPDATE 1349
discourse=#
\q
- Запустить remap и rebake заново:
$ exit
# discourse remap plop.domain.fr forum.plop.fr
- Вручную проверить и исправить проблемные темы (содержимое которых может быть несогласованным), посетив
forum.plop.fr/t/topic/274и другие.