Migrer un forum XenForo vers Discourse

Seulement 5 000 publications et environ 1 000 membres

3 « J'aime »

J’attends toujours l’importateur de grands tableaux pour essayer et tester mon forum de publication de 18m.

3 « J'aime »

Pour XenForo ? Nous avons d’autres importations en masse, mais c’est vrai que cela serait très lent pour 18 millions de messages !

4 « J'aime »

Nous travaillons sur notre propre outil d’importation en masse interne pour 27 millions de publications. Le processus est passé de plus d’une semaine (sans compter les pièces jointes) à moins d’une journée avec tout inclus. Nous avons terminé notre premier test d’importation sans aucune erreur hier. C’est vraiment passionnant.

4 « J'aime »

Merci Justin, je l’ai rapidement examiné — cela te semble-t-il correct ? (N’hésite pas à l’ajouter à l’importateur officiel si tu le souhaites)

  XENFORO_DB = "xenforo_db_3"
  TABLE_PREFIX = "xf_"
  BATCH_SIZE = 1000
  ATTACHMENT_DIR = '/CHEMIN/COMPLET/VERS/attachments'
  AVATAR_DIR = '/CHEMIN/COMPLET/VERS/avatars'

(Ajout de la dernière ligne^^ — cela signifie que tu devras copier les avatars là-bas)

  def execute
    import_users
    import_categories
    import_posts
    import_avatars
  end

(Ajout de la dernière ligne^^)

  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 "Erreur : Le téléchargement n'a pas été persisté pour #{u.username} #{avatar_filename} !"
            end
          end
        end
      end
    end
  end

Il est très tard ici, donc j’ai peut-être fait des erreurs ou oublié beaucoup de choses, mais cela suppose que tous les avatars sont en .jpg (ce qui semble être le cas pour tous les miens). Je n’étais pas trop sûr des bascules u.import_mode, alors je les ai simplement commentées.

Totalement non testé (il est presque 5 h du matin ici :zzz:)

J’ai effectué un test sur ma machine de développement avec un forum de 100 000 publications, et cela a pris 90 minutes. Celui que je souhaite importer en compte plusieurs millions, donc peut-être 10 fois plus long ?

Super ! Vas-tu le partager avec nous ? As-tu une idée de quand ?

4 « J'aime »

L’objectif actuel est de s’assurer qu’il fonctionne parfaitement, puis, une fois notre site migré, de le publier éventuellement dans le dépôt Discourse afin que d’autres puissent l’utiliser.

5 « J'aime »

Un guide étape par étape serait également très utile, s’il vous plaît :).

1 « J'aime »

Pour 5 000 publications et environ 600 pièces jointes, sur un ancien Xeon et un disque SSD, cela a pris environ 10 minutes. Je recommanderais de prendre une machine correctement équipée, d’effectuer l’importation hors ligne et de la laisser travailler tranquillement.

5 « J'aime »

Fantastique ! Nous sommes impatients de le découvrir.

1 « J'aime »

Ok, j’ai fait un test très rapide et les ajouts au script semblent avoir fonctionné — je fais maintenant un test correct avec quelques milliers de membres et 100 000 publications. Je vous tiendrai au courant si cela fonctionne…

1 « J'aime »

Salut, il y a du nouveau ? Si tu as besoin d’aide pour les tests, je serai ravi de t’aider.

Je rencontre une erreur indiquant que la table users n’existe pas lorsque j’exécute le script XenForo. Toute aide serait vraiment appréciée !

J’ai lu des informations à ce sujet pendant une heure, mais je n’ai pas encore trouvé la solution.

Certaines variables se trouvent en haut du script et doivent être renseignées afin qu’il puisse se connecter à votre base de données MySQL XenForo et interroger les données. Je pense que « import_db » pourrait être la valeur par défaut — vérifiez bien que ces valeurs sont correctement remplies.

3 « J'aime »

@Ghan, je pensais importer vers import_db avec ceci : mysql -u root -p import_db < /shared/db.sql

Mon fichier xenforo.rb est :

Ah, d’accord. Si c’est le nom de votre base de données, vérifiez que le nom de la table est correct. Votre table pourrait être xf_user avec le préfixe, ce qui causerait un problème. Il devrait également y avoir une variable TABLE_PREFIX dans le script.

4 « J'aime »

@Ghan Merci !

Pour l’instant, je suis toujours bloqué sur le script d’importation.
L’itération sur les utilisateurs et les catégories se passe bien. Cependant, dans la fonction import_posts, le processus reste bloqué jusqu’à ce qu’un délai d’expiration se produise après plusieurs heures.

Je commence le débogage en affichant simplement les valeurs dans import_posts :

Aucun affichage ne se produit après l’affectation de la variable results.

Au cas où quelqu’un chercherait à importer un forum vBulletin, ce guide pourrait vous aider si vous possédez également une licence XenForo :

2 « J'aime »

Cet importateur importe-t-il les balises de xenForo avec les fils auxquels elles sont attachées ?

Toujours une bonne idée de regarder le code source.

Je pense que la réponse est… oui (mais je ne suis pas très familier avec les structures de données Xenforo) :

3 « J'aime »

Il semble donc qu’il ait au moins une fois importé des balises pour quelqu’un dans certaines conditions. Si vous avez de la chance, cela fonctionnera pour vous aussi !

3 « J'aime »