J’utilise les scripts de migration pour migrer un forum Vanilla 3 vers Discourse auto-hébergé.
Le script de migration fonctionne bien : RAILS_ENV=production ruby script/import_scripts/vanilla.rb /shared/uploads/export.text
Le seul problème est qu’une fois que j’ai effectué l’exportation, je ne semble pas pouvoir réimporter. Le script d’importation s’exécute bien une deuxième fois, mais les modifications de données que j’ai apportées au fichier d’importation ne sont pas appliquées. De plus, l’importateur s’exécute environ 50 fois plus vite lors de la deuxième exécution, ce qui me fait suspecter qu’il n’importe rien du tout.
Question : y a-t-il un moyen de réexécuter les scripts d’importation situés à /var/www/discourse/script/import_scripts/
après la première exécution ?
Plus précisément, au fur et à mesure que je corrige les bugs dans le format de mon fichier d’importation, j’aimerais pouvoir réimporter pour que les mises à jour des publications et des discussions soient effectuées uniquement.
Jusqu’à présent, la seule solution que j’ai trouvée a été de supprimer complètement l’installation de Discourse et de recommencer à zéro, ce qui prend près d’une heure à chaque fois.
Des astuces ?
Voici le code pertinent de vanilla.rb :
def import_posts
puts "", "importing posts..."
create_posts(@comments) do |comment|
next unless t = topic_lookup_from_imported_post_id("discussion#" + comment[:discussion_id])
{
id: "comment#" + comment[:comment_id],
user_id:
user_id_from_imported_user_id(comment[:insert_user_id]) || Discourse::SYSTEM_USER_ID,
topic_id: t[:topic_id],
raw: clean_up(comment[:body]),
created_at: parse_date(comment[:date_inserted]),
}
end
end
Je suis programmeur mais pas programmeur ruby. Y a-t-il un moyen de modifier ce code pour forcer le remplacement du contenu d’une publication si je fais une réimportation ?
J’ai trouvé une solution de contournement qui n’est pas si mal - alors que j’améliore mon analyseur qui nettoie le fichier d’importation de Vanilla, j’ai tendance à me concentrer sur les erreurs qui se produisent dans des publications spécifiques.
Ainsi, au fur et à mesure que j’améliore mon analyseur, je peux arrêter l’analyseur dans le débogueur (j’utilise Xojo, pour ce que ça vaut) et obtenir le texte brut.
Ensuite, sur le forum Discourse actif, je peux simplement ajouter une nouvelle publication, y coller le texte et voir à quoi il ressemble.
Cela me permet de faire un cycle de test/débogage/modification de quelques secondes, plutôt que d’une heure environ.
Mon nouveau plan : une fois que je serai satisfait du nettoyage de mon analyseur, je supprimerai Discourse et le réinstallerai à partir de zéro.
Cela fonctionne ainsi intentionnellement. L’idée est que vous puissiez faire une importation maintenant, puis en exécuter une autre avec un nouveau dump, elles seront très rapides car elles importeront uniquement les nouvelles données.
Vous devez supprimer, créer et migrer la base de données pour recommencer.
Si vous avez beaucoup d’utilisateurs, vous pourriez arrêter le script après l’importation des utilisateurs, en faire une sauvegarde, puis restaurer cette sauvegarde avant d’essayer vos corrections.
Cela a parfaitement du sens, merci pour l’explication. Ce serait bien s’il y avait un indicateur que l’on pourrait définir pour « forcer l’écrasement », mais j’ai un peu fouillé dans le code et je n’ai rien vu d’évident.
Existe-t-il un moyen simple de le faire ? La seule solution que j’ai trouvée est la suivante, qui revient essentiellement à démarrer une nouvelle installation Docker :
# ATTENTION : ces commandes suppriment l'intégralité de votre forum Discourse
cd /var/discourse
sudo ./launcher stop app
sudo rm -rf /var/discourse/shared/standalone
sudo ./launcher rebuild app
Cela ne prend qu’environ 10 minutes, mais je dois ensuite passer à nouveau par la configuration initiale, ce qui est une corvée.
Voilà une idée fantastique ! Je pourrais même simplement faire une sauvegarde après une nouvelle installation, mais avant d’exécuter le script d’importation, car la réimportation des utilisateurs/sujets/messages/commentaires est assez rapide, et ce forum n’est pas public.