Migrar un foro de MyBB a Discourse

En este tutorial, aprenderemos cómo migrar un foro de MyBB a la plataforma :discourse: utilizando el script oficial de importación de MyBB MyBB_importer.

Qué se puede migrar

  • Categorías
    • Categoría raíz => categoría raíz
    • Categoría hija => subcategoría
    • Foro raíz => subcategoría
    • Foro hijo => subcategoría
  • Hilos y respuestas => temas y publicaciones
  • Usuarios
    • nombre de usuario
    • correo electrónico
    • estado de privilegios
    • estado de registro
  • Redirecciones

Nuestro plan es muy simple:

  • Configurar el entorno de desarrollo (DEV) local.
  • Exportar la base de datos de producción.
  • Importar la base de datos de producción a Discourse.
  • Ejecutar el script de importación de MyBB.

¡Comencemos :slightly_smiling_face:

Configurar el entorno de desarrollo (DEV) local

En primer lugar, debes seguir una de estas guías para instalar la plataforma Discourse en sí. Consulta esta guía si tienes algún problema.

Instala el servidor de base de datos MySQL;

MacOS:

$ brew install mysql@5.7
$ echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile

Verifica el estado del servicio:

$ brew services list

Deberías ver algo como esto:

mysql@5.7         started

De lo contrario, ejecuta lo siguiente e inténtalo de nuevo:

$ brew services start mysql@5.7

Ubuntu 18.04:

$ sudo apt update
$ sudo apt install mysql-server -y

Después de terminar de instalar MySQL, verifica su estado:

$ systemctl status mysql.service

Si no se está ejecutando, ejecuta lo siguiente:

$ sudo systemctl start mysql

Para Windows, puedes seguir la guía de instalación oficial.

Llamaremos a este entorno: servidor de Discourse.

Exportar la base de datos de producción

Exporta/respalda la base de datos de producción (desde el servidor de producción de MyBB) ejecutando:

$ mysqldump -u USER_NAME -p DATABASE_NAME > mybb_dump.sql
  • Copia este volcado de base de datos al servidor de Discourse.

:bulb: Puedes usar scp o rsync para copiar la base de datos.

Importar la base de datos de producción a Discourse

En el servidor de Discourse, crea una base de datos:

$ mysql -u root

:bulb: Si tu usuario de DB tiene una contraseña, debes usar: mysql -u root -p y luego escribir tu contraseña.

mysql> CREATE DATABASE mybb;

Asegúrate de que la base de datos se haya creado correctamente ejecutando:

mysql> SHOW DATABASES;

Deberías ver algo como:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| mybb               |
| sys                |
+--------------------+

La base de datos mybb está vacía por ahora. Nuestro siguiente paso es importar la base de datos de producción en ella.

$ mysql -u root mybb < mybb_dump.sql

Más adelante, necesitaremos el prefijo de tabla. Así que, mientras estamos aquí, obtengámoslo.

$ mysql -u root
mysql> USE mybb;
mysql> SHOW TABLES;

Verás algo como esto:

+--------------------------+
| Tables_in_mybb           |
+--------------------------+
| mybb_adminlog            |
| mybb_adminoptions        |
| mybb_adminsessions       |
| mybb_adminviews          |
| mybb_announcements       |
| mybb_attachments         |
| mybb_attachtypes         |
| ...El resto de tablas....|
+--------------------------+

Nuestro prefijo de tabla es mybb_ según muestra la salida.

Ejecutar el script de importación de MyBB

  • Primero, instalemos las dependencias del importador. Desde el servidor de Discourse:
$ cd ~/discourse
$ echo "gem 'mysql2', require: false" >> Gemfile
$ bundle install

A continuación, debes configurar el script para que funcione correctamente. Copia y pega lo siguiente en tu shell (cambia los valores si es necesario):

export DB_HOST="localhost"
export DB_NAME="mybb"
export DB_PW=""
export DB_USER="root"
export TABLE_PREFIX="mybb_"

Tienes otra opción para configurar el script. Abre script/import_scripts/mybb.rb en cualquier editor de tu elección y cambia los valores dentro de las comillas dobles para que se ajusten a tus necesidades:

  DB_HOST ||= ENV['DB_HOST'] || "localhost"
  DB_NAME ||= ENV['DB_NAME'] || "mybb"
  DB_PW ||= ENV['DB_PW'] || ""
  DB_USER ||= ENV['DB_USER'] || "root"
  TABLE_PREFIX ||= ENV['TABLE_PREFIX'] || "mybb_"

