Ошибка при запуске remap после изменения URL сайта

Я изменил URL-адрес моего форума Discourse и следую инструкциям из Change the domain name or rename your Discourse. При попытке запустить remap я постоянно получаю следующую ошибку. Система постоянно предлагает повторно запустить скрипт, но при каждом запуске возникает та же самая ошибка.[1]

Не уверен, что делать дальше, буду признателен за любые подсказки. Заранее спасибо! :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. Я знаю, что определение безумия — это повторение одного и того же действия снова и снова с ожиданием разного результата! :rofl: ↩︎

Похоже, что в таблице аналитики Postgres произошло столкновение ограничений. Ваша база данных уже содержит записи нового домена за определённые даты, поэтому инструмент remap, вероятно, создаёт дубликаты, и Postgres их отклоняет.

Попробуйте удалить записи старого домена только в этой конкретной таблице за те даты, когда у нового домена уже есть данные, чтобы сохранить исторические данные и разблокировать инструмент remap. Но сначала сделайте резервную копию.

Попробуйте следующее:

cd /var/discourse
./launcher enter app
# создайте резервную копию
discourse backup
# войдите в консоль базы данных
sudo -u postgres psql discourse
/* найдите точное имя таблицы, связанное с этим индексом */
SELECT tablename 
FROM pg_indexes 
WHERE indexname = 'idx_bprd_rollups_date_referrer_unique';

предполагая, что запрос выше вернёт browser_pageview_rollup_details, используйте это имя таблицы в следующем запросе

/* удалите конфликтующие записи аналитики */
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'
);

/* выход из postgres */
\q

затем снова запустите инструмент remap

discourse remap discourse.tobiaseigen.org digitallysovereign.org

затем используйте rake-задачу rebake_match вместо полного пересоздания

# пересоздайте только посты, содержащие строку нового домена
rake posts:rebake_match["digitallysovereign.org"]

Думаю, идея Лилли должна сработать.

Я делаю резервную копию базы данных, меняю URL, а затем восстанавливаю её и позволяю Discourse remapper сделать свою работу. Этот код используется хостингом Discourse, и если что-то пойдёт не так, это заметит кто-то, кто сможет это исправить. :slight_smile:

Но да, эти реферальные ссылки вызывали всевозможные проблемы.

Спасибо, Лилли!

discourse db у меня не работает — я использую sudo -u postgres psql discourse.

Таблица, которую вернул первый запрос, на самом деле была browser_pageview_referrer_daily_rollups, поэтому я использовал её во втором запросе.

Теперь я получаю другую ошибку. Когда я запускаю второй запрос снова, он ничего не удаляет.

Ошибка: ERROR:  значение ключа дублируется и нарушает уникальное ограничение "idx_bprd_rollups_date_referrer_unique"
DETAIL:  Ключ (date, normalized_referrer)=(2026-06-30, digitallysovereign.org/c/members/32) уже существует.
Переотображение было применено только частично из-за указанной выше ошибки. Пожалуйста, запустите скрипт снова.

ладно, полагаю, начальный запрос использовал точное совпадение и пропустил все строки с путями. попробуйте, думаю, такой sql-запрос (я не могу это проверить, так как мне не нужно менять доменное имя на моём nameserver).

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

если это выполнится без ошибок, запустите инструмент remap и rake-задачу rebake, которую я привёл выше.

я несколько месяцев назад переносил форум на новый сервер и новое доменное имя, и инструмент remap сработал у меня с первого раза.

Ещё раз спасибо, Лилли! Ты просто звезда.

Похоже, я потихоньку продвигаюсь по базе данных. 24 записи были удалены! Теперь я на 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.

хорошо, попробуем ту же логику, но сначала давайте проверим:

SELECT tablename 
FROM pg_indexes 
WHERE indexname = 'unique_post_links';

должно вернуть topic_links? следовательно, это следующий логический шаг:

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

думаю, это почти конец схемы базы данных, так что это, вероятно, будет последнее препятствие (надеюсь) перед запуском remap и rake-задачи, которую я привел выше…

Готово! :rocket:

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...

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

ну, думаю, тебе стоит отметить один из них как решение :wink:

Сделаю!

Можете объяснить мне, что такое discourse db и почему вы можете это использовать, а я — нет? Кажется, это проще запомнить, чем sudo -u postgres psql discourse!

я просто ошибался в памяти, потому что редко выполняю такие SQL-запросы в контейнере. мне казалось, что это правильная команда. думаю, дело в том, что в Discourse есть встроенные команды вроде discourse backup и discourse remap.

Это же замаскированная просьба о добавлении новой функции!

:disguised_face:

ну, просто ради интереса я сделал быстрый PR для файла script/discourse, чтобы использовать discourse db. не уверен, что команде захочется это добавлять, но это действительно упрощает вход в консоль sql внутри контейнера.