Migrer un forum vBulletin 4 vers Discourse

Salut. Je voulais juste partager ma solution.
Concernant les problèmes avec les citations. Comme je l’ai dit précédemment, j’ai rencontré des problèmes - les expressions régulières ne capturaient pas les guillemets lorsque :

  • le nom d’utilisateur et l’ID du message pouvaient être entourés de guillemets doubles
  • des guillemets imbriqués

J’ai décidé de faire une recherche et remplacement en utilisant une logique différente. Au lieu de rechercher les balises et leur contenu, j’ai utilisé une expression régulière qui recherche uniquement les balises :

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

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

et ensuite j’ai légèrement modifié la détermination de la source d’une citation :

      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

J’ai également changé le code des spoilers. Au lieu de :

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

qui brouillait le texte, je l’ai converti en balise details :

    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

Parce qu’il se trouve que dans le monde vbulletin, le spoiler n’est pas un contenu flouté, mais plutôt un contenu replié. Je pense donc qu’il est beaucoup plus approprié pour le script d’importation vbulletin de convertir les spoilers en détails plutôt qu’en spoiler flouté.

J’ai également remarqué la balise mention. Dans mon cas, sur vbulletin, les mentions ressemblaient à ceci :
[mention=XXX]username[/mention]

L’expression régulière utilisée dans le script ne tient pas compte du fait que la balise peut contenir l’ID de l’utilisateur.

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

Je l’ai également corrigé à ma manière :

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

Ce n’est pas vrai lorsque j’ai commencé à migrer mon forum vBulletin vieux de 24 ans fonctionnant sous vB 3. Il y avait de multiples incompatibilités et d’autres problèmes avec le script. Cependant, j’ai fait beaucoup d’efforts pour créer un importateur pour vBulletin 3 basé sur le script pour vB4.

Le script amélioré est inclus avec Discourse, il s’appelle vbulletin3.rb. L’utilisation du script d’importation vB3 est la même que celle décrite dans ce tutoriel. Exécutez simplement bundle exec ruby script/import_scripts/vbulletin3.rb à la place.

Le vBulletin3 présente des changements/améliorations significatifs :

  1. Les permissions du forum sont copiées
  2. Les groupes de modérateurs du forum sont créés
  3. Les groupes d’utilisateurs rejoignables sont créés avec une configuration appropriée
  4. La hiérarchisation des forums importés jusqu’à 3 niveaux de profondeur (maximum de Discourse)
  5. Des permaliens sont enregistrés pour tous les fils de discussion et messages, empêchant la dégradation des liens
  6. Certains paramètres de base du forum sont copiés (par exemple, titre, e-mail de notification, nom de l’entreprise)
  7. Les sondages sont importés
  8. Améliorations majeures de la conversion bbcode vers markdown
  9. Les liens profonds URL vers les fils de discussion, les messages, les pièces jointes sont convertis en références discourse, cela nécessite de définir la variable d’environnement FORUM_URL sur forum.hostname/path (sans protocole).

Au lieu d’essayer de convertir les messages privés vBulletin en messages privés Discourse, les utilisateurs recevront un message privé système contenant une archive des messages privés qu’ils avaient. La construction des MP de vBulletin n’est pas vraiment compatible avec Discourse. Essayer de le convertir exposerait également une certaine confidentialité en fonction de la manière dont les gens utilisaient les MP dans vBulletin.

Comme c’est probablement aussi le cas avec d’autres importateurs, la conversion peut prendre beaucoup de temps. Le script de conversion a pris 5,5 heures sur mon poste de travail pour 7k utilisateurs, 16k fils de discussion, 415k messages. Je n’ai aucune idée du temps que cela a pris pour le post-traitement, j’ai laissé cela tourner pendant la nuit. Du début à la fin, le forum a été indisponible pendant 30 heures. Au final, je suis satisfait du résultat.

2 « J'aime »

Voilà qui rappelle le bon vieux temps :slight_smile:

Ton forum est très joli. J’aime les couleurs alternées sur les lignes des sujets.

Il semble que ce fil de discussion et l’importateur soient tous deux obsolètes à ce stade. J’ai résolu quelques problèmes avec l’aide de ce fil de discussion, mais je suis maintenant bloqué sur l’étape d’importation des utilisateurs, quelqu’un sait comment résoudre ce problème ?

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

Soit la requête est incorrecte, soit d’une manière ou d’une autre, la table manque une valeur

C’est assez bizarre de répondre à cela tant d’années plus tard, mais je fais actuellement une importation VB avec l’importateur en masse et un tas d’images manquaient et la raison est qu’ils ont déplacé le nom du fichier joint vers un champ différent.

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

le fichier NUMBER.attach est maintenant le champ filedataid, pas le champ attachment_id. Donc cette requête doit être mise à jour dans le script.

On me demande de migrer un forum vbulletin 4.25 vers discourse…. lire ce fil de discussion me donne des sentiments mitigés… il semble que ce soit possible, mais potentiellement une douleur et une perte de temps énormes (que je pourrais éviter en ce moment)….\n\nexiste-t-il un script mis à jour pour vbulletin 4.25 quelque part ? Je ne vois que 3 et 5 sur la page officielle ?

Eh bien, il y a des scripts vbulletin et vbulletin5 dans le répertoire bulk imports qui n’ont que quelques mois. L’exécution de ces importations en masse est assez délicate et mal documentée.