Ejecuta el importador con una instancia limpia de Discourse:

$ bundle exec rails db:drop
$ bundle exec rails db:create
$ bundle exec rails db:migrate
$ bundle exec ruby script/import_scripts/mybb.rb

El importador se conectará al servidor MySQL y migrará tu base de datos de MyBB a la base de datos de Discourse.

Después de que el importador termine, inicia la instancia de Discourse ejecutando:

$ bundle exec rails server

A continuación, inicia Sidekiq (procesador de trabajos en segundo plano) para procesar los datos migrados:

$ bundle exec sidekiq

:bulb: Puedes monitorear el progreso de Sidekiq en http://localhost:3000/sidekiq/queues.

Configura tu servidor de producción de Discourse siguiendo este tutorial.

Realiza una copia de seguridad de la plataforma Discourse (servidor local de Discourse) y súbela a tu servidor de producción de Discourse siguiendo este tutorial.

:tada:

Si tienes alguna pregunta sobre el proceso, estaré encantado de ayudar.

¡Feliz migración :grinning:

9 Me gusta

Hola: esto parece una gran guía, excepto que, como usuario de cPanel en lugar de Linux, al migrar desde un hosting compartido, no tengo acceso root ni acceso SSH al servidor original, pero sí tengo acceso a phpMyAdmin en cPanel, desde donde puedo exportar la base de datos de MyBB.
¿Esto servirá?
¿Se requieren alguna configuración especial de exportación? ¿Y en qué directorio de mi droplet de Digital Ocean debería copiarse esta base de datos? (Estoy usando FileZilla)

Sí.

No importa, el directorio principal funciona perfectamente.

3 Me gusta

Hola de nuevo: puedo llegar hasta este punto en el tutorial

bundle install

y para mí falla con el siguiente error:

'No ejecutes Bundler como root. Bundler puede solicitar sudo si es necesario, y
instalar tu bundle como root romperá esta aplicación para todos los usuarios que no sean root
en esta máquina.
Tu Gemfile no tiene fuentes de servidores de gemas. Si necesitas gemas que aún no están en
tu máquina, agrega una línea como esta a tu Gemfile:
source ‘https://rubygems.org
No se pudo encontrar la gema ‘mysql2’ en ninguna de las fuentes de gemas listadas en tu Gemfile.

¿Alguna sugerencia?

Lamentablemente, no sé nada sobre Ruby, Linux ni Gemfiles, así que literalmente voy avanzando paso a paso por las diversas tareas de configuración de Discourse CLI siguiendo las instrucciones de los tutoriales, copiando y pegando comandos mediante PuTTY, sin ningún tipo de comprensión.

Estoy ejecutando Ubuntu y Discourse en un Droplet de Digital Ocean, ¿eso ayuda?

Además, veo una referencia posterior a pegar comandos de exportación de base de datos en ‘shell’. ¿Para fines prácticos, mi conexión actual de PuTTY al servidor equivale a ‘shell’, o está involucrada alguna otra interfaz o consola?

OK, como respuesta parcial a mi propia pregunta, buscar a lo loco en foros sugiere que:

$ sudo apt-get install libmysqlclient-dev

permitirá luego instalar el gem mysql2 (sea lo que sea), ignorando la advertencia de no hacerlo como root.

Tras superar eso y pasar al siguiente paso, al escribir:

$ bundle exec rails db:drop

aparece otro error::::

bundler: failed to load command: rails (/usr/local/bin/rails)
Gem::Exception: can’t find executable rails for gem railties. railties is not currently included in the bundle, perhaps you meant to add it to your Gemfile?

Al revisar en /usr/local/bin/ veo que definitivamente hay un archivo llamado ‘rails’.

Escribir sudo gem, gem install rails o $ sudo gem install rails no ayuda (según varios consejos encontrados para este error).

Incluso volví atrás e instalé Ruby on Rails desde cero para asegurarme de que todas las dependencias normales estuvieran presentes How To Install Ruby on Rails with rbenv on Ubuntu 18.04 | DigitalOcean, pero sin ninguna mejora, ya sea con la versión 2.51 o 2.61.

Bueno, aquí ya me he quedado sin ideas…

