Migrar un foro XenForo a Discourse

En el foro que transferí, una vez se instaló xengallery, por lo que tuve que cambiar lo siguiente, ya que la tabla xfgallery ya no existía.

  def get_xf_sql(type, id)
    case type
    when :gallery
      return "SELECT NULL WHERE 1=0;"
    when :attachment
      <<-SQL
        SELECT a.attachment_id, a.data_id, d.filename, d.file_hash, d.user_id
        FROM #{TABLE_PREFIX}attachment AS a
        INNER JOIN #{TABLE_PREFIX}attachment_data d ON a.data_id = d.data_id
        WHERE attachment_id = #{id}
        AND content_type = 'post'
      SQL
    end
  end
1 me gusta

Puedes intentar ejecutar el script de nuevo y ver si termina.

¿Tu sistema está en una sola partición?

El paso de instalación de mysql-server ahora está obsoleto. Necesita instalar mariadb-server.

sudo apt-get install mariadb-server mariadb-client libmariadb-dev-compat libmariadb-dev

Pude seguir el resto de los pasos e importar la base de datos XF, por lo que alguien debería actualizar la guía.

Ahora estoy atascado en el siguiente paso y necesito ayuda.

echo "gem 'mysql2'" >> Gemfile
bundle install --no-deployment

Ejecutar lo anterior me da el siguiente error. Revisé el Gemfile y solo contiene esta línea: gem ‘mysql2’

Este Gemfile no incluye una fuente global explícita.
No usar una fuente global explícita puede resultar en que se genere un lockfile diferente dependiendo de las gemas que hayas instalado localmente antes de ejecutar bundler.
En su lugar, define una fuente global en tu Gemfile de esta manera: source "https://rubygems.org".
No se pudo encontrar la gema 'mysql2' en las gemas instaladas localmente.
root@ip-172-566-459-13-app:/#

Ok, así que logré pasar al siguiente paso. Alguien arriba publicó que necesitamos estar en la carpeta /var/www/discourse en el contenedor y luego agregar el gem.

Ahora, en el paso final

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

Estoy recibiendo este error. ¿Qué podría estar haciendo mal?

`/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:63:in “rescue in new_client”: No pudimos encontrar tu base de datos: discourse.
Las configuraciones de base de datos disponibles se pueden encontrar en config/database.yml. (ActiveRecord::NoDatabaseError) Para resolver este error:

  • ¿No creaste la base de datos o la eliminaste? Para crear la base de datos, ejecuta:
    bin/rails db:create
  • ¿Ha cambiado el nombre de la base de datos? Verifica que config/database.yml contenga el nombre de base de datos correcto.`

Lo resolví: Estaba ejecutando como usuario root, tuve que cambiar al usuario ‘discourse’. La importación ha comenzado.

4 Me gusta

Recogí un servidor razonablemente bueno con 4 CPU y 16 GB de RAM. A la velocidad a la que se están migrando las publicaciones, me llevará 9 días solo para migrar las publicaciones. Los usuarios tardaron 2,5 horas en migrarse. Es seguro decir que esto no me servirá tal como está, pero al menos puedo pasar algunos meses familiarizándome hasta que encuentre una solución para esta migración masiva.

PD:
En el script de migración, veo que los correos electrónicos duplicados no se importan. ¿Cuáles son las diferentes formas en que se determina un duplicado? Noté que xyz@gmail.com se trata igual que xyz+1@gmail.com y xy.z@gmail.com

¿Hay algún otro patrón también?

He intentado hacer migraciones en VPS con especificaciones similares a mi ordenador personal, pero por alguna razón siempre fue mucho, mucho más lento que usar mi ordenador.

Hoy en día, siempre hago mis migraciones localmente. ¿Cuántas publicaciones tienes?

1 me gusta

2.5 millones de publicaciones.
Intentaré la migración local en una Mac M1 para comparar.

1 me gusta

Eso es prácticamente todo. La comprobación de unicidad se realiza en la versión normalizada y en minúsculas de la dirección de correo electrónico proporcionada.

Normalizamos eliminando todos los puntos e ignorando todo lo que sigue a + en el nombre de usuario.

3 Me gusta

La velocidad de una sola CPU es el factor importante.

En mis máquinas, una tasa de 800-1000 usuarios o publicaciones/minuto es bastante típica.

Tenga en cuenta que cuando realice la importación final, solo importará los usuarios y las publicaciones que aún no se hayan importado, por lo que no llevará mucho tiempo.

Desactive la configuración del sitio Normalizar correos electrónicos (desactivado era el valor predeterminado hasta hace poco). Probablemente debería desactivarse en esta función aquí:

