Migrer un forum XenForo vers Discourse

Dans le forum que j’ai transféré, xengallery était autrefois installé, j’ai donc dû modifier ce qui suit, car la table xfgallery n’existait plus.

  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 « J'aime »

Vous pouvez essayer de relancer le script et voir s’il se termine.

Votre système est-il sur une seule partition ?

L’étape d’installation de mysql-server est maintenant obsolète. Il faut installer mariadb-server.

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

J’ai pu suivre le reste des étapes et importer la base de données XF, donc quelqu’un devrait mettre à jour le guide.

Je suis maintenant bloqué sur l’étape suivante et j’ai besoin d’aide.

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

L’exécution de ce qui précède me donne l’erreur suivante. J’ai vérifié le Gemfile et il ne contient qu’une seule ligne : gem ‘mysql2’

Ce Gemfile n'inclut pas de source globale explicite.
Ne pas utiliser de source globale explicite peut entraîner la génération d'un lockfile différent en fonction des gems que vous avez installées localement avant l'exécution de bundler.
Définissez plutôt une source globale dans votre Gemfile comme ceci : source "https://rubygems.org".
Impossible de trouver la gem 'mysql2' dans les gems installées localement.
root@ip-172-566-459-13-app:/#

Ok, j’ai réussi à passer à l’étape suivante. Quelqu’un a posté plus haut que nous devions être dans le dossier /var/www/discourse sur le conteneur, puis ajouter le gem.

Maintenant, à la dernière étape

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

J’obtiens cette erreur. Qu’est-ce que je fais 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": We could not find your database: discourse. Available database configurations can be found in config/database.yml. (ActiveRecord::NoDatabaseError)To resolve this error:- Did you not create the database, or did you delete it? To create the database, run: bin/rails db:create- Has the database name changed? Verify that config/database.yml contains the correct database name.

Résolu : J’exécutais en tant qu’utilisateur root, j’ai dû passer à l’utilisateur ‘discourse’. L’importation a commencé.

4 « J'aime »

J’ai donc pris un serveur raisonnablement bon avec 4 CPU et 16 Go de RAM. Au rythme auquel les publications sont migrées, il me faudra 9 jours rien que pour migrer les publications. La migration des utilisateurs a pris 2,5 heures. On peut dire sans risque que ce n’est pas une solution viable pour moi telle quelle, mais au moins je peux passer quelques mois à me familiariser jusqu’à ce que je trouve une solution pour cette migration en masse.

PS :
Dans le script de migration, je vois que les e-mails en double ne sont pas importés. Quelles sont les différentes manières de déterminer un doublon ? J’ai remarqué que xyz@gmail.com est traité de la même manière que xyz+1@gmail.com et xy.z@gmail.com

Existe-t-il d’autres modèles également.

J’ai essayé de faire des migrations sur des VPS avec des spécifications similaires à mon ordinateur personnel, mais pour une raison quelconque, c’était toujours beaucoup, beaucoup plus lent qu’en utilisant mon ordinateur.

De nos jours, je fais toujours mes migrations localement. Combien de publications avez-vous ?

1 « J'aime »

2,5 millions de publications.
J’essaierai la migration locale sur un Mac M1 pour comparer.

1 « J'aime »

C’est à peu près tout. La vérification d’unicité est effectuée sur la version mise en minuscules et normalisée de l’adresse e-mail donnée.

Nous normalisons en supprimant tous les points et en ignorant tout ce qui suit le + dans le nom d’utilisateur.

3 « J'aime »

La vitesse du processeur unique est le facteur important.

Sur mes machines, un taux de 800 à 1000 utilisateurs ou messages/minute est assez typique.

Notez que lorsque vous effectuerez l’importation finale, elle n’importera que les utilisateurs et les messages qui n’ont pas encore été importés, donc cela ne prendra pas très longtemps.

Désactivez le paramètre du site Normaliser les e-mails (désactivé était la valeur par défaut jusqu’à récemment). Il devrait probablement être désactivé dans cette fonction ici :

Vous pouvez le mettre dans votre version personnalisée du script xenforo avec SiteSetting.normalize_emails=false. Je ne suis pas sûr de ce qui est arrivé à ces utilisateurs avec des e-mails en double ; il y a deux choses évidentes à faire, leur donner une adresse e-mail bidon ou ignorer leur importation. Il semble qu’ils leur donnent des adresses bidon ? (Et il y a une très bonne chance qu’il s’agisse d’ailleurs d’utilisateurs bidons). S’il les a ignorés, alors relancer le script les importera.

3 « J'aime »

