Migrar un foro XenForo a Discourse

Solo 5 mil publicaciones y alrededor de 1 mil miembros

3 Me gusta

Todavía estoy esperando al importador del tablero principal para intentar y probar mi publicación de 18 metros en el foro.

3 Me gusta

¿Para Xenforo? Sí, tenemos otras importaciones masivas, pero es cierto que esto sería muy lento para 18 millones de publicaciones.

4 Me gusta

Estamos trabajando en nuestro propio importador masivo interno para 27 millones de publicaciones. El proceso pasó de poco más de una semana (sin contar los archivos adjuntos) a menos de un día con todo incluido. Ayer completamos nuestra primera prueba de importación sin ningún error. ¡Cosas realmente emocionantes!

4 Me gusta

Gracias, Justin. He echado un vistazo rápido; ¿te parece bien esto? (Si quieres, siéntete libre de añadirlo al importador oficial)

  XENFORO_DB = "xenforo_db_3"
  TABLE_PREFIX = "xf_"
  BATCH_SIZE = 1000
  ATTACHMENT_DIR = '/FULL/PATH/TO/attachments'
  AVATAR_DIR = '/FULL/PATH/TO/avatars'

(Añadí la última línea^^ - significa que tendrás que copiar los avatares allí)

  def execute
    import_users
    import_categories
    import_posts
    import_avatars
  end

(Añadí la última línea^^)

  def import_avatars
    if AVATAR_DIR
      users = User.all
      users.each do |u|
        unless u.custom_fields["import_id"].nil?
          import_id = u.custom_fields["import_id"]
          if import_id.to_i < 1000
            dir_num = "0"
          elsif import_id.to_i > 1000
            dir_num = import_id.first
          end
        
          avatar_filename = "#{import_id}.jpg"
          file_path = "#{AVATAR_DIR}/l/#{dir_num}"
          file_path_and_name = "#{file_path}/#{avatar_filename}"

          if File.exists?(file_path_and_name)
            upload = create_upload(u.id, file_path_and_name, avatar_filename)
            if upload.persisted?
              u.import_mode = false
              u.create_user_avatar
              u.import_mode = true
              u.user_avatar.update(custom_upload_id: upload.id)
              u.update(uploaded_avatar_id: upload.id)
            else
              puts "Error: Upload did not persist for #{u.username} #{avatar_filename}!"
            end
          end
        end
      end
    end
  end

Es muy tarde aquí, así que es posible que haya cometido algunos errores o que haya omitido mucho, pero esto asume que todos los avatares son .jpg (lo cual parece ser el caso de todos los míos). No estaba muy seguro de los cambios de u.import_mode, así que simplemente los comenté.

Totalmente sin probar (son casi las 5 a.m. aquí :zzz:)

Hice una prueba en mi máquina de desarrollo con un foro de 100 mil publicaciones y tardó 90 minutos. El que quiero importar tiene varios millones de publicaciones, ¿quizás 10 veces más?

¡Genial! ¿Lo compartirán con nosotros? ¿Tienen alguna idea de cuándo?

4 Me gusta

El objetivo actual es asegurarnos de que funcione perfectamente y, una vez que nuestro sitio haya sido migrado, publicarlo eventualmente en el repositorio de Discourse para que otros puedan usarlo.

5 Me gusta

Una guía paso a paso también sería muy útil, por favor :).

1 me gusta

Para 5.000 publicaciones y unas 600 adjuntos, en un Xeon más antiguo y un disco SSD, tardó unos 10 minutos. Te recomendaría conseguir un equipo con suficiente potencia, realizar la importación sin conexión y dejar que trabaje.

5 Me gusta

¡Fantástico! Estoy deseando.

1 me gusta

Ok, he realizado una prueba muy rápida y las adiciones al script parecen haber funcionado. Ahora estoy haciendo una prueba adecuada con varios miles de miembros y 100 mil publicaciones. Informaré si funciona…

1 me gusta

Hola, ¿hay algo nuevo? Si necesitas ayuda con las pruebas, estaré encantado de ayudarte.

Estoy obteniendo un error que indica que la tabla de usuarios no existe al ejecutar el script de XenForo. ¡Cualquier ayuda sería muy apreciada!

He estado leyendo sobre esto durante una hora, pero aún no he logrado resolverlo.

Hay algunas variables al principio del script que debes completar para que pueda conectarse a tu base de datos MySQL de xenForo y consultar los datos. Creo que “import_db” podría ser el valor marcador de posición; verifica que esos valores estén completos correctamente.

3 Me gusta

@Ghan pensé que estaba importando a import_db con esto: mysql -u root -p import_db < /shared/db.sql

Mi xenforo.rb es:

Ah, vale. Si ese es el nombre de tu base de datos, entonces verifica que el nombre de la tabla sea correcto. Es posible que tu tabla se llame xf_user con el prefijo, lo cual causaría un problema. También debería haber una variable TABLE_PREFIX en el script.

4 Me gusta

@Ghan ¡Gracias!

Por ahora, todavía estoy atascado en el script de importación.
Recorre usuarios y categorías sin problemas. Sin embargo, en la función import_posts, simplemente se queda colgada hasta que, después de algunas horas, se agota el tiempo.

Estoy comenzando a depurar esto simplemente imprimiendo los valores en import_posts:

Todos los mensajes de impresión después de la asignación de la variable results nunca se muestran.

Solo por si alguien está buscando importar un foro de vb3, esta guía podría ayudar si también tienes una licencia de Xenforo:

2 Me gusta

¿Este importador importa etiquetas de xenForo junto con los hilos a los que están adjuntas?

Siempre es una buena idea mirar el código fuente.

Creo que la respuesta es… sí (pero no estoy muy familiarizado con las estructuras de datos de Xenforo):

3 Me gusta

Así que, parece que al menos una vez importó algunas etiquetas para alguien bajo ciertas condiciones. Si tienes suerte, ¡también funcionará para ti!

3 Me gusta