Fragen-Nekromantie: Migration von Mattermost

Frage

Ich möchte mich über die aktuell besten Ratschläge zur Datenmigration von einer Mattermost Team Edition-Instanz zu einer Discourse-Instanz informieren (ich verwalte beide).

Ich habe bereits die Ratschläge zur Koordination des Umzugs gelesen und suche daher nun nach technischen Ressourcen und Ratschlägen zur Datenmigration.

Kontext

Es ist Oktober 2025, und ich befinde mich in einer ähnlichen Situation wie in dieser Frage aus dem Jahr 2018[1]:

Der Druck in meinem Fall ist jedoch eindeutiger – Mattermost stellt seine Team Edition praktisch ein[2] (technisch gesehen tut es das nicht, aber ich betrachte die Änderungen als Verstoß gegen ihre Open-Source-Verpflichtung).

Die ursprüngliche Diskussion hier begann mit der Empfehlung, beide Plattformen zu kombinieren, und wurde dann mit der Aussage geschlossen, dass Discourse inzwischen ein ziemlich gutes Chat-Angebot hat (was es auch tut, insbesondere mit der bevorstehenden Chat-Suche). Sie enthielt jedoch keine Ratschläge zur Migration.


  1. Die Diskussion endete mit der Aussage eines Discourse-Teammitglieds, dass Discourse Mattermost verwendet ↩︎

  2. Ironischerweise wird die Ankündigung mit Discourse veröffentlicht ↩︎

5 „Gefällt mir“

Hallo Anton!

Die Migration von Mattermost zu Discourse ist durchaus machbar, erfordert jedoch die Erstellung eines benutzerdefinierten Importskripts, da noch kein fertiges Skript verfügbar ist (siehe verfügbare Importskripte hier). Sie können die vorhandenen Skripte als Referenz studieren, aber überprüfen Sie bitte sorgfältig deren letzte Aktualisierungsdaten und passen Sie sie entsprechend an, da einige veraltete Verweise auf Discourse-Tabellen enthalten könnten.

Ein Pull Request mit einem Mattermost-Importskript wäre für die Community sehr willkommen!

Kanal- und Datenzuordnung

Sie können alles als Chat-Kanäle importieren, aber Sie können sie auch als andere Typen zuordnen:

  • Kanäle als Kategorien: Importieren Sie jeden Mattermost-Kanal als Discourse-Kategorie. Threads innerhalb von Kanälen können zu Themen werden, wobei jede Nachricht ein Beitrag ist. Alternativ können einzelne Beiträge der OP von Themen sein.
  • Kanäle als Themen: Ein anderer Ansatz ist, jeden Mattermost-Kanal zu einem einzigen Thema zu machen, wobei Nachrichten Antworten sind. Threads werden in diesem Fall sequenziell angezeigt.
  • Direktnachrichten (DMs): Diese können auch als private Nachrichten importiert werden. Dies ist eine gute Idee für Diskussionen, die archiviert werden müssen.

Überlegen Sie sorgfältig, welcher Ansatz am besten zu Ihrer Community und Ihrem Inhaltsvolumen passt.

Thema-Titel

Wenn Sie einen Chat Themen und Beiträgen zuordnen, müssen Sie die Titel für jedes Thema erstellen. Eine erstaunliche Methode dafür ist die Verwendung von Discourse AI, um die Titel mit tatsächlichem Kontext für das Thema zu generieren.

Thema-Titel mit KI generieren

KURZ GESAGT, verwenden Sie diese Methode:

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

Es benötigt ein LLM und einen Master-Prompt

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

system_prompt = <<-PROMPT
  Ich möchte, dass Sie als Titelgenerator für geschriebene Texte fungieren. Ich werde Ihnen einen Text geben, und Sie werden einen Titel generieren. Bitte halten Sie den Titel kurz und unter 20 Wörtern, und stellen Sie sicher, dass die Bedeutung erhalten bleibt. Der Titel wird die Sprache des Themas verwenden. Ich möchte, dass Sie nur den vorgeschlagenen Titel antworten und nichts anderes, schreiben Sie keine Erklärungen. Verwenden Sie niemals Doppelpunkte im Titel. Verwenden Sie immer Satzschreibung, mit einem Großbuchstaben am Anfang des Titels, beginnen Sie niemals den Titel mit einem Kleinbuchstaben. Eigennamen im Titel können einen Großbuchstaben haben, und Akronyme wie LLM können Großbuchstaben verwenden. Formatieren Sie einige Titel als Fragen, einige als Aussagen. Stellen Sie sicher, dass Sie Fragezeichen verwenden, wenn der Titel eine Frage ist.
PROMPT

Dann können Sie nach Belieben eine Liste von Themen durchlaufen:

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

# PMs filtern
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) }

Wichtige Überlegungen

  • Reaktionen: Mattermost unterstützt mehrere Reaktionen pro Beitrag. Wenn Sie als Discourse-Beiträge importieren, müssen Sie sich auf eine beschränken, es sei denn, Sie ordnen sie Discourse Chat zu (das mehrere Reaktionen nativ unterstützt).
  • Benutzerdefinierte Emojis: Sie können benutzerdefinierte Emojis mitbringen. Sehen Sie sich die Dokumentation des Discourse Reactions Plugins an.
  • Teams & Berechtigungen: Mattermost “Teams” werden nicht direkt auf Discourse abgebildet, aber Sie können Kategorien/Kanäle mit entsprechenden gruppenbasierten Zugriffskontrollen einrichten.
  • Anhänge: Mattermost-Anhänge (Bilder und Dokumente) sind nicht wie in Discourse in den Inhalt eingebettet. Beim Import müssen Sie Anhangslinks (Markdown) anhängen oder sie in die Beitragskörper einbetten.

Referenzmaterialien


Wir haben Erfahrung mit Migrationen von Chat-Plattformen. Wenn Sie Hilfe von unserem Team wünschen, besuchen Sie unsere Discourse-Migrationsdienste-Seite.

Wenn Sie spezifische Fragen während der Skriptentwicklung oder bei Zuordnungsentscheidungen haben, können Sie sich gerne auf Meta um Rat fragen!

5 „Gefällt mir“

Vielen Dank für diese sehr schöne Zusammenfassung! Ich werde sie mir ansehen, sobald die Zeit für die Migration gekommen ist. Wenn ich am Ende ein Skript habe, werde ich es auf jeden Fall mit der Community teilen.

Im Moment neige ich dazu, Chats in Chat-Kanäle zu importieren. Abgesehen vom fehlenden Suchfunktion, die bald implementiert wird, gibt es noch andere relevante Überlegungen?

2 „Gefällt mir“

In diesem Fall wird die meiste Arbeit in das Parsen der Nachrichten fließen. Ein paar relevante Dinge sind:

  • Erwähnungen benötigen einen Eintrag in der Datenbank, siehe: mention.rb und group_mention.rb.
  • Anhänge sollten auch als upload importiert und in der Nachrichten-Markdown referenziert werden. Alternativ können Sie Bilder auf einen temporären Server Ihrer Wahl hochladen, einen Link dazu in den Beitrag einfügen und die Einstellung aktivieren: download_remote_images_to_local.
  • Sie müssen immer noch Kategorien für die Kanäle erstellen, um Berechtigungen festlegen zu können.
  • Wenn Sie SSO verwenden, können Sie Benutzer direkt von Ihrem Identitätsanbieter importieren. Siehe: Sync DiscourseConnect user data with the sync_sso route.
4 „Gefällt mir“