Necromancia de preguntas: migración desde mattermost

Pregunta

Me gustaría saber cuál es el mejor consejo actual sobre la migración de datos de una instancia de Mattermost Team Edition a una instancia de Discourse (estoy administrando ambas).

Ya he leído los consejos sobre cómo coordinar la mudanza, y por lo tanto, ahora busco recursos técnicos y consejos sobre la migración de datos.

Contexto

Es octubre de 2025 y me encuentro en una situación similar a la de esta pregunta de 2018[1]:

Sin embargo, la presión en mi caso es más definida: Mattermost está cerrando efectivamente su edición de equipo[2] (técnicamente no lo hace, pero considero que los cambios son una violación de su compromiso de código abierto).

La discusión original aquí comenzó con una recomendación para combinar ambas plataformas, y luego se cerró con una declaración de que Discourse ahora tiene un chat bastante bueno (lo cual tiene, especialmente con la próxima búsqueda de chat). Sin embargo, no contenía ningún consejo para la migración.


  1. la discusión concluyó con un miembro del equipo de Discourse diciendo que Discourse usa Mattermost ↩︎

  2. irónicamente, el anuncio se publica usando Discourse ↩︎

5 Me gusta

¡Hola Anton!

Migrar de Mattermost a Discourse es ciertamente factible, pero requerirá la creación de un script de importación personalizado, ya que aún no hay un script prefabricado disponible (ver scripts de importación disponibles aquí). Puedes estudiar los scripts existentes como referencia, pero por favor, verifica sus fechas de última actualización y adáptalos en consecuencia, ya que algunos podrían tener referencias obsoletas a las tablas de Discourse.

¡Una solicitud de extracción (pull request) con un script de importación de Mattermost sería muy bienvenida por la comunidad!

Mapeo de Canales y Datos

Puedes importar todo como canales de chat, pero también puedes mapearlos como otros tipos:

  • Canales como Categorías: Importa cada canal de Mattermost como una categoría de Discourse. Los hilos dentro de los canales pueden convertirse en temas, con cada mensaje como una publicación. Alternativamente, las publicaciones individuales pueden ser el OP (Original Poster) de los temas.
  • Canales como Temas: Otro enfoque es hacer de cada canal de Mattermost un solo tema, con los mensajes como respuestas; en este caso, los hilos se mostrarán en secuencia.
  • Mensajes Directos (DMs): También se pueden importar como mensajes privados. Es una buena idea para discusiones que necesitan ser archivadas.

Piensa detenidamente qué enfoque se adapta mejor a tu comunidad y al volumen de contenido.

Títulos de Temas

Al mapear un chat a temas y publicaciones, tienes que crear los títulos para cada tema. Una forma increíble de hacerlo es usando Discourse AI para generar los títulos con el contexto real del tema.

Generación de Títulos de Temas con IA

EN RESUMEN: usa 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

Necesita un LLM y un prompt maestro

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

system_prompt = <<-PROMPT
  Quiero que actúes como un generador de títulos para textos escritos. Te proporcionaré un texto y generarás un título. Por favor, mantén el título conciso, por debajo de 20 palabras, y asegúrate de que el significado se mantenga. El título utilizará el tipo de idioma del tema. Quiero que solo respondas con el título propuesto y nada más, no escribas explicaciones. Nunca uses dos puntos en el título. Usa siempre mayúsculas al inicio de la frase, comenzando el título con una letra mayúscula, nunca empieces el título con una letra minúscula. Los nombres propios en el título pueden tener mayúscula, y las siglas como LLM pueden usar mayúsculas. Formatea algunos títulos como preguntas, otros como afirmaciones. Asegúrate de usar signos de interrogación si el título es una pregunta.
PROMPT

Luego puedes iterar sobre una lista de temas como prefieras:

# generar todo
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) }

Consideraciones Importantes

  • Reacciones: Mattermost soporta múltiples reacciones por publicación. Si importas como publicaciones de Discourse, necesitarás limitar a una, a menos que mapees a Discourse Chat (que soporta múltiples reacciones de forma nativa).
  • Emojis Personalizados: Puedes traer emojis personalizados, consulta la documentación del plugin Discourse Reactions.
  • Equipos y Permisos: Los “equipos” de Mattermost no se mapean directamente a Discourse, pero puedes configurar categorías/canales con controles de acceso apropiados basados en grupos.
  • Archivos Adjuntos: Los archivos adjuntos de Mattermost (imágenes y documentos) no se incrustan en el contenido como en Discourse. Al importar, necesitarás añadir enlaces a los archivos adjuntos (Markdown) o incrustarlos en los cuerpos de las publicaciones.

Materiales de Referencia


Tenemos experiencia en migraciones de plataformas de chat, si deseas ayuda de nuestro equipo, consulta nuestra página de servicios de migración de Discourse.

Si tienes preguntas específicas durante el desarrollo del script o las decisiones de mapeo, ¡no dudes en preguntar en Meta para obtener orientación!

5 Me gusta

¡Gracias por este resumen tan bueno! Lo revisaré cuando llegue el momento de la migración. Si termino con un script, sin duda lo compartiré con la comunidad.

Ahora mismo me inclino por importar el chat a los canales de chat. Aparte de la falta de búsqueda, que se implementará pronto, ¿hay otras consideraciones relevantes?

2 Me gusta

En este caso, la mayor parte del trabajo se dedicará a analizar los mensajes. Algunas cosas relevantes son:

  • Las menciones necesitarán un registro en la base de datos, consulta: mention.rb y group_mention.rb.
  • Los archivos adjuntos también deberían importarse como upload y referenciarse en el markdown del mensaje. Alternativamente, puedes subir imágenes a un servidor temporal de tu elección, añadir un enlace a ellas en la publicación y habilitar la configuración: download_remote_images_to_local.
  • Todavía tienes que crear categorías para que los canales puedan establecer permisos.
  • Si usas SSO, puedes importar usuarios directamente desde tu proveedor de identidad. Consulta: Sync DiscourseConnect user data with the sync_sso route.
4 Me gusta