Necromanzia delle domande: migrazione da mattermost

Domanda

Vorrei sapere quali sono i migliori consigli attuali sulla migrazione dei dati da un’istanza Mattermost Team Edition a un’istanza Discourse (sto amministrando entrambe).

Ho già letto i consigli su come coordinare lo spostamento e, pertanto, ora sto cercando risorse tecniche e consigli sulla migrazione dei dati.

Contesto

È ottobre 2025 e mi trovo in una situazione simile a questa domanda del 2018[1]:

La pressione nel mio caso, tuttavia, è più definita: Mattermost sta effettivamente chiudendo la sua edizione team[2] (tecnicamente non lo fa, ma considero le modifiche una violazione del loro impegno open source).

La discussione originale qui è iniziata con la raccomandazione di combinare entrambe le piattaforme, e poi è stata chiusa con l’affermazione che Discourse ora ha una chat abbastanza discreta (cosa che ha, specialmente con la ricerca chat in arrivo). Tuttavia, non conteneva alcun consiglio per la migrazione.


  1. la discussione si è conclusa con un membro del team Discourse che affermava che Discourse utilizza Mattermost ↩︎

  2. ironicamente l’annuncio è pubblicato utilizzando Discourse ↩︎

5 Mi Piace

Ciao Anton!

Migrare da Mattermost a Discourse è certamente fattibile, ma richiederà la creazione di uno script di importazione personalizzato, poiché non esiste ancora uno script predefinito (vedi gli script di importazione disponibili qui). Puoi studiare gli script esistenti come riferimento, ma ti preghiamo di controllare attentamente le date dei loro ultimi aggiornamenti e di adattarli di conseguenza, poiché alcuni potrebbero avere riferimenti obsoleti alle tabelle di Discourse.

Una pull request con uno script di importazione per Mattermost sarebbe molto apprezzata dalla community!

Mappatura di canali e dati

Puoi importare tutto come canali di chat, ma puoi anche mapparli come altri tipi:

  • Canali come Categorie: Importa ogni canale Mattermost come una categoria Discourse. I thread all’interno dei canali possono diventare argomenti, con ogni messaggio come post. In alternativa, i singoli post possono essere l’OP degli argomenti.
  • Canali come Argomenti: Un altro approccio è rendere ogni canale Mattermost un singolo argomento, con i messaggi come risposte; i thread verranno visualizzati in sequenza in questo caso.
  • DM: Possono essere importati anche come messaggi privati. È una buona idea per le discussioni che necessitano di archiviazione.

Pensa attentamente a quale approccio si adatta meglio alla tua community e al volume dei contenuti.

Titoli degli argomenti

Quando mappi una chat in argomenti e post, devi creare i titoli per ogni argomento. Un modo fantastico per farlo è usare Discourse AI per generare i titoli con un contesto effettivo per l’argomento.

Generazione di titoli di argomenti tramite AI

In breve, usa questo metodo:

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

Richiede un LLM e un prompt master

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

system_prompt = <<-PROMPT
  Voglio che tu agisca come un generatore di titoli per testi scritti. Ti fornirò un testo,
  e tu genererai un titolo. Per favore, mantieni il titolo conciso, entro le 20 parole,
  e assicurati che il significato sia mantenuto. Il titolo utilizzerà il tipo di lingua dell'argomento.
  Voglio che tu risponda solo con il titolo proposto e nient'altro, non scrivere spiegazioni.
  Non usare mai due punti nel titolo. Usa sempre la capitalizzazione delle frasi, usando una lettera maiuscola all'inizio
  del titolo, non iniziare mai il titolo con una lettera minuscola. I nomi propri nel titolo
  possono avere una lettera maiuscola e gli acronimi come LLM possono usare lettere maiuscole. Formatta alcuni titoli
  come domande, altri come affermazioni. Assicurati di usare punti interrogativi se il titolo è una domanda.
PROMPT

Quindi puoi ciclare su un elenco di argomenti come preferisci:

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

# filtra PM
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) }

Considerazioni importanti

  • Reazioni: Mattermost supporta più reazioni per post. Se importi come post Discourse, dovrai limitarti a una, a meno che tu non stia mappando in Discourse Chat (che supporta nativamente più reazioni).
  • Emoji personalizzate: Puoi portare con te le emoji personalizzate, consulta la documentazione del plugin Discourse Reactions.
  • Team e permessi: I “team” di Mattermost non si mappano direttamente a Discourse, ma puoi impostare categorie/canali con appropriati controlli di accesso basati sui gruppi.
  • Allegati: Gli allegati di Mattermost (immagini e documenti) non sono incorporati nel contenuto come in Discourse. Durante l’importazione, dovrai aggiungere i link agli allegati (Markdown) o incorporarli nei corpi dei post.

Materiali di riferimento


Abbiamo esperienza con le migrazioni di piattaforme di chat, se desideri l’aiuto del nostro team, consulta la nostra pagina dei servizi di migrazione Discourse.

Se hai domande specifiche durante lo sviluppo dello script o le decisioni di mappatura, non esitare a chiedere su Meta per una guida!

5 Mi Piace

Grazie per questo ottimo riassunto! Ci darò un’occhiata quando arriverà il momento della migrazione. Se realizzerò uno script, lo condividerò sicuramente con la community.

Al momento sono propenso a importare le chat nei canali di chat. A parte la mancanza di ricerca, che verrà presto implementata, ci sono altre considerazioni pertinenti?

2 Mi Piace

In questo caso la maggior parte del lavoro sarà dedicata all’analisi dei messaggi. Alcune cose pertinenti sono:

  • Le menzioni avranno bisogno di un record nel database, controlla: mention.rb e group_mention.rb.
  • Anche gli allegati dovrebbero essere importati come upload e referenziati nel markdown del messaggio. In alternativa, puoi caricare le immagini su un server temporaneo di tua scelta, aggiungere un link ad esse nel post e abilitare l’impostazione: download_remote_images_to_local.
  • Dovrai comunque creare categorie per i canali per poter impostare i permessi.
  • Se usi SSO, puoi importare gli utenti direttamente dal tuo Identity provider. Controlla: Sync DiscourseConnect user data with the sync_sso route.
4 Mi Piace