Necromancia de perguntas: migrando do mattermost

Pergunta

Gostaria de saber qual o melhor conselho atual sobre migração de dados de uma instância do Mattermost Team Edition para uma instância do Discourse (estou administrando ambas).

Já li os conselhos sobre como coordenar a mudança e, portanto, agora estou procurando recursos técnicos e conselhos sobre migração de dados.

Contexto

É outubro de 2025, e me encontro em uma situação semelhante a esta pergunta de 2018[1]:

A pressão no meu caso, no entanto, é mais definida — o Mattermost está efetivamente encerrando sua edição de equipe[2].

A discussão original aqui começou com uma recomendação para combinar ambas as plataformas e, em seguida, foi encerrada com uma declaração de que o Discourse agora tem um chat razoavelmente bom (o que tem, especialmente com a próxima busca de chat). No entanto, não continha nenhum conselho para migração.


  1. a discussão concluiu com um membro da equipe do Discourse dizendo que o Discourse usa o Mattermost ↩︎

  2. tecnicamente não o faz, mas vejo as mudanças como uma violação de seu compromisso de código aberto ↩︎

5 curtidas

Olá Anton!

Migrar do Mattermost para o Discourse é certamente viável, mas exigirá a criação de um script de importação personalizado, pois ainda não existe um script pronto (veja os scripts de importação disponíveis aqui). Você pode estudar os scripts existentes como referência, mas verifique as datas de última atualização e adapte-os conforme necessário, pois alguns podem ter referências desatualizadas às tabelas do Discourse.

Um pull request com um script de importação do Mattermost seria muito bem-vindo pela comunidade!

Mapeamento de Canais e Dados

Você pode importar tudo como canais de chat, mas também pode mapeá-los como outros tipos:

  • Canais como Categorias: Importe cada canal do Mattermost como uma categoria do Discourse. As threads dentro dos canais podem se tornar tópicos, com cada mensagem como uma postagem. Alternativamente, postagens individuais podem ser o OP dos tópicos.
  • Canais como Tópicos: Outra abordagem é fazer de cada canal do Mattermost um único tópico, com mensagens como respostas; as threads serão exibidas em sequência neste caso.
  • DMs: Eles também podem ser importados como mensagens privadas. É uma boa ideia para discussões que precisam ser arquivadas.

Pense cuidadosamente sobre qual abordagem se adapta melhor à sua comunidade e ao volume de conteúdo.

Títulos de Tópicos

Ao mapear um chat para tópicos e postagens, você precisa criar os títulos para cada tópico. Uma maneira incrível de fazer isso é usar Discourse AI para gerar os títulos com contexto real para o tópico.

Gerando títulos de tópicos usando IA

RESUMO: use este método:

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

Precisa de um LLM e um prompt mestre

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

system_prompt = <<-PROMPT
  Quero que você atue como um gerador de títulos para textos escritos. Fornecerei um texto,
  e você gerará um título. Por favor, mantenha o título conciso, com menos de 20 palavras,
  e garanta que o significado seja mantido. O título utilizará o tipo de linguagem do tópico.
  Quero que você responda apenas com o título proposto e nada mais, não escreva explicações.
  Nunca use dois pontos no título. Sempre use caixa de frase, com uma letra maiúscula no
  início do título, nunca comece o título com uma letra minúscula. Nomes próprios no título
  podem ter letra maiúscula, e acrônimos como LLM podem usar letras maiúsculas. Formate alguns títulos
  como perguntas, outros como afirmações. Certifique-se de usar pontos de interrogação se o título for uma pergunta.
PROMPT

Então você pode iterar sobre uma lista de tópicos como preferir:

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

# filtrar 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) }

Considerações Importantes

  • Reações: O Mattermost suporta múltiplas reações por postagem. Se importar como postagens do Discourse, você precisará limitar a uma, a menos que esteja mapeando para o Discourse Chat (que suporta múltiplas reações nativamente).
  • Emojis Personalizados: Você pode trazer emojis personalizados, veja a documentação do plugin Discourse Reactions.
  • Equipes e Permissões: As “equipes” do Mattermost não se mapeiam diretamente para o Discourse, mas você pode configurar categorias/canais com controles de acesso apropriados baseados em grupos.
  • Anexos: Os anexos do Mattermost (imagens e documentos) não são incorporados ao conteúdo como no Discourse. Ao importar, você precisará anexar links de anexos (Markdown) ou incorporá-los nos corpos das postagens.

Materiais de Referência


Temos experiência com migrações de plataformas de chat, se você desejar ajuda de nossa equipe, consulte nossa página de serviços de migração do Discourse.

Se você tiver perguntas específicas durante o desenvolvimento do script ou nas decisões de mapeamento, sinta-se à vontade para perguntar no Meta para obter orientação!

5 curtidas

Obrigado por este resumo muito bom! Vou analisá-lo quando chegar a hora da migração. Se eu acabar com um script, certamente o compartilharei com a comunidade.

No momento, inclino-me para importar o chat para canais de chat. Além da falta de pesquisa, que será implementada em breve, existem outras considerações relevantes?

2 curtidas

Neste caso, a maior parte do trabalho será gasta na análise das mensagens. Algumas coisas relevantes são:

  • Menções precisarão de um registro no banco de dados, verifique: mention.rb e group_mention.rb.
  • Anexos também devem ser importados como upload e referenciados no markdown da mensagem. Alternativamente, você pode fazer upload de imagens para um servidor temporário de sua escolha, adicionar um link para elas na postagem e habilitar a configuração: download_remote_images_to_local.
  • Você ainda precisa criar categorias para que os canais possam ter permissões definidas.
  • Se você usa SSO, pode importar usuários diretamente do seu provedor de identidade. Verifique: Sync DiscourseConnect user data with the sync_sso route.
4 curtidas