(Reemplazado) Cómo migrar / importar de SMF2 a Discourse

:mega: Este documento ha sido reemplazado por esta otra guía de SMF2: Migrate an SMF2 forum to Discourse

Realmente quería migrar nuestro querido foro SMF2 a Discourse. Tenemos más de 1000 miembros y aproximadamente 20k publicaciones en alrededor de 2k temas.
En SMF2, no utilizábamos encuestas ni archivos adjuntos; de hecho, ni siquiera todos tenían un avatar. Algunas publicaciones dependían en gran medida de BBCode “avanzado”, sin embargo.

Así es como lo logramos.

Requisitos previos

Simplemente instala Discourse de la manera habitual.
Añadí el plugin Discourse BBCode para manejar listas, tamaños, colores, etc., de forma predeterminada.

Si no puedes abrir una conexión remota a tu base de datos MySQL de SMF2, tendrás que importar tus datos desde un volcado a un contenedor Docker temporal.

Si tu base de datos acepta conexiones remotas o se ejecuta en el mismo host, puedes saltarte este paso.

Un contenedor MySQL temporal de Docker

Volca tu base de datos:

cd /tmp/
mysqldump –u[usuario] –p[contraseña] [nombre_base_datos] > sqldump.sql

Crea el contenedor MySQL temporal de Docker:

cd /tmp/
docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -v "$PWD":/backup --name=mysql mysql

Luego, entra en él:

docker exec -it mysql bash

Importa el volcado de tu base de datos:

mysql -uuser -ppass db < /backup/sqldump.sql

Si obtienes el siguiente error:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

Simplemente espera un minuto para que el contenedor se inicie completamente.

Para la compatibilidad de la base de datos, tuve que cambiar el plugin de autenticación de nuestra base de datos temporal, pero supongo que tu experiencia puede variar:

mysql -uuser -ppass db

Usa esta consulta:

ALTER USER user
IDENTIFIED WITH mysql_native_password
BY 'pass';

Luego, cierra sesión y verifica la dirección IP de tu instancia de MySQL:

exit
docker inspect mysql | grep IPAddress

Ahora tienes una copia funcional de tu base de datos SMF2.

Un contenedor de importación de Discourse temporal

Creemos un nuevo contenedor llamado “import”, basado en el contenedor predeterminado app.yml:

cd /var/discourse
cp containers/app.yml containers/import.yml

nano containers/import.yml

Añade la plantilla mysql-dep a tu nuevo contenedor de importación:

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Descomenta estas dos líneas si deseas añadir Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"
  - "templates/import/mysql-dep.template.yml"

Luego, simplemente:

/var/discourse/launcher stop app
/var/discourse/launcher rebuild import

Importación en Discourse

Una vez que se reconstruye el contenedor de importación, debemos entrar en él para nuestra última modificación:

/var/discourse/launcher enter import
cd /var/www/discourse/ # el script debe ejecutarse desde ese directorio exacto, pero deberías haber llegado allí de todos modos
su discourse -c "bundle exec ruby script/import_scripts/smf2.rb -h 172.17.0.3 -u user -p pass -d db -f smf_ -t Europe/Paris"
  • -h: nombre de host de tu base de datos MySQL de SMF2 (aquí, la IP de un contenedor Docker);
  • -u: usuario de MySQL de SMF2;
  • -p: contraseña de MySQL de SMF2;
  • -d: base de datos MySQL de SMF2;
  • -f: prefijo de tablas de SMF2;
  • -t: zona horaria de SMF2.

Limpieza

Si lo creaste, detén y elimina el contenedor MySQL temporal de Docker:

docker stop mysql
docker rmi mysql

Detén el contenedor “import” de Discourse y usa el lanzador para limpiar:

/var/discourse/launcher destroy import
/var/discourse/launcher cleanup

Realmente logré destruir mi contenedor principal :slight_smile: No importa:

/var/discourse/launcher rebuild app

Configuración de Discourse después de la importación

