Discourse へのコミュニティ (techenclave.com) の移行が完了しました。
投稿数: 250万
ユーザー数: 79K (アクティブおよび禁止ユーザーを含む)
ダイレクトメッセージ数: 70万
20年の歴史を持つコミュニティであり、Proboards、Vbulletin、IPB、XenForo、そして現在の Discourse へと、数多くの移行を経験してきました。
移行作業には4日間かかりましたが、その前には4週間の移行準備と、さらにその前に4週間のカスタムプラグイン開発が必要でした。
ご協力いただいた皆様、そして行き詰まった際に導いてくださった皆様、本当にありがとうございました。![]()
全体として、有用なデータがほとんど失われることなく、非常に成功した移行となりました。
移行の中核は、強化された XenForo インポートスクリプトに基づいており、標準的なベースを大幅に改善しました。また、特定のデータ変換を処理し、インポート後のデータ整合性を確保するために、いくつかの専門的なサポートスクリプトも活用しました。
メイン XenForo インポートスクリプトにおける主な強化点
パフォーマンス最適化 (Keyset Pagination): 最も重要な強化点は、keyset pagination (WHERE id > last_id) の採用です。この方法は、インデックス付きの主キーを使用して次のレコードセットを取得することで、特に大規模なデータセットにおいて、従来の OFFSET クエリと比較してバッチ処理速度を劇的に向上させます。
堅牢なチェックポインティングと再開機能: ユーザー、トピック、返信、ダイレクトメッセージに対して高度なチェックポインティングロジック (.json ファイルを使用) が実装されました。これにより、インポートプロセスは、中断 (サーバーの再起動、スクリプトのエラーなど) の後、最後に正常にインポートされたレコードから安全に再開でき、大幅な時間を節約できます。
2パス投稿インポート戦略: 投稿は現在、2つの異なるパスでインポートされます。
まずトピック: すべての元の XenForo スレッド (最初の投稿) がインポートされ、親トピックが返信の前に存在することを保証します。
次に返信: スレッド内の後続の投稿がインポートされ、新しく作成された Discourse トピックに正しくリンクされます。この構造化されたアプローチにより、孤立した返信が最小限に抑えられ、データの整合性が向上します。
包括的なリアクション/いいねのインポート:
スクリプトは現在、XenForo のリアクションと Discourse のコア「いいね」(ハート) を直接マッピングするものと、カスタムリアクションをインテリジェントに区別します。
コアいいね (post_actions テーブルにインポート) とカスタムリアクション (discourse-reactions プラグインを活用) の両方のバルク挿入をサポートし、プロセスを大幅にスピードアップします。
XenForo の絵文字ショートコードと Discourse の同等物 (例: thumbsup から +1、heart_eyes から heart) のマッピングが含まれています。
マーケットプレイスデータの充実したインポート (カスタムプラグイン):
XenForo の thread_field_value テーブルから、詳細なマーケットプレイス出品データ (価格、場所、状態、保証、支払いオプションなど) をインポートするための専用セクションが追加されました。
このデータは、カスタム TecencMarket::Listing モデルおよびトピックカスタムフィールドとして保存され、Discourse でよりリッチな表示と機能を実現します。
マーケットプレイスフィードバックのインポート (カスタムプラグイン):
マーケットプレイス取引に関連付けられたユーザーフィードバック/評価 (いいね/わるいね) を移行するための新しい関数が導入されました。
スレッドプレフィックスからタグへの変換: スクリプトは現在、XenForo のスレッドプレフィックスを Discourse タグに自動的に変換します。これは、コンテンツの整理と発見可能性を維持するために重要であり、discourse-tagging プラグインを使用します。また、XenForo の phrase テーブルを使用して、プレフィックス ID を人間が読めるタイトルに正しくマッピングします。
投稿コンテンツ処理の強化: この方法は、Markdown 変換と XenForo の複雑な BBCode の処理を改善するために大幅な更新を受けました。
引用処理の改善: XenForo の [QUOTE] タグの変換。引用されたユーザーの処理や、可能な場合の特定の Discourse 投稿/トピックへのリンクが含まれます。
メディア埋め込みの修正: すべてのインポートされたメディア (YouTube、Twitter/X) が別々の行に配置され、Discourse の oneboxing/埋め込み機能が有効になるようにし、古い BBCode [MEDIA] タグを標準 URL に変換します。
テーブル変換: XenForo の [TABLE] BBCode を Markdown テーブルに変換します。
添付ファイルの処理 (インラインおよび追加): 添付ファイル処理ロジックがリファクタリングされました。現在、[ATTACH] タグをアップロードされたファイルに対応する Markdown に置き換えようとします。特に重要なのは、投稿コンテンツ内で明示的に [ATTACH] タグ付けされなかった添付ファイルは、明確な「添付ファイル:」ヘッダーの下に投稿の末尾に追加され、ファイルが失われることがないようにします。
絵文字/スマイリー変換: XenForo のスマイリーとネイティブ Discourse 絵文字のマッピングが拡張され、視覚的な一貫性が向上しました。
一般的な BBCode クリーンアップ: さまざまな BBCode タグ (例: [B]、[I]、[URL]、[IMG]、[LIST]、[CODE]、[COLOR]、[FONT]、[SIZE]、[INDENT]、[USER]) のより包括的な削除と変換。
文字エンコーディングとクリーニング: 無効な UTF-8 シーケンスに対する .scrub! と、適切な HTML エンティティデコードのための CGI.unescapeHTML が含まれています。
停止中のユーザー処理: 禁止された XenForo ユーザーは、Discourse の停止中のユーザーとしてインポートされ、アカウントは保持されますがアクティビティは制限され、禁止理由はカスタムフィールドに保存されます。
ブックマークのインポート: XenForo から Discourse へのすべてのブックマークをインポートします。元々それほど多くはありませんでした。
移行後、多くのユーザーが不満を感じました。これは予想されることです。移行後に皆さんが聞いたことがないようなことではありません。それにもかかわらず、後でこのトピックでフィードバックの概要を共有します。Discourse の将来に役立つ示唆に富む内容があるかもしれません。

