Migrer un forum phpBB3 vers Discourse

Est-il possible d’importer des forums phpBB dans un forum Discourse existant, c’est-à-dire de les fusionner ? Je suppose que cela dépend des paramètres de mappage des catégories.

Y a-t-il des problèmes à prendre en compte ?

Les utilisateurs sont-ils fusionnés s’ils ont la même adresse e-mail ?

1 « J'aime »

oui. si vous ne faites pas votre propre mise en correspondance des catégories dans le fichier de configuration, de nouvelles catégories seront créées au besoin pendant l’importation. s’il existe déjà une catégorie dans Discourse correspondant à un nom de catégorie de phpbb, les catégories seront fusionnées.

oh, oui. voici un fil de discussion détaillant ce que j’ai rencontré. j’ai quelques conseils et aussi un dépôt avec mes mises à jour combinées de l’importateur.

je ne me souviens pas des conditions exactes, mais oui, les utilisateurs sont fusionnés automatiquement pendant l’importation.

2 « J'aime »

Je suis curieux de savoir s’il est possible de fusionner un forum phpbb3 dans Discourse tout en gardant tous les sujets importés en lecture seule. J’ai parcouru le fil de discussion, mais je n’ai pas vu cela mentionné. Merci.

Vous pourriez modifier le script d’importation pour archiver tous les sujets créés, ou il pourrait être plus facile de le faire en masse après l’exécution du script. Voir Administrative Bulk Operations pour des exemples.

2 « J'aime »

Bonjour,

Je semble rencontrer un problème lors du démarrage de l’importateur. Cela semble se produire pendant l’importation des utilisateurs ou peu de temps après. J’ai inclus la trace de la pile et une courte vidéo de 20 secondes de la sortie.

Veuillez me conseiller.

