Migrar un foro vBulletin 4 a Discourse

Hola. Solo quiero compartir mi solución.
En cuanto a los problemas con las citas. Como dije antes, me enfrentaba a problemas: la expresión regular no capturaba las comillas cuando:

  • el nombre de usuario y el ID de la publicación pueden estar entre comillas dobles
  • comillas anidadas

Decidí hacer una búsqueda y reemplazo usando una lógica diferente. En lugar de buscar etiquetas y su contenido, utilicé una expresión regular que busca solo las etiquetas:

era:
raw.gsub!(%r{\\[quote=\"?([^;]+);(\\d+)\"?\\](.+?)\\[\\/quote\\]}im) do

se convirtió en:
raw.gsub!(%r{(\\[QUOTE(=\"?([^;]+);(\\d+)\"?)?\\])|(\\[\\/QUOTE\\])}im) do

y luego cambié un poco la determinación de la fuente de una cita:

      if $3 && $4
        if topic_lookup = topic_lookup_from_imported_post_id(post_id)
          post_number = topic_lookup[:post_number]
          topic_id = topic_lookup[:topic_id]
          "\n[quote=\"#{new_username},post:#{post_number},topic:#{topic_id}\"]\n"
        else
          "\n[quote=\"#{new_username}\"]\n"
        end
      elsif $5
        "\n[/quote]\n"
      end

También cambié el código del spoiler. En lugar de:

    # [spoiler=Some hidden stuff]SPOILER HERE!![/spoiler]
    raw.gsub!(%r{\\[spoiler=\"?(.+?)\"?\\](.+?)\\[/spoiler\\]}im) do
      "\n#{$1}\n[spoiler]#{$2}[/spoiler]\n"
    end

que difumina el texto, lo convierto a la etiqueta de detalles:

    raw.gsub!(%r{(\\[spoiler(=\"?(.*?)\"?)?\\])|(\\[\\/spoiler\\])}im) do
      if $3
        "\n[details=#{$3}]\n"
      elsif $1
        "\n[details]\n"
      elsif $4
        "\n[/details]\n"
      end
    end

Porque resulta que en el mundo de vbulletin, el spoiler no es contenido difuminado, sino contenido colapsado. Así que creo que es mucho más apropiado para el script de importación de vbulletin convertir los spoilers en detalles en lugar del spoiler difuminado.

También noté la etiqueta de mención. En mi caso, en vbulletin, las menciones se veían así:
[mention=XXX]username[/mention]

La expresión regular utilizada en el script no tiene en cuenta que la etiqueta puede contener el ID de usuario.

    # [MENTION]<username>[/MENTION]
    raw.gsub!(%r{\\[mention\\](.+?)\\[/mention\\]}i) do
      new_username = get_username_for_old_username($1)
      "@#{new_username}"
    end

Lo arreglé a mi manera también:

    # [MENTION]<username>[/MENTION]
    raw.gsub!(%r{\\[mention(=\\d+)?\\](.+?)\\[/mention\\]}i) do
      new_username = get_username_for_old_username($2)
      "@#{new_username}"
    end
1 me gusta

Esto no es cierto cuando comencé a migrar mi foro de vBulletin de 24 años que ejecutaba vB 3. Hubo múltiples incompatibilidades y otros problemas con el script. Sin embargo, puse mucho esfuerzo en crear un importador para vBulletin 3 basado en el script para vB4.

El script mejorado se incluye con Discourse, se llama vbulletin3.rb. El uso del script de importación de vB3 es el mismo que se describe en este tutorial. Simplemente ejecute bundle exec ruby script/import_scripts/vbulletin3.rb en su lugar.

vBulletin3 tiene algunos cambios/mejoras significativos:

  1. Se copian los permisos del foro
  2. Se crean grupos de moderadores del foro
  3. Se crean grupos de usuarios unibles con la configuración adecuada
  4. Anidación de foros importada hasta 3 niveles de profundidad (máximo de Discourse)
  5. Se registran enlaces permanentes para todos los hilos y publicaciones, evitando la rotura de enlaces
  6. Se copian algunas configuraciones básicas del foro (por ejemplo, título, correo electrónico de notificación, nombre de la empresa)
  7. Se importan las encuestas
  8. Mejoras importantes en la conversión de bbcode a markdown
  9. Los enlaces profundos de URL a hilos, publicaciones y archivos adjuntos se convierten en referencias de Discourse, esto requiere establecer la variable de entorno FORUM_URL a forum.hostname/path (sin protocolo).

En lugar de intentar convertir los mensajes privados de vBulletin a mensajes privados de Discourse, los usuarios recibirán un mensaje privado del sistema que contiene un archivo de los mensajes privados que tenían. La construcción de PM de vBulletin no es realmente compatible con Discourse. Intentar convertirlo también expondría cierta privacidad dependiendo de cómo las personas usaran los PM en vBulletin.

Como probablemente también sea el caso con otros importadores, puede llevar bastante tiempo convertir. El script de conversión tardó 5,5 horas en mi estación de trabajo para 7k usuarios, 16k hilos, 415k publicaciones. No tengo idea de cuánto tiempo tomó el procesamiento posterior, lo dejé ejecutándose durante la noche. De principio a fin, el foro estuvo inactivo durante 30 horas. Al final, estoy contento con el resultado.

2 Me gusta

Eso sí que es un recuerdo :slight_smile:

Tu foro se ve muy bien. Me gustan los colores alternos en las filas de los temas.

Parece que tanto este hilo como el importador están muy desactualizados en este momento. He solucionado algunos problemas con la ayuda de este hilo, pero ahora estoy atascado en lo siguiente en el paso de importación de usuarios, ¿alguien sabe cómo solucionarlo?

in internal:timev:286:in at': can't convert NilClass into an exact number (TypeError)

Ya sea que la consulta esté incorrecta o que de alguna manera la tabla falte un valor

Es bastante extraño responder a esto tantos años después, pero ahora estoy haciendo una importación de VB con el importador masivo y faltaban muchas imágenes y la razón es que movieron el nombre del archivo adjunto a un campo diferente.

 SELECT a.filedataid attachment_id, a.userid user_id, a.filename filename
             FROM attachment a
            WHERE a.attachmentid = 383075;

el archivo NUMBER.attach es ahora el campo filedataid, no el campo attachment_id. Por lo tanto, esa consulta debe actualizarse en el script.

Me han pedido migrar un foro de vbulletin 4.25 a discourse…. leer este hilo me da sentimientos encontrados… parece que es posible, pero potencialmente un gran dolor de cabeza y una pérdida de tiempo (ambas cosas que podría evitar en este momento)….\n\n¿hay algún script actualizado para vbulletin 4.25 en alguna parte? ¿Solo veo 3 y 5 en la página oficial?

Bueno, hay scripts de vbulletin y vbulletin5 en el directorio bulk imports que tienen solo un par de meses. Ejecutar esas importaciones masivas es bastante complicado y no está bien documentado.

He realizado más de 100 importaciones y estoy bastante seguro de que nunca he hecho una que no requiriera ajustar el script por una u otra razón.

Escribí varios scripts de importación antes de aprender realmente Ruby (Pero un profesor a mediados de los 80 me aseguró que después de su clase de Lenguajes de Programación podría decir que conocía cualquier idioma si tenía un fin de semana y un libro; tenía razón en su mayor parte).

Pero sí, es probable que sea al menos tan doloroso y que consuma tanto tiempo como imaginas.

Sospecho que el script de vbulletin hará un trabajo decente; probablemente no recomendaría el script de importación masiva a menos que tengas más de un millón de publicaciones + usuarios.

1 me gusta

gracias por eso :slight_smile:

supongo que necesito decidir qué voy a hacer este fin de semana :smiley:

1 me gusta

Agradecería mucho ayuda con esto :face_with_spiral_eyes:

He leído el hilo y he seguido algunos pasos que he visto aquí, pero me estoy atascando.

  1. Me conecto por ssh a mi vps
  2. Entro en la imagen de docker
  3. Instalo mariadb-server
  4. Intento ejecutar el comando mysql para crear una base de datos, pero obtengo ‘can’t connect to local server through socket’

Las instrucciones de aquí son de hace unos años. Veo que un par de personas tuvieron el mismo error, pero no veo ninguna resolución.

¿Alguien ha hecho este proceso recientemente y puede indicarme la dirección correcta? No creo que me falte una guía paso a paso, ¿verdad?

edición: solo para añadir, he probado todo tipo de artimañas y terminé instalando una imagen de docker de mariadb en el host local (no en docker) y luego exponiendo el puerto. Ahora puedo conectarme a la base de datos desde la imagen de docker… pero al ejecutar el script obtengo: Gemfile: Undefined local variable or method ‘mysql2’ He intentado instalar el gemfile, pero falla… y antes de solucionar más problemas, tengo la sensación de que estoy usando información desactualizada y potencialmente paquetes antiguos… ¡Estoy muy confundido y podría usar algo de orientación!

¡Cualquier ayuda es apreciada!

…persisti y finalmente logré que el script se ejecutara. Sin embargo, después de empezar a ejecutarlo, falla con:

"root@vps-xxxxxxxx-app:/var/www/discourse/script/import_scripts# bundle exec ruby vbulletin.rb
/var/www/discourse/config/initializers/013-excon_defaults.rb:4:in `<main>': can't modify frozen Hash: {:chunk_size=>1048576,                                                             :ciphers=>"ECDHE-ECDSA- [................]"

…y creo que he llegado al límite de mi capacidad de solución de problemas.

No sé si iniciarla desde /var/www/discourse marca la diferencia, pero yo siempre lo hago. Aquí está lo que se recomienda en el OP.

No reconozco ese error.

1 me gusta

Cuando me rendí anoche, después de horas de “investigación”, había manipulado tantas cosas fuera de mi zona de confort que me preocupaba estar causando más daño que bien. También estaba ansioso por saber si alguien lo había hecho recientemente y si había algún paso mágico que me estuviera perdiendo, en lugar de caer en agujeros de conejo recurrentes :winking_face_with_tongue:

Es posible que haya algún problema nuevo. Hice una importación de mbox el otro día, e imagino que llama al mismo código que te dio el error.

Oh. Lo hice en un contenedor y estas instrucciones son para un entorno de desarrollo. ¿Configuraste un entorno de desarrollo? ¿Lograste que funcionara? Eso es complicado en una VPN.

Voy a borrar y volver a intentarlo mañana, tengo migraña esta noche.

Te haré saber cómo va :slightly_smiling_face:

1 me gusta

¿Configuraste un entorno de desarrollo? ¿Fue ese tu primer paso?

Lo intenté hacerlo a través del VPS anfitrión y arreglándolo a través del contenedor. Para cuando terminé, no estaba seguro de lo que había hecho y dónde. Es probable que sea un problema de habilidad… Empezaré de nuevo desde cero mañana.

Si lo haces en una VM, hacerlo en un contenedor es probablemente más fácil. Buscaría otros ejemplos de importación (incluirán la plantilla de mysql).

Entrarás en el contenedor, quizás editarás el Gemfile y harás bundle install.

Usar un contenedor para mysql o Mariadb probablemente tenga sentido. (pero entonces tendrás que asegurarte de que los contenedores puedan verse entre sí).

1 me gusta

Tengo noticias emocionantes…

He conseguido que el script se ejecute (voy a hacer una guía una vez que todo esté listo), ha importado grupos de usuarios, pero se ha detenido al importar usuarios, creo que tiene que ver con la variable de zona horaria.

importing users
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/tzinfo-2.0.6/lib/tzinfo/timestamp.rb:138:in `for': Integer values are not supported (ArgumentError)

            raise ArgumentError, "#{value.class} values are not supported" unless is_time_like?(value)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/tzinfo-2.0.6/lib/tzinfo/timezone.rb:575:in `utc_to_local'
        from script/import_scripts/vbulletin.rb:1019:in `parse_timestamp'
        from script/import_scripts/vbulletin.rb:166:in `block (2 levels) in import_users'
        from /var/www/discourse/script/import_scripts/base.rb:267:in `block in create_users'
        from /var/www/discourse/script/import_scripts/base.rb:266:in `each'
        from /var/www/discourse/script/import_scripts/base.rb:266:in `create_users'
        from script/import_scripts/vbulletin.rb:148:in `block in import_users'
        from /var/www/discourse/script/import_scripts/base.rb:951:in `block in batches'
        from <internal:kernel>:187:in `loop'
        from /var/www/discourse/script/import_scripts/base.rb:950:in `batches'
        from script/import_scripts/vbulletin.rb:126:in `import_users'
        from script/import_scripts/vbulletin.rb:82:in `execute'
        from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
        from script/import_scripts/vbulletin.rb:1027:in `<main>'

El valor predeterminado en el script es “America/Los Angeles”, el foro vBulletin está configurado en (GMT) Europa Occidental, Londres, Lisboa, Casablanca) y la instancia de Discourse en la que estoy importando tiene dos entradas: America/Los Angeles y Europe/Paris.

¿Sabes cuál debería elegir?

No importa mucho cuál elijas.

Creo que podría ser que la fecha no se almacena de la manera que espera el script.

1 me gusta