Pues puedo afirmar categóricamente que seguir esta guía tal como está escrita NO funciona para nadie que siga los pasos oficiales para configurar el entorno de desarrollo local bajo una instalación de WSL2 con Ubuntu-18.04 en Windows 10; en casi cada paso habrá alguna dependencia faltante, un error de conexión rechazada o algo similar.

Con mucho esfuerzo y tras investigar en línea, he logrado llegar hasta el comando:

$ bundle exec ruby script/import_scripts/mybb.rb

pero esto genera la siguiente respuesta:

mysql2/client.rb:90:in `connect’: Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2) (Mysql2::Error::ConnectionError)

Esto ha sido un muro infranqueable; nada que he encontrado buscando en línea parece ofrecer una solución funcional.

¿Cómo puedo resolver esto y avanzar al siguiente paso? ¡Agradezco mucho cualquier ayuda!

1 me gusta

Hola, ¿cómo puedo subir la base de datos a mi droplet de DigitalOcean? Usé la instalación de un clic de DigitalOcean para instalar Discourse (Ubuntu).
En mi PC tengo Windows 10 Home, versión de compilación 18362.

Luego instalé MySQL, pero ahora no sé cómo “físicamente” subir la base de datos de MyBB al servidor. ¿No hay phpMyAdmin donde se pueda importar la base de datos fácilmente? :frowning:

1 me gusta

Debes subir el archivo usando scp o algo similar. Luego, algo como

  mysql -u usuario -p contraseña base_de_datos < archivo.sql
3 Me gusta

Estoy atascado :frowning:

1 me gusta

Esta guía debe actualizarse para ser compatible con la ejecución de la importación dentro de una instalación de Docker en lugar de utilizar una máquina de desarrollo local.

5 Me gusta

¡Realmente espero con ilusión la guía para ejecutarla en un entorno basado en Docker :slight_smile:

2 Me gusta

Al final renuncié al enfoque de bricolaje y contraté a un desarrollador, remitiéndole todas las excelentes sugerencias de este foro (¡que fueron de gran ayuda!). Creo que lo logró directamente en mi droplet de Digital Ocean en producción, en lugar de en un entorno de desarrollo separado (para que pudiera revisar fácilmente los avances mientras trabajaba; los usuarios no se vieron afectados, ya que el foro aún no estaba oficialmente en línea). En otras palabras, creo que es posible.

Tras varias iteraciones, los resultados son ahora bastante buenos: se resolvieron todos los problemas con el MyCode y los caracteres extraños, se tradujeron los prefijos de publicaciones de MyBB a etiquetas de Discourse y se importaron correctamente los campos personalizados de perfil de usuario con selección múltiple.

Si está dispuesto, le pediré que comparta cualquier ajuste realizado al script de importación estándar y otras técnicas utilizadas aquí.

4 Me gusta

Por si le sirve a alguien, el desarrollador @rahilqf con el que trabajé completó el proyecto, incluyendo la traducción de los campos personalizados de usuario de MyBB a los campos personalizados de usuario de Discourse (lo cual depende de tener instalado el plugin multi-select-user-field), la traducción de los prefijos de publicaciones de MyBB a etiquetas de Discourse, y la eliminación de casi todas las etiquetas MyBB redundantes del texto de las publicaciones de MyBB.

Su versión personalizada del script de importación se comparte aquí: Script de importación personalizado de MyBB a Discourse.

También logró integrar con éxito un archivo Mbox de Yahoo Groups, utilizando el script de importación estándar de Yahoo, aunque en este caso los archivos adjuntos no se tradujeron. En mi caso, eso no fue un problema mayor.

3 Me gusta

¡Estoy convirtiendo usuarios, publicaciones, temas, etc. desde la base de datos de MyBB!

He seguido esta guía: Install Discourse on Ubuntu or Debian for Development

pero http://localhost:3000/ o http://forum.omaggieconcorsi.com:3000/ no funcionan.

De todos modos, el programa está convirtiendo algo, pero no sé dónde puedo exportar los datos después.
No puedo ver Discourse con http://forum.omaggieconcorsi.com:3000/ ni con http://localhost:3000/, así que ¿cómo puedo al menos exportar la base de datos con publicaciones, usuarios, etc. desde el antiguo foro MyBB y luego importarla en una nueva instancia de Discourse?

¡Gracias!

¿Siguió esas instrucciones en el mismo equipo donde está ejecutando el navegador web?

1 me gusta

Sí, siempre el mismo ordenador

¡Bien, he seguido esta guía en Ubuntu 18.04 con un SO “real” instalado en el PC y localhost:3000 funciona!

Pero ahora tengo un problema con la base de datos MySQL :frowning: Lo siento…

Escribí:

debby@debby-MS-7721: mysql -u root
ERROR 1698 (28000): Acceso denegado para el usuario 'root'@'localhost'

:frowning:

EDITA: He añadido una contraseña al usuario root con ALTER USER 'root'@'localhost' IDENTIFIED BY 'MiNuevaClave';

Y en DB_PW he escrito la contraseña del usuario root.

… ¡y ahora está creando usuarios!!

¡Crucen los dedos por mí, es finalmente el momento correcto después de semanas de pruebas??

1 me gusta

Estoy intentando importar la base de datos desde MyBB a Discourse. Al igual que @Paul_King, no logro que funcione en mi servidor de DigitalOcean. Sigo recibiendo todo tipo de errores mientras sigo esta guía.

Estoy atascado al intentar ejecutar el comando:

$ bundle exec rails db:drop
bundler: comando no encontrado: rails
Instala los ejecutables de gemas faltantes con `bundle install`

bundle install dice que ha finalizado:

$ bundle install
Tu Gemfile lista la gema mysql2 (>= 0) más de una vez.
Probablemente deberías mantener solo una de ellas.
Aunque no es un problema ahora, podría causar errores si cambias la versión de alguna de ellas más adelante.
Usando bundler 1.16.1
Usando mysql2 0.4.10
¡Bundle completo! 2 dependencias de Gemfile, 2 gemas ahora instaladas.
Usa `bundle info [nombre_de_la_gema]` para ver dónde está instalada una gema agrupada.

Intentar instalar rails manualmente da como resultado esto:

$ gem install rails
Construyendo extensiones nativas. Esto podría tomar un tiempo...
ERROR: Error al instalar rails:
        ERROR: No se pudo construir la extensión nativa de la gema.

    directorio actual: /var/lib/gems/2.5.0/gems/racc-1.5.2/ext/racc/cparse
/usr/bin/ruby2.5 -r ./siteconf20210110-8155-1ms05r3.rb extconf.rb
mkmf.rb no puede encontrar los archivos de encabezado de ruby en /usr/lib/ruby/include/ruby.h

extconf falló, código de salida 1

Los archivos de la gema permanecerán instalados en /var/lib/gems/2.5.0/gems/racc-1.5.2 para su inspección.
Los resultados se registraron en /var/lib/gems/2.5.0/extensions/x86_64-linux/2.5.0/racc-1.5.2/gem_make.out

Esto es extremadamente frustrante.


Dejé este mensaje abierto y logré instalar rails. Luego tuve un millón de errores más y logré solucionarlos. Errores. En. Cada. Único. Paso.

Nunca antes había sentido tal puro odio hacia el software. ¿Por qué es Ruby así? Esto es una pesadilla. Ahora estoy atascado con este error:

$ bundle exec rails db:drop
Traceback (most recent call last):
        1: from /usr/local/bin/bundle:23:in `<main>'
/usr/local/bin/bundle:23:in `load': no se puede cargar el archivo -- /usr/share/rubygems-integration/all/gems/bundler-1.16.1/exe/bundle (LoadError)

¿Alguien puede ayudar?

1 me gusta

No ha sido útil, pero me encontré con los mismos muros de ladrillo, tanto al intentar configurar un entorno de desarrollo local (para generar un archivo de base de datos o copia de seguridad de Discourse) como directamente en mi Droplet de Digital Ocean. Finalmente, tras perder decenas de horas, decidí que la vida es demasiado corta y contraté a un desarrollador de Fiverr (que tardó semanas en resolverlo, pero lo logró). Sospecho que simplemente no hay incentivos para que nadie facilite el proceso. ¡Mucha suerte! Y espero que, si finalmente logras descifrarlo, dejes una pista de migas de pan aquí para que otros puedan seguirla.

1 me gusta

¿Cómo instalaste Rails? ¿Siguiste alguna de las guías de desarrollo? (como Guía para principiantes para instalar Discourse en Ubuntu para desarrollo)

Hay algunos documentos de cómo hacerlo para ejecutar el script de instalación dentro del contenedor de producción (lo que suelo hacer), por lo que podrías usar uno de ellos como guía.