Oui sur mon ordinateur portable, il traite les choses beaucoup plus rapidement à 1000 éléments par minute. C’est environ 2 fois plus rapide que sur le serveur. Cela représente tout de même environ 3 jours.

J’ai examiné les e-mails ignorés et il semble qu’il fasse un bon travail en ignorant ces comptes. Je vais simplement les fusionner avant l’importation finale. À peine 20 cas de ce type.

Notez que lorsque vous effectuerez l’importation finale, seuls les utilisateurs et les publications qui n’ont pas encore été importés seront importés, donc cela ne prendra pas très longtemps.

Merci de l’avoir souligné. Je l’ai observé moi-même et il semble que ce soit ce qui va sauver la situation lorsque je ferai l’importation finale. Je fais donc une sauvegarde et une restauration sur J-3, puis une autre sauvegarde et restauration avec le nouveau fichier de sauvegarde de base de données le Jour 0. Est-ce correct ?

1 « J'aime »

Ces sauvegardes et restaurations concernent-elles le site XenForo, ou avez-vous un site Discourse en ligne vers lequel vous allez importer les données XenForo ?

Tant que vous n’apportez pas de modifications au script qui nécessitent une réimportation des données, et que ce que vous avez actuellement sur votre ordinateur portable est ce que vous souhaitez sur votre serveur Discourse, vous pouvez continuer à obtenir de nouvelles sauvegardes de la base de données XenForo et à les importer (pour tester, voir combien de temps cela prend, etc.) et ensuite, le jour de la transition, vous figez le site XenForo, obtenez cette base de données, exécutez le script une fois de plus et téléchargez-le sur votre serveur Discourse.

Si vous avez déjà des données sur votre site Discourse que vous souhaitez conserver, les choses sont beaucoup plus compliquées car vous devrez figer ce site, puis obtenir les données XenForo et procéder comme décrit ci-dessus.

1 « J'aime »

Ce sera une nouvelle installation de Discourse, ce qui simplifie les choses.

J’ai pas mal de temps devant moi car je veux tester les migrations plusieurs fois, me familiariser complètement avec Discourse, configurer tous les modules complémentaires comme je le souhaite et peut-être même me salir les mains avec la personnalisation de certains modules complémentaires.

Ce que vous avez expliqué me retire une épine du pied car je pensais devoir également trouver comment gérer les importations en masse.

2 « J'aime »

Je suis revenu avec une question, le script d’importation génère-t-il des journaux ? Mon importation de test est bloquée à 98,2 % depuis quelques heures.

Autre chose que j’ai réalisé, si je redémarre la migration, cela prend environ 30 secondes pour passer un lot de 1000 publications. La vitesse est donc maintenant de 2000 éléments par minute. Ce n’est pas une amélioration significative par rapport aux 1000 publications par minute de la première importation, car même lors de la dernière importation le jour de la bascule, cela prendra environ une journée. 23 heures dont une grande partie consistera simplement à ignorer les éléments déjà importés.

Juste ce que vous voyez.

Vous devriez probablement l’arrêter et la redémarrer.

Oui, il ignorera toutes les données qui ont déjà été importées. Et il le fait beaucoup plus rapidement que 2000 messages/minute. Je pense que vous le verrez lorsque vous le redémarrerez maintenant.

C’est ce que j’ai fait, j’ai redémarré et j’ai ensuite posté ce message. C’est 2000 messages/minute. Pour être sûr, j’ai essayé à nouveau.

1 « J'aime »

J’ai réussi à importer les avatars et les pièces jointes. J’ai copié ces dossiers.

/internal_data/attachments
/data/avatars

Pour répondre à ma question, les avatars et les pièces jointes sont finalisés une fois importés. Si un utilisateur change son avatar après l’importation de son ID, il ne sera pas importé/mis à jour car ce message ou cet utilisateur sera ignoré lors de la deuxième passe.

Il me reste maintenant à trouver comment importer les conversations (on peut aussi les ignorer, mais c’est bien de les avoir) et les redirections permanentes.

@Fajfi - Merci pour ta contribution au script d’importation. Il a fonctionné à merveille pour les avatars et les pièces jointes. Il tourne toujours et n’a pas encore atteint la partie des “likes”.

J’ai corrigé l’importation des conversations. J’ai pu importer plus d’un demi-million de messages de XF2.3 vers Discourse. J’ai soumis une PR au cas où quelqu’un serait intéressé.

----EDIT----

J’ai soumis une autre PR avec une correction pour l’importation des likes. Il est surprenant que personne n’ait migré de XF2.1+ vers Discourse jusqu’à présent. Les likes ont été renommés en réactions en 2019 lors de la sortie de XF2.1.

5 « J'aime »