Nécromancie de questions : migration depuis Mattermost

Question

Je voudrais connaître les meilleurs conseils actuels pour la migration de données d’une instance Mattermost Team Edition vers une instance Discourse (j’administre les deux).

J’ai déjà lu les conseils sur la façon de coordonner le déménagement, et je cherche donc maintenant des ressources techniques et des conseils sur la migration des données.

Contexte

Nous sommes en octobre 2025, et je me retrouve dans une situation similaire à celle de cette question de 2018[1] :

La pression dans mon cas, cependant, est plus définie : Mattermost ferme effectivement son édition gratuite[2] (techniquement, ce n’est pas le cas, mais je considère les changements comme une violation de leur engagement open source).

La discussion initiale ici a commencé par une recommandation de combiner les deux plateformes, puis s’est terminée par une déclaration selon laquelle Discourse dispose maintenant d’un chat plutôt correct (ce qui est le cas, surtout avec la recherche de chat à venir). Elle ne contenait cependant aucun conseil pour la migration.


  1. la discussion s’est terminée par un membre de l’équipe Discourse disant que Discourse utilise Mattermost ↩︎

  2. ironiquement, l’annonce est publiée sur Discourse ↩︎

5 « J'aime »

Salut Anton !

Migrer de Mattermost vers Discourse est tout à fait faisable, mais cela nécessitera la création d’un script d’importation personnalisé, car il n’existe pas encore de script prêt à l’emploi (voir les scripts d’importation disponibles ici). Vous pouvez étudier les scripts existants à titre de référence, mais veuillez vérifier attentivement leurs dates de dernière mise à jour et adapter en conséquence, car certains pourraient contenir des références obsolètes aux tables de Discourse.

Une pull request avec un script d’importation Mattermost serait très appréciée par la communauté !

Mapping des canaux et des données

Vous pouvez tout importer sous forme de canaux de discussion, mais vous pouvez également les mapper à d’autres types :

  • Canaux en tant que Catégories : Importez chaque canal Mattermost comme une catégorie Discourse. Les fils de discussion au sein des canaux peuvent devenir des sujets, chaque message étant un post. Alternativement, les messages individuels peuvent être l’OP des sujets.
  • Canaux en tant que Sujets : Une autre approche consiste à faire de chaque canal Mattermost un seul sujet, les messages étant des réponses. Les fils de discussion seront alors affichés séquentiellement.
  • Messages privés : Ils peuvent également être importés sous forme de messages privés. C’est une bonne idée pour les discussions qui nécessitent d’être archivées.

Réfléchissez bien à l’approche qui convient le mieux à votre communauté et au volume de contenu.

Titres des sujets

Lorsque vous mappez une discussion à des sujets et des posts, vous devez créer les titres pour chaque sujet. Une façon incroyable de le faire est d’utiliser Discourse AI pour générer les titres avec le contexte réel du sujet.

Générer des titres de sujets à l’aide de l’IA

EN BREF, utilisez cette méthode :

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

Cela nécessite un LLM et un prompt maître

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

system_prompt = <<-PROMPT
  Je veux que vous agissiez en tant que générateur de titres pour des textes écrits. Je vais vous fournir un texte, et vous générerez un titre. Veuillez garder le titre concis, moins de 20 mots, et veiller à ce que le sens soit maintenu. Le titre utilisera le type de langue du sujet. Je veux que vous répondiez uniquement par le titre proposé et rien d'autre, n'écrivez pas d'explications. N'utilisez jamais de deux-points dans le titre. Utilisez toujours la casse de phrase, en commençant par une majuscule, ne commencez jamais le titre par une minuscule. Les noms propres dans le titre peuvent avoir une majuscule, et les acronymes comme LLM peuvent utiliser des majuscules. Formatez certains titres comme des questions, d'autres comme des affirmations. Assurez-vous d'utiliser des points d'interrogation si le titre est une question.
PROMPT

Ensuite, vous pouvez boucler sur une liste de sujets comme vous le souhaitez :

# tout générer
Topic
  .joins(:_custom_fields)
  .where('topic_custom_fields.name = ?', 'import_id')
  .find_each { |topic| gen_title(llm, system_prompt, topic) }

# filtrer les MP
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) }

Considérations importantes

  • Réactions : Mattermost prend en charge plusieurs réactions par message. Si vous importez en tant que posts Discourse, vous devrez limiter à une seule, sauf si vous mappez vers Discourse Chat (qui prend en charge plusieurs réactions nativement).
  • Émojis personnalisés : Vous pouvez importer des émojis personnalisés, consultez la documentation du plugin Discourse Reactions.
  • Équipes et Permissions : Les “équipes” de Mattermost ne correspondent pas directement à Discourse, mais vous pouvez configurer des catégories/canaux avec des contrôles d’accès appropriés basés sur les groupes.
  • Pièces jointes : Les pièces jointes de Mattermost (images et documents) ne sont pas intégrées au contenu comme dans Discourse. Lors de l’importation, vous devrez ajouter des liens vers les pièces jointes (Markdown) ou les intégrer dans le corps des messages.

Matériaux de référence


Nous avons de l’expérience dans les migrations de plateformes de chat. Si vous souhaitez l’aide de notre équipe, consultez notre page de services de migration Discourse.

Si vous avez des questions spécifiques pendant le développement du script ou lors des décisions de mappage, n’hésitez pas à demander sur Meta pour obtenir des conseils !

5 « J'aime »

Merci pour ce très bon résumé ! Je vais l’examiner lorsque le moment de la migration viendra. Si je parviens à créer un script, je le partagerai certainement avec la communauté.

Pour l’instant, je penche pour l’importation des conversations dans les canaux de discussion. Outre l’absence de recherche, qui sera bientôt implémentée, y a-t-il d’autres considérations pertinentes ?

2 « J'aime »

Dans ce cas, la majeure partie du travail consistera à analyser les messages. Voici quelques points pertinents :

  • Les mentions devront être enregistrées dans la base de données, consultez : mention.rb et group_mention.rb.
  • Les pièces jointes devraient également être importées en tant que upload et référencées dans le markdown du message. Alternativement, vous pouvez télécharger des images sur un serveur temporaire de votre choix, ajouter un lien vers celles-ci dans le message et activer le paramètre : download_remote_images_to_local.
  • Vous devrez toujours créer des catégories pour les canaux afin de pouvoir définir les permissions.
  • Si vous utilisez l’authentification unique (SSO), vous pouvez importer directement les utilisateurs de votre fournisseur d’identité. Consultez : Sync DiscourseConnect user data with the sync_sso route.
4 « J'aime »