質問のネクロマンシー:Mattermostからの移行

質問

MattermostチームエディションのインスタンスからDiscourseのインスタンスへのデータ移行に関する、現在の最善のアドバイスについて知りたいです(両方を管理しています)。

移行の調整方法に関するアドバイスはすでに読みましたので、現在はデータ移行に関する技術的なリソースとアドバイスを探しています。

コンテキスト

2025年10月、私は2018年のこの質問と同様の状況にいます[1]

しかし、私の場合はより明確なプレッシャーがあります。Mattermostは事実上、チームエディションをシャットダウンしています[2](技術的にはそうではありませんが、私はその変更をオープンソースへのコミットメントの違反と見なしています)。

ここでの元の議論は、両方のプラットフォームを組み合わせるという推奨から始まり、その後、Discourseにはかなり良いチャット機能ができたという声明で終了しました(それは事実であり、特に今後のチャット検索機能により)。しかし、移行に関するアドバイスは含まれていませんでした。


  1. 議論は、DiscourseチームメンバーがDiscourseはMattermostを使用していると述べたことで結論付けられました ↩︎

  2. 皮肉なことに、発表はDiscourseを使用して投稿されています ↩︎

「いいね!」 5

こんにちは、アントン!

Mattermost から Discourse への移行は確かに可能ですが、カスタムインポートスクリプトを作成する必要があります。現時点では、既製のスクリプトは利用できません(利用可能なインポートスクリプトはこちらを参照してください)。既存のスクリプトを参考に学習することはできますが、それらの最終更新日を十分に確認し、適宜調整してください。一部のスクリプトは Discourse のテーブルへの参照が古い可能性があります。

Mattermost インポートスクリプトを含むプルリクエストは、コミュニティにとって非常に歓迎されるでしょう!

チャンネルとデータのマッピング

すべてをチャットチャンネルとしてインポートすることもできますが、他のタイプとしてマッピングすることも可能です。

  • チャンネルをカテゴリとして: 各 Mattermost チャンネルを Discourse のカテゴリとしてインポートします。チャンネル内のスレッドはトピックになり、各メッセージは投稿になります。あるいは、個々の投稿がトピックの OP になることもあります。
  • チャンネルをトピックとして: 別の方法として、各 Mattermost チャンネルを 1 つのトピックにし、メッセージを返信として追加します。この場合、スレッドは順番に表示されます。
  • DM: プライベートメッセージとしてもインポートできます。アーカイブが必要なディスカッションに適しています。

コミュニティとコンテンツの量に最適なアプローチを慎重に検討してください。

トピックタイトル

チャットをトピックと投稿にマッピングする場合、各トピックのタイトルを作成する必要があります。そのための素晴らしい方法の 1 つは、Discourse AI を使用して、トピックの実際のコンテキストでタイトルを生成することです。

AI を使用したトピックタイトルの生成

要するに、この方法を使用します。

def gen_title(llm, system_prompt, topic)
  begin
  content = topic.posts.map(&:cooked).join("\n").slice(0..10_000)
  message = [{type: :user, content: content}]
  prompt = DiscourseAi::Completions::Prompt.new(system_prompt, messages: message)

  title = llm.generate(
      prompt,
      user: Discourse.system_user,
      temperature: 0.3,
      feature_name: "ai_helper"
  )

  topic.title = title
  topic.save!
  puts "Topic: #{topic.id}, changed sucessfully."
  rescue ActiveRecord::RecordInvalid
    puts "validation error"
  end
end

LLM とマスタープロンプトが必要です。

llm = DiscourseAi::Completions::Llm.proxy(SiteSetting.ai_helper_model)

system_prompt = <<-PROMPT
  I want you to act as a title generator for written pieces. I will provide you with a text,
  and you will generate a title. Please keep the title concise and under 20 words,
  and ensure that the meaning is maintained. The title will utilize the language type of the topic.
  I want you to only reply the proposed title and nothing else, do not write explanations.
  Never ever use colons in the title. Always use sentence case, using a capital letter at
  the start of the title, never start the title with a lower case letter. Proper nouns in the title
  can have a capital letter, and acronyms like LLM can use capital letters. Format some titles
  as questions, some as statements. Make sure to use question marks if the title is a question.
PROMPT

次に、好みに応じてトピックのリストにループ処理できます。

# gen everything
Topic
  .joins(:_custom_fields)
  .where('topic_custom_fields.name = ?', 'import_id')
  .find_each { |topic| gen_title(llm, system_prompt, topic) }

# filter PMs
Topic
  .joins(:_custom_fields)
  .where('topic_custom_fields.name = ?', 'import_id')
  .where.not(archetype: "private_message")
  .find_each { |topic| gen_title(llm, system_prompt, topic) }

重要な考慮事項

  • リアクション: Mattermost は投稿ごとに複数のリアクションをサポートしています。Discourse の投稿としてインポートする場合、Discourse Chat(ネイティブで複数のリアクションをサポート)にマッピングしない限り、1 つに制限する必要があります。
  • カスタム絵文字: カスタム絵文字を持ち込むことができます。Discourse Reactions プラグインのドキュメントを参照してください。
  • チームと権限: Mattermost の「チーム」は Discourse に直接マッピングされませんが、適切なグループベースのアクセス制御を持つカテゴリ/チャンネルを設定できます。
  • 添付ファイル: Mattermost の添付ファイル(画像やドキュメント)は、Discourse のようにコンテンツに埋め込まれません。インポート時に、添付ファイルのリンク(Markdown)を追加するか、投稿本文に埋め込む必要があります。

参考資料


チャットプラットフォームの移行経験があります。当社のチームからの支援をご希望の場合は、Discourse 移行サービスページをご覧ください。

スクリプト開発やマッピングの決定中に特定の質問がある場合は、Meta でお気軽にご質問ください!

「いいね!」 5

この非常に良い要約をありがとうございます!移行の時期が来たら、検討します。スクリプトを作成した場合は、必ずコミュニティと共有します。

現時点では、チャットをチャットチャンネルにインポートすることを検討しています。検索機能がないこと(これはすぐに実装される予定です)以外に、関連する考慮事項はありますか?

「いいね!」 2

この場合、作業のほとんどはメッセージの解析に費やされます。関連する点がいくつかあります。

  • メンションはデータベースにレコードを格納する必要があります。確認してください: mention.rb および group_mention.rb
  • 添付ファイルも upload としてインポートし、メッセージのマークダウンで参照する必要があります。あるいは、選択した一時サーバーに画像をアップロードし、投稿にそれらへのリンクを追加して、設定 download_remote_images_to_local を有効にすることもできます。
  • チャンネルの権限を設定できるようにするには、カテゴリを作成する必要があります。
  • SSOを使用している場合は、Identity providerから直接ユーザーをインポートできます。確認してください: https://meta.discourse.org/t/sync-discourseconnect-user-data-with-the-sync-sso-route/84398。
「いいね!」 4