Migrar un foro NodeBB con Redis a Discourse

Esta guía le mostrará cómo usar el NodeBB Importer para migrar un foro de NodeBB a la plataforma Discourse. Si su foro de NodeBB utiliza MongoDB como backend, siga esta guía. No se preocupe, es un proceso sencillo. Comencemos.

El plan

  • Preparar el entorno de desarrollo.
  • Exportar la base de datos desde el entorno de producción.
  • Importar la base de datos de producción a una instancia de Discourse.
  • Ejecutar el script del importador.

¿Qué datos se pueden migrar?

  • Grupos
  • Categorías
    • Categoría Raíz => Categoría Raíz
    • Subcategoría y Sub-subcategoría => Subcategoría
  • Adjuntos
  • Temas y Publicaciones
    • tema fijado => tema fijado
    • vistas de temas
    • todos los estilos se migrarán correctamente, incluyendo menciones, emojis y adjuntos.
  • Usuarios (con los siguientes atributos)
    • avatares (foto de perfil)
    • fondo de perfil
    • estado de prohibición
    • nombre
    • nombre de usuario
    • correo electrónico
    • biografía
    • administrador
    • sitio web
    • ubicación
    • estado de fecha de ingreso
    • grupo

Preparando el entorno de desarrollo local

Configure su entorno de desarrollo siguiendo una de estas guías:

A partir de ahora, me referiré a este entorno como servidor Discourse.

:bulb: Por favor, use esta guía si tiene problemas al configurar Discourse.

Exportar volcado de la base de datos de producción (desde el servidor NodeBB):

Apague su foro. Esto es recomendado por NodeBB.

$ cd /ruta_al_nodebb
$ ./nodebb stop

También debe detener Redis:

$ sudo service redis-server stop
$ sudo service redis-server status
# redis-server no está en ejecución

Su base de datos del foro está contenida en un solo archivo. Este archivo se genera automáticamente periódicamente por Redis. Por lo general, este archivo se encuentra en /var/lib/redis/dump.rdb. Además, puede obtener la ruta desde la CLI de Redis:

$ redis-cli
127.0.0.1:6379> config get dir
# "/var/lib/redis"
127.0.0.1:6379> exit
$ ls -la /var/lib/redis
# -rw-rw-r-- 1 redis redis 2664346 4 ago 16:24 dump.rdb

:bulb: Si su servidor Redis requiere contraseña, use AUTH SU_CONTRASEÑA.

:bulb: Si por alguna razón no encuentra su archivo de base de datos en la ruta esperada, puede generarlo manualmente ejecutando SAVE dentro de la CLI de Redis.

Ahora necesita copiar los adjuntos del foro:

$ cd /ruta_a_la_carpeta_raiz_nodebb/
$ tar -czf ./uploads.tar.gz ./public/uploads

Ahora que tiene su base de datos y los activos del foro, debe copiarlos al servidor Discourse.

Importar la base de datos

Si siguió las instrucciones para instalar Discourse, debería tener el servidor Redis instalado en el servidor Discourse:

$ redis-server -v
# Redis server v=5.0.2...

Ahora necesita detener el servidor Redis (importante).

Basado en Linux:

$ sudo service redis-server stop
$ sudo service redis-server status
# redis-server no está en ejecución

Mac OS:

$ brew services stop redis
$ brew services list
# redis detenido

Lo que debe hacer ahora es copiar la base de datos del foro a la ruta local de la base de datos de Redis. El importador necesita conectarse al servidor Redis y migrar la base de datos de NodeBB a la base de datos de Discourse. Este paso asume que no tiene nada importante en su base de datos de Redis; de lo contrario, debería realizar una copia de seguridad.

$ redis-cli
127.0.0.1:6379> config get dir
# "/var/lib/redis"

Verifique si hay archivos y tome nota del usuario actual y los permisos de dump.rdb:

$ ls -la /var/lib/redis

Copie la base de datos de NodeBB (sobrescriba si ya existe una):

$ cp dump.rdb /var/lib/redis

Más tarde, al intentar conectarse al servidor Redis, podría obtener Fatal error loading the DB: Permission denied, por lo tanto, debe alterar los permisos de dump.rdb:

# Reemplace el usuario con el mismo que tomó nota anteriormente.
$ sudo chown redis:redis /var/lib/redis/dump.rdb
$ sudo chmod 660 /var/lib/redis/dump.rdb

Ahora necesita descomprimir uploads.tar.gz en cualquier ruta de su elección:

