サイトURLを変更した後のremap実行エラー

DiscourseサイトのURLを変更し、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: ↩︎

PostgreSQLの分析テーブルで制約の衝突が発生しているようです。データベースには既に特定の日付に関する新ドメインのレコードが含まれているため、remapツールが重複を作成しようとしており、PostgreSQLがそれを拒否している可能性があります。

新ドメインがデータを持っている日付に対してのみ、旧ドメインのレコードを特定のテーブルから削除することを試みてください。これにより、履歴データを保持しつつ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'
);

/* PostgreSQLを終了 */
\q

その後、remapツールを再度実行します

discourse remap discourse.tobiaseigen.org digitallysovereign.org

次に、完全なrebakeではなく rebake_match rakeタスクを使用します

# 新ドメイン文字列を含む投稿のみをrebake
rake posts:rebake_match["digitallysovereign.org"]

リリーさんのアイデアはうまくいくと思います。

私がやっているのは、データベースをバックアップしてURLを変更し、その後リストアしてDiscourseのremapperに作業を任せるというものです。このコードはDiscourseホスティングで使われており、もし失敗したらそれを修正できる人が気づくはずです。:slight_smile:

まあ、確かに那些referrerリンクはいろんな問題を引き起こしてきました。

Lillyさん、ありがとう!

discourse db は私の環境では動作しません。私は sudo -u postgres psql discourse を使用しています。

最初のクエリによって返されたテーブルは実際には browser_pageview_referrer_daily_rollups だったので、2番目のクエリでもそれを使用しました。

今、別のエラーが発生しています。2番目のクエリを再度実行しても、何も削除されません。

Error: ERROR:  duplicate key value violates unique constraint "idx_bprd_rollups_date_referrer_unique"
DETAIL:  Key (date, normalized_referrer)=(2026-06-30, digitallysovereign.org/c/members/32) already exists.
The remap has only been partially applied due to the error above. Please re-run the script again.

なるほど、最初のクエリは完全一致を使用していて、パスが付けられた行をすべて見落としていたのですね。以下の SQL クエリを試してみることをお勧めします(私はネームサーバーのドメイン名を変更する必要がないため、これらをテストすることはできません)。

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

エラーが発生せずに実行できたら、上記で投稿したリマップツールとリベークの rake タスクを実行してください。

数ヶ月前に新しいサーバーと新しいドメイン名へのフォーラム移行を行いました。その際、リマップツールは初回実行で完璧に動作しました。

またしてもありがとう、リリー!あなたは本当に素晴らしいわね。

データベースを少しずつ処理しているようです。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';
```\n
`topic_links` が返ってくるはずです?つまり、これが次の論理的なステップです:

```sql
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 タスクを実行する前の最後の障害( hopefully )になるでしょう…

完了です! :rocket:

root@digitallysovereign-app:/var/www/discourse# discourse remap discourse.tobiaseigen.org digitallysovereign.org
discourse.tobiaseigen.org のすべての出現箇所を digitallysovereign.org に書き換えます
'default' DB で実行されます
このタスクはデータを上書きします。よろしいですか(YES と入力してください): yes

default のテーブルをリマップしています...

topic_links=1449
topic_search_data=11
topics=11
user_auth_token_logs=5
user_histories=131
完了

どちらかを解決済みにマークすべきでしょうね :wink:

了解です!

discourse db が何なのか、そしてなぜあなたはそれを実行できるのに私はできないのか、説明してもらえますか? sudo -u postgres psql discourse よりも覚えやすそうですよね!

コンテナ内でこの種の SQL を実行することは稀なので、単に記憶が曖昧だったようです。そのコマンドが正しいものだと思っていました。おそらく、Discourse に discourse backupdiscourse remap のような組み込みコマンドがあるためでしょう。

隠れた機能リクエストですね!

:disguised_face:

単なる試しに、script/discourse ファイルで discourse db を使うためのクイックなPRを作成しました。チームがこれを追加したいかどうかはわかりませんが、コンテナ内で sql コンソールにアクセスしやすくなります。