Razones para migrar:
Creo que es necesario hablar primero sobre las razones para migrar el foro a una nueva plataforma como Discourse. Puede ser arriesgado mudarse ya que las personas están acostumbradas a un cierto diseño y una cierta forma de hacer las cosas.
La desafortunada realidad es que no teníamos elección. Además del diseño anticuado, el foro presentaba graves vulnerabilidades de seguridad. El más alto es uno con un CVSS de 9.3 (Fluxbb : Security vulnerabilities).
El foro se ejecutaba en la versión 1.4.12 de FluxBB, que se lanzó en 2014. La actualización no era una posibilidad ya que la plataforma ya se había descontinuado durante varios años. Por lo tanto, la única conclusión lógica era migrar a una nueva plataforma.
Preparación:
Antes de comenzar, era crucial determinar qué se debía migrar y cómo se manejaría la compatibilidad con versiones anteriores.
Como mínimo, las publicaciones, las categorías y los usuarios debían migrarse. Pero incluso eso es complicado. Por ejemplo, para los usuarios, ¿cómo vamos a migrar las contraseñas? ¿También migramos los avatares? Para las publicaciones, copiar el texto sin formato no es suficiente, ¿cómo nos aseguramos de que el formato siga siendo correcto?
En cuanto a la compatibilidad con versiones anteriores, existen muchos vínculos de retroceso que apuntan a publicaciones de foros existentes, ¿cómo puedo asegurarme de que los vínculos sigan siendo los mismos?
Todas estas eran preguntas que tenían que ser respondidas.
Migración básica:
Tuvimos la suerte de contar con un script básico de migración de FluxBB disponible (discourse/script/import_scripts/fluxbb.rb at main · discourse/discourse · GitHub). Este script se encargó de la mayor parte del trabajo, es decir, importó grupos, usuarios (menos sus contraseñas), categorías, publicaciones y usuarios suspendidos.
Hacer que las contraseñas sean compatibles con versiones anteriores:
La migración de contraseñas sería la parte más complicada de este viaje de migración. Las contraseñas almacenadas en FluxBB se codificaron mediante SHA-1. SHA-1 no es actualmente un algoritmo hash reversible, la consecuencia es que no podría descifrar las contraseñas de todos los usuarios aunque quisiera. Había que pensar en una solución más elegante.
Por suerte, encontré un complemento de discurso que encontró una solución muy elegante a este problema: GitHub - communiteq/discourse-migratepassword: Support migrated password hashes
En lugar de descifrar contraseñas, simplemente almacenaría el hash de la contraseña anterior como un campo personalizado en la base de datos (en este caso, como “import_pass”). Cuando un usuario inicia sesión por primera vez en el nuevo foro, todavía no tiene una contraseña en Discourse, por lo que busca el campo personalizado. La forma en que funciona esta búsqueda es que procesa la contraseña proporcionada en el formulario de inicio de sesión y la compara con la almacenada en el campo personalizado.
Desafortunadamente, este método no funcionó de inmediato ya que el algoritmo hash (SHA-1) no era compatible. Como resultado, tuve que hacer una solicitud de extracción para que fuera compatible: Add support for FluxBB migration by nicprov · Pull Request #15 · communiteq/discourse-migratepassword · GitHub
Migrando las contraseñas
Ahora que encontré una manera elegante de hacer que las contraseñas antiguas funcionaran, tuve que migrarlas a la nueva base de datos. Para hacerlo, tuve que escribir un pequeño script (esto es solo un fragmento):
user = User.find_by(username: u[:username])
if user.present?
user.custom_fields['import_pass'] = u[:password]
user.save_custom_fields(true)
user.save
created += 1
else
puts "User not found"
Hacer que las URL de las publicaciones en el foro sean compatibles con versiones anteriores
El estándar de URL de publicación utilizado en FluxBB difiere completamente del utilizado por Discourse. Afortunadamente, Discourse proporciona una solución fácil a este problema al permitirnos crear enlaces permanentes manualmente. Un enlace permanente crea una redirección permanente a la URL de la publicación actual.
Por ejemplo, https://www.wifi-libre.com/topic-1723-hacer-osint-sobre-una-persona.html → https://www.wifi-libre.com/t/hacer-osint- sobre-una-persona/1705
Esto es genial, pero hacerlo manualmente para más de 1000 publicaciones no es factible. Entonces, había que escribir otro guión.
topic = Topic.find_by(title: t[:subject])
subject = t[:subject]
if topic.present?
subject = subject.gsub(":", "")
.gsub(";", "")
.gsub("%", "")
.gsub("+", "")
.gsub("|", "")
.gsub("(", "")
.gsub(")", "")
.gsub("é", "e")
.gsub("á", "a")
.gsub("ó", "o")
.gsub("ú", "u")
.gsub("ñ", "n")
.gsub("¿", "")
.gsub("?", "")
.gsub("-", "")
.gsub(",", "")
.gsub("\"", "")
.gsub(".", "")
.gsub("@", "")
.gsub("«", "")
.gsub("»", "")
.gsub("!", "")
.gsub("¡", "")
.gsub("...", "")
.gsub(">", "")
.gsub("<", "")
.gsub("/", "")
.gsub("\\", "")
.gsub(" ", " ")
.gsub(" ", "-")
url = "topic-" + t[:id].to_s + "-" + subject.downcase + ".html"
Permalink.create(url: url, topic_id: topic.id)
created += 1
else
puts "Topic not found"
Migración de avatares
Migrar los avatares de los usuarios terminó siendo una tarea manual, esto se debe a que Discourse convierte las imágenes a diferentes formatos para optimizarlas. En este punto, no tenía ganas de dedicar más tiempo a escribir y depurar un script para una tarea que, en última instancia, me llevaría unos 45 minutos.
Asegurarse de que las publicaciones del foro tengan el formato correcto
Desafortunadamente, este es todavía un trabajo en progreso. No todas las etiquetas que funcionaron en FluxBB funcionan en Discourse. Agregar el complemento BBCode resolvió la mayoría de los problemas (Discourse BBCode - plugin - Discourse Meta), pero aún no es perfecto.
Resumen
Hice todo lo posible para que la transición a este nuevo foro fuera lo más fluida posible, pero soy consciente de que no es perfecto. Todavía estoy arreglando pequeños problemas todos los días. Si tiene alguna sugerencia, comentario o si encuentra algún problema, no dude en responder a esta publicación.