0x00007fe87a88bb10 /var/www/discourse/script/import_scripts/phpbb3/importers/user_importer.rb:87>}
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/validations.rb:80:in `raise_validation_error': Validation failed: Name can't be blank (ActiveRecord::RecordInvalid)
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/validations.rb:53:in `save!'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:302:in `block in save!'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:354:in `block in with_transaction_returning_status'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/connection_adapters/abstract/database_statements.rb:314:in `transaction'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:350:in `with_transaction_returning_status'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:302:in `save!'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/suppressor.rb:54:in `save!'
        from /var/www/discourse/script/import_scripts/base.rb:361:in `block in create_user'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.7/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.7/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.7/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activesupport-7.0.7/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.7/lib/active_record/transactions.rb:209:in `transaction'
        from /var/www/discourse/script/import_scripts/base.rb:360:in `create_user'
        from /var/www/discourse/script/import_scripts/base.rb:278:in `block in create_users'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rack-mini-profiler-3.1.1/lib/patches/db/mysql2/alias_method.rb:8:in `each'
        from /var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rack-mini-profiler-3.1.1/lib/patches/db/mysql2/alias_method.rb:8:in `each'
        from /var/www/discourse/script/import_scripts/base.rb:266:in `create_users'
        from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:106:in `block in import_anonymous_users'
        from /var/www/discourse/script/import_scripts/base.rb:948:in `block in batches'
        from /var/www/discourse/script/import_scripts/base.rb:947:in `loop'
        from /var/www/discourse/script/import_scripts/base.rb:947:in `batches'
        from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:293:in `batches'
        from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:102:in `import_anonymous_users'
        from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:33:in `execute'
        from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
        from /var/www/discourse/script/import_scripts/phpbb3/importer.rb:22:in `perform'
        from script/import_scripts/phpbb3.rb:35:in `<module:PhpBB3>'
        from script/import_scripts/phpbb3.rb:16:in `<module:ImportScripts>'
        from script/import_scripts/phpbb3.rb:15:in `<main>'

EDIT :
Il semble que cela ait quelque chose à voir avec les utilisateurs anonymes, je pense que je vais examiner ma base de données.

 def map_anonymous_user(row)
      username = row[:post_username]

      {
        id: @settings.prefix(username),
        email: "anonymous_#{SecureRandom.hex}@no-email.invalid",
        username: username,
        name: @settings.username_as_name ? username : "",
        created_at: Time.zone.at(row[:first_post_time]),
        active: true,
        trust_level: TrustLevel[0],
        approved: true,
        approved_by_id: Discourse.system_user.id,
        approved_at: Time.now,
        post_create_action:
          proc do |user|
            row[:user_inactive_reason] = Constants::INACTIVE_MANUAL
            row[:ban_reason] = "Anonymous user from phpBB3" # TODO i18n
            suspend_user(user, row, true)
          end,
      }
    end

EDIT
J’ai réussi à passer l’erreur en modifiant cette ligne dans la méthode map_anonymous_user. Il s’avère que la valeur par défaut était de définir le nom d’utilisateur sur une chaîne vide, j’ai donc simplement mis un mot dedans.

J’ai changé ceci

name: @settings.username_as_name ? username : "",

en ceci

name: @settings.username_as_name ? username : "Anonymous ",
3 « J'aime »

Puis-je supprimer les anciens messages avant d’exécuter une importation incrémentielle ? J’ai réussi à exécuter l’importation localement dans une installation de développement, et je l’ai restaurée sur mon serveur exécutant une installation Docker, et mon plan est d’exécuter une importation là-bas pour les nouveaux messages. Mais même en ignorant les messages qui ont déjà été importés, l’exécution de l’importation sur le serveur prend des heures. Mon forum est assez grand (1,3 million de messages) et le disque de mon serveur est lent, donc le simple chargement du fichier .sql prend des heures.

Cela causera-t-il des problèmes si je fais quelque chose comme DELETE FROM phpbb_posts WHERE post_id < 2926807 localement, puis que je le sauvegarde et le télécharge sur le serveur et que j’exécute l’importation normalement ?

J’ai ajouté un réglage IMPORT_AFTER à certains scripts pour qu’ils n’extraient que les données après une certaine date. Je modifierais donc la requête SQL qui extrait les publications pour n’obtenir que celles postérieures d’un jour à la dernière sauvegarde de données.

Mais si vous avez un disque très lent, vous aurez probablement du mal à héberger Discourse. Les performances sont-elles acceptables avec les données dont vous disposez ?

1 « J'aime »

Oui, pour une utilisation normale, j’utiliserai un disque plus rapide, mais il n’est pas assez grand pour héberger plusieurs copies de la base de données en même temps, j’achemine donc /shared/import vers un disque plus grand et plus lent dans la section des volumes de import.yml. L’astuce a bien fonctionné pour restaurer la sauvegarde initiale, j’ai réacheminé /shared/tmp vers le disque lent après que la restauration ait échoué en raison d’un manque d’espace, même si j’avais 18 Go libres et une base de données de 6 Go (je pense que vous avez mentionné ailleurs que la restauration crée 3 copies de la base de données pendant son exécution). Mais à ce stade, le temps d’arrêt n’était pas une préoccupation.

Donc, au jour le jour, la taille et la vitesse ne posent pas de problème, mon forum est assez calme, il est juste ancien.

Je vais examiner la modification du SQL dans les scripts. Merci !

2 « J'aime »

Dans le fichier settings.yml, le contenu pour se connecter à mysql est le suivant :


Où puis-je mettre le nom de la base de données ?

Le nom de la base de données doit être indiqué dans le paramètre schema. Le nom de ce paramètre est un peu déroutant, oui. Vous pouvez voir ici dans le code, il est passé comme nom de la base de données.

2 « J'aime »

https://www.loom.com/share/1f66315779af4cf7b286c8541d4f3f09

Salut ! J’ai fait une courte vidéo pour parler du problème que nous rencontrons avec l’importation. Nous transférons environ 650 000 articles.

Merci beaucoup !

https://www.loom.com/share/1f66315779af4cf7b286c8541d4f3f09?sid=11a46d3c-8510-43a1-82e9-1a3524cbb365

Salut. Existe-t-il un moyen d’exécuter l’importation ligne par ligne ? Nous avons des problèmes avec la fin du script. Certaines choses fonctionnent, comme les utilisateurs et les avatars, d’autres non. J’ai réinstallé mon serveur environ 4 fois parce que j’ai lu quelque part qu’après une erreur d’importation, une installation propre doit être effectuée.

D’autres détails sont dans la vidéo que j’ai publiée. Toute aide est appréciée.

Bonjour. Cela fait environ 18 heures que je migre et je ne suis pas plus près de faire fonctionner la migration. Pourriez-vous s’il vous plaît regarder ma vidéo et me donner des conseils ou des astuces, ou me dire s’il manque quelque chose dans la configuration. Nous avons juste besoin des publications, des sujets, des messages privés et des catégories. Les avatars et les utilisateurs fonctionnent. Le serveur est propre, UBUNTU 22.04.

Une solution plus simple est de faire une sauvegarde après avoir créé le site afin de pouvoir restaurer celle-ci. Une autre façon d’obtenir une base de données propre est d’exécuter rake db:drop db:create db:migrate, mais vous devez faire quelques choses pour que cela soit possible. Si vous ne pouvez pas deviner ces choses à partir des messages d’erreur, alors la solution de sauvegarde/restauration est la bonne, et peut être plus rapide de toute façon.

Vous pouvez y ajouter quelques instructions de débogage puts, bien que la structure du script phpbb3 soit un peu déroutante pour ceux qui ne connaissent pas bien Ruby.

De plus, vous pouvez exécuter le script plusieurs fois et il ignorera les choses qu’il a déjà faites, donc vous n’avez pas vraiment besoin d’effacer la base de données tant que vous n’avez pas changé quelque chose qui nécessite un nouveau départ (c’est-à-dire qu’il fera quelque chose de différent avec les données déjà importées).

C’est au-delà de ce que je peux faire gratuitement. Si vous avez un budget, vous pouvez me contacter directement ou poster dans Marketplace.

Le script d’importation ne semble pas fonctionner. Le problème se situe au niveau de la vidéo. Si quelqu’un de discourse migrations peut examiner la situation, ce serait apprécié.

Si le support est payant, pourriez-vous indiquer le coût de la migration ? Je croyais que c’était ici que l’on posait des questions sur le fonctionnement du script. Je suis d’accord avec les frais, je pensais simplement qu’il s’agissait d’un projet open source et que c’était l’endroit où poser des questions.

Je dis que je suis bénévole ici, et je ne suis pas disposé à regarder une vidéo gratuitement, en grande partie à cause de mon mépris irrationnel pour la vidéo. Mais je ne suis pas le seul ici. Beaucoup de gens aiment regarder des vidéos.

Donc, à chaque fois qu’il s’exécute, il crée des doublons des utilisateurs qu’il a créés lors de l’exécution précédente ? Je n’arrive pas à imaginer comment cela pourrait être le cas. Êtes-vous sûr ? Ce n’est pas comme cela qu’il est censé fonctionner.

Il semblera importer à nouveau les éléments, mais cela va beaucoup plus vite car il ne fait rien, puisque les éléments déjà importés ont un champ personnalisé import_id défini qui empêche leur réimportation. S’il duplique des données à chaque exécution, alors quelque chose de très étrange ne va pas.

C’est le cas. Parfois, les gens ont besoin ou veulent plus d’aide que ce que l’on peut obtenir gratuitement.

2 « J'aime »

Compris. Pourriez-vous s’il vous plaît publier vos tarifs pour la migration ? Je comprends que le script ne semble pas fonctionner et qu’il nécessite un support payant. Cela me convient tout à fait.

1 « J'aime »

Les migrations sont assez complexes. Chacune d’elles présente des défis différents, car les données de chaque forum sont uniques. Le débogage d’un problème de migration peut prendre des heures et nécessite un examen approfondi des journaux, de la base de données, du code, etc. Il est difficile de le faire en se contentant de lire ces messages, désolé de ne pas pouvoir vous aider davantage ! Voici notre FAQ sur les migrations : Migrating to Discourse | Discourse - Civilized Discussion

Merci pour le lien. Je pense avoir trouvé le problème et le script d’importation fonctionne maintenant. J’en suis à environ 100000/666357 messages en ce moment. ChatGPT a été utile pour identifier certaines des erreurs basées sur les autorisations et autres.

2 « J'aime »