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

Hi - this looks like a great guide, except as a Cpanel rather than linux user, migrating from a shared host, I don’t have root access or ssh access to the original host, but I do have access to PhPMyAdmin in Cpanel from which I can export the Mybb database.
Will this do?
What if any special export settings are required? And into what directory on my Digital Ocean droplet should this database be copied? (I am using FileZilla)

Yes.

It does not matter, home directory works just fine.

3 Me gusta

Hi again - I can get up to this point in the tutorial

bundle install

and for me this falls over with error

'Don’t run Bundler as root. Bundler can ask for sudo if it is needed, and
installing your bundle as root will break this application for all non-root
users on this machine.
Your Gemfile has no gem server sources. If you need gems that are not already on
your machine, add a line like this to your Gemfile:
source ‘https://rubygems.org
Could not find gem ‘mysql2’ in any of the gem sources listed in your Gemfile.

Any suggestions?

Unfortunately I know nothing about ruby or linux or gemfiles and so am just literally plodding though various discourse cli setup tasks as the tutorials instruct by cutting and pasting commands via PuTTy, without any kind of understanding.

I am running Ubuntu and Discourse in a Digital Oceans Droplet, if that helps?

Also, I see a subsequent reference to pasting database export commands into ‘shell’ . For practical purposes is my current PuTTy connection to the server = ‘shell’, or is some other interface/console involved?

OK, in partial answer to my own question, random thrashing around on forums suggests

$ sudo apt-get install libmysqlclient-dev

will then allow mysql2 gem to install (whatever that is) - ignoring the warning about not doing this as root.

Getting past that and to the next step - typing

$ bundle exec rails db:drop

gives another 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?

Checking in /usr/local/bin/ and I can see a file named ‘rails’ is definitely there.

Typing $ sudo gem or $ gem install rails or $ sudo gem install rails does not help (per various suggestions stumbled across for this error).

Have even gone back and installed Ruby on Rails from scratch to try and ensure all normal dependencies are present How To Install Ruby on Rails with rbenv on Ubuntu 18.04 | DigitalOcean -and no improvement - whether I use version 2.51 or 2.61.

Well out of my depth here…

Well I can say categorically that following this guide as written does NOT work for anyone following the official steps for setting up local Dev environment under WSL2 installation of Ubuntu-18.04 under Windows 10 - at almost every step there will be some dependency missing or connection refused error or similar.

With a lot of pain and online research, I have managed to get up to the command:

$ bundle exec ruby script/import_scripts/mybb.rb

but this generates response:

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

This has been a brick wall - nothing I have found by searching online seems to offers a working solution to this

How do I solve this and progress to the next step? Any help much appreciated!

1 me gusta

Hi, how can I upload database on my DigitalOcean droplet? I used installation 1click of DigitalOcean to install Discourse (Ubuntu).
On my PC I have Windows 10 Home 18362 build version.

Then I have installed Mysql but now I don’t know how “physically” upload Mybb database on the server. Isn’t there phpmyadmin where you can easily import the database? :frowning:

1 me gusta

You need to upload the file using scp or similar. Then Something like

  mysql - u user - p password database < filename..sql
3 Me gusta

I’m stuck :frowning:

1 me gusta

This guide should be updated to be compatible with running the import inside a Docker install instead of using a local development machine.

5 Me gusta

Really looking forward for the guide to run on a docker based environment :slight_smile:

2 Me gusta

I gave up on DIY in the end and got a developer on the job - referring him to all the great suggestions on this forum (which helped!) - and I believe he achieved this directly on my live Digital Ocean droplet rather than in a separate development environment (so I could review things easily as he worked - users were not impacted as forum not officially live yet.) - in other words I think it is possible.

After a few iterations, results are now pretty good - all the MyCode and strange character issues resolved, translated my MyBB post prefixes as Discourse tags, custom multi-select user profile fields imported successfully.

If he is willing, I will ask him to share any tweaks to standard import script, and other techniques used here.

4 Me gusta

In case it helps anyone, the developer @rahilqf I engaged completed the project including translation of custom MyBB user fields into Discourse custom user fields (which depends on having the multi-select-user-field plugin installed), MyBB post prefixes translated into Discourse tags, and stripping out of nearly all redundant MyCode tags from MyBB post text.

His customized import script version is shared here - Custom MyBB to Discourse Import Script.

He also successfully merged in a Yahoo Groups Mbox archive, using the standard Yahoo import script - though with this attachments seemed not to translate. In my case that was not a major problem.

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.