Algunas configuraciones predeterminadas pueden causar problemas con las publicaciones importadas y los permisos. Cambia estas según tus necesidades desde el panel de configuración de Discourse:

  • longitud mínima del título del tema: Lo cambié a 3; los temas cuyo título era demasiado corto resultaron muy difíciles de trabajar (no se podían mover, etc.);
  • embellecer título: Tuve que desactivarlo; los temas cuyo título no comenzaba con una letra mayúscula resultaron muy difíciles de trabajar (no se podían mover, etc.).

Bibliografía

10 Me gusta

Thanks for providing this. Maybe @marcozambi can use this for the guide he was planning to write after his successful import (including attachments)?

See here:

Also can anybody from the Discourse team let us know what happened to the old topic that was a guide for SMF2 imports? I can no longer find it via search.

1 me gusta

Still determined to contribute, as soon as all the details will be in place. I’m taking notes of everything and I’ll write someting asap

1 me gusta

poke @codinghorror @sam @HAWK

I think we can combine what @_vincent has compiled here, what was in the “missing” topic, and a few notes from @marcozambi’s migration to make a pretty comprehensive guide for migrating SMF2 to Discourse.

I have undeleted it here: https://meta.discourse.org/t/importer-for-simple-machines-2-forums/17656

I am assuming it was deleted because it contained info that is no longer up to date so grab what you need from it and we’ll remove it again to avoid future confusion.

1 me gusta

Thanks! For the most part it was up-to-date. I did a migration with it a couple months ago and I would have been lost as f*$# without it.

I think the guide isn’t the problem, so much as the importer itself could use a little attention in a few areas. Also, if possible, we should change some of the MySQL settings in the Discourse docker container when it gets created to prevent connection timeouts. That would probably take care of everything IMO.

1 me gusta

Ok, it’s out. SMF2 to Discourse - The Ultimate Guide
I hope the Guide is readable enough, as I am not a native english speaker. It goes without saying that any constructive feedback is more than welcome.

3 Me gusta

Hello guys,

Let me start that you did a wonderful job with [SMF2 to Discourse - The Ultimate Guide] and this migration tool.

I could migrate a huge SMF instante (61k members, 400k posts, 350k, topics).
I did a dry run and everything worked as it should.

My question is: will this script override Discourse specific settings like the ones in /admin/site_settings/ ? - I’m asking this as I want to make a final migration of the content that came up in the meantime on the SMF site, but I would not want to overwrite the settings already configured in /admin/site_settings/.

Thank you

1 me gusta

No it should not override any of the site settings.

1 me gusta

Thank you so much.

I don’t have the expertise to “read” the script and what exactly it is copying over. I was hoping the same

Gracias por la guía.

Me he quedado atascado justo después de lo que dices:

Por compatibilidad con la base de datos, tuve que cambiar el plugin de autenticación temporal de nuestra base de datos, pero supongo que tu experiencia puede variar:

Recibo el siguiente error:

Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory (Mysql2::Error::ConnectionError)

Me pregunto si podrías darme una pista sobre cómo solucionarlo. Presumiblemente, esto está relacionado con el cambio del ‘plugin de autenticación de la base de datos’. Si es así, ¿cómo lo hago?

¡Gracias!

Después, intenté importar la base de datos en un servidor MySQL independiente fuera de Docker, etc. Está ejecutándose en localhost.

Ahora, al ejecutar el script, obtengo este error en el mismo punto que antes:

from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in initialize' /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in connect’: No se puede conectar al servidor MySQL local a través del socket ‘/var/run/mysqld/mysqld.sock’ (2) (Mysql2::Error::ConnectionError)

He intentado esperar un tiempo y volver a ejecutarlo, tal como se indica en la guía, pero desafortunadamente siempre ocurre el mismo resultado. ¿Alguien puede ayudarme, por favor?

Gracias

Aquí tienes una captura de pantalla https://drive.google.com/file/d/1z8TLY4zBr0KzrL9aJDQTG4NKG5Dhbg11/view?usp=drivesdk