J’ai effectué plus de 100 importations et je suis à peu près sûr de n’en avoir jamais fait une qui n’ait pas nécessité de modifier le script pour une raison ou une autre.

J’ai écrit plusieurs scripts d’importation avant même d’apprendre le Ruby (Mais un professeur au milieu des années 1980 m’a assuré qu’après son cours de Langages de Programmation, je pourrais dire que je connaissais n’importe quel langage si j’avais un week-end et un livre ; il avait en grande partie raison.)

Mais oui, cela risque d’être au moins aussi pénible et chronophage que vous l’imaginez.

Je soupçonne que le script vbulletin fera un travail décent ; je ne recommanderais probablement pas le script d’importation en masse à moins que vous n’ayez plus d’un million de messages + utilisateurs.

1 « J'aime »

Merci pour ça :slight_smile:

Je suppose que je dois décider ce que je fais ce week-end :smiley:

1 « J'aime »

J’apprécierais vraiment votre aide avec ça :face_with_spiral_eyes:

J’ai lu la discussion et suivi quelques étapes que j’ai vues ici, mais je suis bloqué.

  1. Je me connecte en ssh à mon vps
  2. Je vais dans l’image docker
  3. J’installe mariadb-server
  4. J’essaie d’exécuter la commande mysql pour créer une base de données, mais j’obtiens « impossible de se connecter au serveur local via socket »

les instructions ici datent de quelques années - j’ai vu que quelques personnes ont eu la même erreur, mais je ne vois aucune résolution à cela.

quelqu’un a-t-il fait ce processus récemment et peut me montrer la bonne direction - je ne pense pas qu’il y ait un guide étape par étape qui me manque, n’est-ce pas ?

edit : juste pour ajouter, j’ai essayé toutes sortes de manipulations et j’ai fini par installer une image docker de mariadb sur l’hôte local (pas docker) puis en exposant le port - je peux maintenant me connecter à la base de données depuis l’image docker… mais l’exécution du script donne : Gemfile : Variable locale ou méthode ‘mysql2’ indéfinie. J’ai essayé d’installer le gemfile, mais cela échoue… et avant de dépanner davantage, j’ai le sentiment que j’utilise des informations obsolètes et potentiellement de vieux paquets… Je suis juste très confus et j’aurais besoin de quelques conseils !

toute aide est appréciée !

…j’ai persisté et j’ai finalement réussi à exécuter le script ! Cependant, après l’avoir lancé, il échoue avec :

"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- [................]"

…et je pense que j’ai atteint mes limites en matière de dépannage.

Je ne sais pas si le démarrer depuis /var/www/discourse fait une différence, mais je le fais toujours. Voici ce qui est recommandé dans le message d’origine.

Je ne reconnais pas cette erreur.

1 « J'aime »

Au moment où j’ai abandonné hier soir, après des heures de « recherche », j’avais bricolé tellement de choses en dehors de ma zone de confort que je craignais de faire plus de mal que de bien. J’étais également désireux d’entendre si quelqu’un l’avait fait récemment et s’il y avait une étape magique qui me manquait, plutôt que de sombrer dans des trous de lapin récurrents :winking_face_with_tongue:

Il est possible qu’il y ait un nouveau problème. J’ai effectué une importation mbox l’autre jour, et j’imagine que cela appelle le même code qui vous a causé l’erreur.

Oh. Je l’ai fait dans un conteneur et ces instructions sont pour un environnement de développement. Avez-vous configuré un environnement de développement ? Avez-vous réussi ? C’est délicat sur un VPN.

Je vais tout effacer et réessayer demain, migraine ce soir.

Je vous tiendrai au courant :slightly_smiling_face:

1 « J'aime »

Avez-vous configuré un environnement de développement ? Était-ce votre première étape ?

J’ai essayé de le faire via le VPS hôte, et de le bricoler via le conteneur. Au moment où j’ai eu fini, je n’étais plus sûr de ce que j’avais fait et où. C’est probablement un problème de compétence… Je recommencerai à zéro demain.

Si vous le faites sur une VM, le faire dans un conteneur est probablement plus facile. Je regarderais d’autres exemples d’importation (ils incluront le modèle mysql).

Vous entrerez dans le conteneur, peut-être modifierez le fichier Gem et exécuterez bundle install.

Utiliser un conteneur pour mysql ou mariadb a probablement du sens. (mais vous devrez alors vous assurer que les conteneurs peuvent se voir)

1 « J'aime »

J’ai une nouvelle passionnante…

J’ai réussi à faire fonctionner le script (je vais faire un guide une fois que tout sera terminé), il a importé les groupes d’utilisateurs, mais il est bloqué sur l’importation des utilisateurs, je pense que cela est dû à la variable de fuseau horaire ?

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>'

La valeur par défaut dans le script est “America/Los Angeles” - le forum vBulletin est réglé sur (GMT) Europe de l’Ouest, Londres, Lisbonne, Casablanca) et l’instance Discourse dans laquelle j’importe a deux entrées : America/Los Angeles et Europe/Paris.

Savez-vous lequel je devrais choisir ?

Peu importe lequel vous choisissez.

Je pense que c’est peut-être que la date n’est pas stockée de la manière attendue par le script.

1 « J'aime »