$ tar xvzf uploads.tar.gz

Ejecutar el script del importador

Ahora que nuestra base de datos está en su lugar, estamos listos para ejecutar nuestro script de importación. Antes de eso, necesitamos editar algo de configuración. Probablemente solo necesite cambiar las siguientes dos líneas.

Esta es la ruta de su carpeta de uploads de NodeBB:

ATTACHMENT_DIR = '/ruta_absoluta/uploads'

Este es el nombre de la base de datos en Redis. El valor predeterminado es 0:

db: 0

Ejecute el importador con Discourse limpio:

$ cd ~/discourse
$ bundle exec rake db:drop db:create db:migrate
$ bundle exec ruby script/import_scripts/nodebb/nodebb.rb

El importador se conectará al servidor Redis y migrará todo a la base de datos PostgreSQL de Discourse.

Después de que el importador termine, inicie la plataforma Discourse:

$ bundle exec rails server

Inicie Sidekiq para procesar los datos migrados:

$ bundle exec sidekiq

Puede monitorear el progreso en http://localhost:3000/sidekiq/queues.

Realice una copia de seguridad de Discourse y súbala a su servidor de producción de Discourse siguiendo esta guía.

Con esto, debería haber realizado con éxito una migración completa de NodeBB a Discourse :tada:
Por favor, si tiene alguna pregunta, estaré encantado de ayudar :slight_smile:

9 Me gusta

No dejo de insistir sobre mi migración en diferentes hilos :smiley:

Tengo un foro en NodeBB con Redis y he podido completar el proceso sin errores en la versión de desarrollo, pero todavía tengo algunas preguntas:

  • En el script de migración puse correctamente la ruta absoluta donde tenía las imágenes y los archivos del foro. Cuando terminé la migración veo que las imágenes no son visibles en los hilos. En Discourse aparecen enlazadas en la URL: assets/uploads, pero no hay nada ahí.

    En la versión de desarrollo he solucionado esto creando un enlace simbólico:
    ln -s path/to/images public/assets

    Pero en la versión de producción, ¿qué tengo que hacer para crear un enlace desde assets/upload dentro del docker a la carpeta donde puse las imágenes antiguas?

  • Parece que todos los hilos del foro se han migrado correctamente, pero no veo los mensajes directos entre usuarios… ¿no están en la migración?

  • El script no ha detectado ningún avatar de usuario.

  • Y por último, en el nuevo foro no veo ninguna incrustación de vídeos de Youtube o Twitts. ¿Tengo que instalar un plugin para eso?

Muchas gracias por tu ayuda.

Esto no debería ser necesario. Si tienes tus imágenes originales en una ruta, configurada en ATTACHMENT_DIR, Discourse creará una carga (esencialmente, una copia del archivo) en ruta-a-tu-instalación/discourse/public/uploads/default/. Si revisas la tabla Uploads debería verse así:

[1] pry(main)> Upload.last
  Upload Load (1.5ms)  SELECT "uploads".* FROM "uploads" ORDER BY "uploads"."id" DESC LIMIT 1
=> #<Upload:0x0000000109a460a0
 id: 196,
 user_id: 251468,
 original_filename: "Screenshot 2023-11-17 at 11.52.39.png",
 filesize: 25174,
 width: 398,
 height: 248,
 url: "/uploads/default/original/1X/2e5f7a09ba3bcd3a3597285771c53c16f20b18dd.png",
 created_at: Fri, 17 Nov 2023 19:12:47.455954000 UTC +00:00,
 updated_at: Fri, 17 Nov 2023 19:12:47.484137000 UTC +00:00,
 sha1: "2e5f7a09ba3bcd3a3597285771c53c16f20b18dd",

Correcto, parece que el script de nodebb no migra los mensajes privados. Puedes revisar otros scripts para ver cómo se importan los mensajes privados, revisa el de Vanilla por ejemplo.

Los avatares probablemente no se están subiendo correctamente, probablemente por el mismo problema que mencionaste anteriormente.

No necesitas un plugin. Probablemente necesites volver a hornear tus publicaciones. Puedes esperar a que sidekiq lo haga automáticamente, o puedes ejecutar un horneado completo desde la consola:

rake posts:rebake

El script de nodebb no se ha actualizado en unos años, así que supongo que algunas partes están desactualizadas y necesitan ser modificadas para que funcione con tus datos. ¡Espero que esto ayude!

1 me gusta