Puede ponerlo en su versión personalizada del script de xenforo con SiteSetting.normalize_emails=false. No estoy seguro de qué sucedió con esos usuarios de correo electrónico duplicados; hay dos cosas obvias que hacer: darles una dirección de correo electrónico falsa o omitir su importación. ¿Parece que les da unas falsas? (Y existe una probabilidad bastante buena de que, de hecho, sean usuarios falsos de todos modos). Si los omitió, ejecutar el script nuevamente los importará.

3 Me gusta

Sí, en mi portátil, está procesando las cosas mucho más rápido a 1000 elementos por minuto. Eso es aproximadamente 2 veces más rápido que en el servidor. Aun así, eso son unos 3 días.

Revisé los correos electrónicos omitidos y parece que está haciendo un buen trabajo ignorando esas cuentas. Simplemente las fusionaré antes de la importación final. Apenas 20 casos de este tipo.

Ten en cuenta que cuando hagas la importación final, solo importará los usuarios y las publicaciones que aún no se hayan importado, por lo que no llevará mucho tiempo.

Gracias por señalar esto. Lo observé yo mismo y parece que esto es lo que salvará el día cuando haga la importación final. Entonces, ¿hago una copia de seguridad y la restauro en D-3 y luego otra copia de seguridad y la restauro con el nuevo archivo de copia de seguridad de la base de datos en el Día 0? ¿Es correcto?

1 me gusta

¿Esas copias de seguridad y restauraciones son en el sitio de Xenforo, o tienes algún sitio de Discourse en vivo al que vas a importar los datos de Xenforo?

Mientras no realices cambios en el script que requieran volver a importar datos, y lo que tengas ahora en tu portátil sea lo que quieres en tu servidor de Discourse, entonces puedes seguir obteniendo nuevas volcados de la base de datos de Xenforo y importándolos (para probar, ver cuánto tiempo lleva, etc.) y luego, el día del cambio, congelas el sitio de Xenforo, obtienes esa base de datos, ejecutas el script una vez más y lo subes a tu servidor de Discourse.

Si ya tienes datos en tu sitio de Discourse que quieres conservar, las cosas son mucho más complicadas ya que necesitarás congelar ese sitio, luego obtener los datos de Xenforo y luego proceder como se describe arriba.

1 me gusta

Será una instalación limpia de Discourse, lo que lo hace sencillo.

Tengo bastante tiempo libre, ya que quiero probar las migraciones varias veces, familiarizarme a fondo con Discourse, configurar todos los complementos como quiero y quizás también ensuciarme las manos con la personalización de algunos complementos.

Lo que has explicado me quita un gran peso de encima, ya que pensaba que también tendría que averiguar las importaciones masivas.

2 Me gusta

He vuelto con una consulta, ¿el script de importación genera algún registro? Mi importación de prueba está atascada en el 98,2 % desde hace unas horas.

Otra cosa que me di cuenta es que, si reinicio la migración, tarda unos 30 segundos en omitir un lote de 1000 publicaciones. Por lo tanto, la velocidad efectiva es ahora de 2000 elementos por minuto. No es una mejora significativa con respecto a las 1000 publicaciones por minuto de la primera importación, ya que incluso en la última importación el día del corte, llevará aproximadamente un día. 23 horas de las cuales solo se omitirán elementos ya importados.

Solo lo que ves.

Probablemente deberías detenerla y volver a iniciarla.

Sí, omitirá todos los datos que ya se hayan importado. Y lo hace mucho más rápido que 2000 publicaciones/minuto. Sospecho que lo verás cuando la reinicies ahora.

Eso es, reinicié y luego hice la publicación anterior. Son 2000 publicaciones/minuto. Para estar seguro, lo intenté de nuevo.

1 me gusta

Así que logré importar los avatares y los archivos adjuntos. Copié estas carpetas.

/internal_data/attachments
/data/avatars

Para responder a mi pregunta, los avatares y los archivos adjuntos se finalizan una vez importados. Si un usuario cambia su avatar después de que se importe su ID, no se importará/actualizará porque esa publicación o usuario se omitirá en la segunda ejecución.

Ahora solo necesito averiguar la importación de conversaciones (también se puede omitir, pero es bueno tenerla) y las redirecciones permanentes.

@Fajfi - Gracias por tu contribución al script de importación. Funcionó a la perfección para los avatares y los archivos adjuntos. Todavía se está ejecutando y aún no he llegado a la parte de “likes”.

Se ha corregido la importación de conversaciones. Se pudieron importar más de medio millón de mensajes de XF2.3 a Discourse. Se ha enviado una PR en caso de que alguien esté interesado.

----EDIT----

Se ha enviado otra PR con una corrección para la importación de “likes”. Es sorprendente que nadie haya migrado de XF2.1+ a Discourse hasta ahora. Los “likes” fueron renombrados a “reactions” en 2019 cuando se lanzó XF2.1.

5 Me gusta