Migrar un foro de FluxBB a Discourse

He creado un script de migración para importar una base de datos de FluxBB a Discourse. Ahora explicaré cómo realizar el proceso de importación en un tutorial paso a paso.

He probado este script de migración con FluxBB v1.5.10 (que es la versión actual).

¿Qué datos se pueden importar?

  • Usuarios (incluyendo biografías y firmas)
  • Grupos
  • Categorías
    :warning: Los permisos no se importarán y todas las categorías serán públicas. Los permisos adecuados deben configurarse manualmente después de la importación.
  • Temas (incluyendo el estado de fijos/anclados)
  • Publicaciones
  • Usuarios suspendidos

Antes de iniciar la migración, configura un entorno de desarrollo en tu máquina (o dentro de una máquina virtual). Consulta la guía de instalación para desarrollo en macOS o Ubuntu.

Discourse requiere Ruby 3.4 o superior. Para verificar tu versión de Ruby, ejecuta el siguiente comando:

ruby -v

MySQL

Ahora necesitamos la gema mysql2 para Ruby para conectarnos a nuestra antigua base de datos de FluxBB. Ejecuta los siguientes comandos para instalar la dependencia libmysqlclient-dev y la gema mysql2.

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libmysqlclient-dev
gem install mysql2

(Opcional) Importar volcado MySQL en localhost

Para instalar el cliente de MySQL e importar un archivo de volcado MySQL (.sql) en tu máquina de desarrollo, sigue las instrucciones a continuación:

sudo apt-get install mysql-server mysql-client

Crea el usuario de MySQL, los privilegios y la tabla:

mysql -u root -p mysql
mysql> CREATE USER 'fluxbb'@'localhost' IDENTIFIED BY 'fluxbb';
Query OK, 0 rows affected (0.00 sec)
.
mysql> CREATE DATABASE fluxbb;
Query OK, 1 row affected (0.01 sec)
.
mysql> GRANT ALL PRIVILEGES ON fluxbb.* TO 'fluxbb'@'localhost';
Query OK, 0 rows affected (0.00 sec)
.
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
.
mysql> exit

Importa el archivo de volcado de tu base de datos de FluxBB:

mysql -u fluxbb -p fluxbb < myfluxbb.sql

De BBCode a Markdown

El script de importación maneja la conversión de BBCode a Markdown automáticamente. No se necesitan gemas adicionales para esto.


Después de instalar mysql2, ve a la ruta de instalación de Discourse y abre Gemfile para editarlo.

cd ~/discourse
sudo nano Gemfile

Ahora inserta la siguiente línea al final del archivo para agregar la gema mysql2 a Discourse.

gem 'mysql2'

Antes de ejecutar el script de importación, pega estas líneas una por una en tu terminal (usa las flechas del teclado para editar los valores):

export FLUXBB_HOST="localhost"
export FLUXBB_DB="fluxbb"
export FLUXBB_USER="root"
export FLUXBB_PW=""
export FLUXBB_PREFIX=""

Ahora es el momento de ejecutar el script de importación. Ejecuta el siguiente comando para iniciar la migración:

RAILS_ENV=production bundle exec ruby script/import_scripts/fluxbb.rb

Espera hasta que la importación haya finalizado. Puedes reiniciarlo si se vuelve extremadamente lento.

¡Después de todo, felicidades! Tu base de datos se ha migrado correctamente de FluxBB a Discourse :thumbsup:

Inicia tu instancia de Discourse:

bundle exec rails server

Inicia Sidekiq y deja que haga su trabajo:

bundle exec sidekiq -q critical,4 -q default,2 -q low

Dependiendo del tamaño de tu foro, esto puede tardar un tiempo. Puedes monitorear el progreso en http://localhost:3000/sidekiq.

Ahora realiza una copia de seguridad desde la página de administración /admin/backups e impórtala en tu sitio web de Discourse en vivo.

12 Me gusta
discourse@app-deb10-app:/var/www/discourse$ FLUXBB_HOST="localhost" FLUXBB_DB="flux" FLUXBB_USER="fluxbb" FLUXBB_PW="fluxbb" RAILS_ENV=production bundle exec ruby script/import_scripts/fluxbb.rb 
Cargando grupos existentes...
Cargando usuarios existentes...
Cargando categorías existentes...
Cargando publicaciones existentes...
Cargando temas existentes...

creando grupos
Traceback (most recent call last):
	9: from script/import_scripts/fluxbb.rb:262:in `<main>'
	8: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
	7: from script/import_scripts/fluxbb.rb:40:in `execute'
	6: from script/import_scripts/fluxbb.rb:50:in `import_groups'
	5: from script/import_scripts/fluxbb.rb:258:in `mysql_query'
	4: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-2.3.2/lib/patches/db/mysql2/alias_method.rb:22:in `query'
	3: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:130:in `query'
	2: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:130:in `handle_interrupt'
	1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:131:in `block in query'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:131:in `_query': La tabla 'flux.groups' no existe (Mysql2::Error)

Parece que las tablas no existen en la base de datos de MySQL. Te sugiero verificarlo iniciando sesión primero en la base de datos de MySQL y revisando qué tablas hay. Es posible que necesites modificar el script para que funcione.

2 Me gusta

Aquí, paso a paso.

¿Está roto este importador en las versiones modernas de Discourse?

Estoy ejecutando una instancia de Discourse instalada usando el discourse/docs/INSTALL.md at main · discourse/discourse · GitHub (también conocido como “Las únicas instalaciones de Discourse admitidas oficialmente”).

Configuré una base de datos MariaDB dentro del contenedor Docker, importé mi volcado del foro allí, etc., porque cualquier otro enfoque es muy difícil de configurar. Todo lo que hice fue dentro del shell cd /var/discourse/ &amp;&amp; ./launcher enter app.

Ejecutar bundle exec ruby script/import_scripts/fluxbb.rb bbcode-to-md falla con:

/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.4.3/lib/active_record/connection_adapters/postgresql_adapter.rb:81:in `rescue in new_client
': No pudimos encontrar tu base de datos: discourse. La cual se puede encontrar en el archivo de configuración de la base de datos ubicado en config/database.yml. (ActiveRecord::NoDatabaseError)

Ejecutar sudo -u postgres psql discourse en el mismo shell me conecta a la base de datos “discourse” sin problemas.

Disculpa la suposición negativa, fue simple:

El script debe ejecutarse con el usuario discourse, no como root en el contenedor, que es lo que hice.

Aparte de que algunos códigos BB no se han convertido, esto parece haber funcionado bien. ¡Gracias!

Tests, fixes, and a small (optional) feature to allow a FluxBB config to work by harry-wood · Pull Request #6 · nlalonde/ruby-bbcode-to-md · GitHub parece ser una buena PR con correcciones a la conversión de códigos BB.

Advertencia importante:

Este importador ignora los permisos.

Todos tus foros se publicarán como públicos.

Si tenías foros configurados para que solo los moderadores pudieran leerlos, cualquiera podrá leerlos después de usar este importador.

1 me gusta

Puedes modificar los permisos de las categorías manualmente después de la importación. Probablemente no sea un trabajo muy grande arreglarlos manualmente.

Añadir soporte para importar los permisos es probablemente un trabajo mayor que hacerlo manualmente.

1 me gusta

Gracias por informar de esto, he añadido una advertencia al respecto en la guía.

2 Me gusta