Déplacement d'un site utilisant les intégrations Discourse pour les commentaires

Bonjour à tous,

J’utilise les intégrations Discourse pour héberger les commentaires d’un blog situé sur un sous-domaine, mais je souhaite déplacer ce blog vers un sous-URL du domaine principal.

Par exemple : actuellement, le blog se trouve à

blog.somedomain.com

mais je souhaite le déplacer vers

somedomain.com/blog

Comment puis-je mettre à jour les sujets de commentaires Discourse existants pour qu’ils pointent vers le nouvel emplacement du blog ?

Je suppose que je peux mettre à jour manuellement le contenu des messages, mais est-ce que la visite du nouveau site de blog entraînera la création de nouveaux sujets, car ils se trouvent désormais à une URL différente ?

(Le blog est un blog Ghost, au cas où cela aurait de l’importance.)

Toute aide est appréciée.
Brad

1 « J'aime »

J’ai récemment traité un cas similaire. Dans cette situation, le site avait déjà changé le domaine de son blog. Cela a entraîné la création de sujets dupliqués sur Discourse pour tous les articles de blog qui avaient déjà généré des sujets Discourse.

La solution consistait à exécuter un script depuis la console Rails du site pour trouver toutes les entrées TopicEmbed ayant un embed_url sur l’ancien domaine. Ces valeurs embed_url ont ensuite été mises à jour avec le bon domaine après avoir supprimé l’entrée TopicEmbed correspondant au sujet en double. Les nouveaux sujets générés ont ensuite été supprimés.

Cela semble être une méthode compliquée pour résoudre le problème. Je peux publier les détails du script que j’ai utilisé, mais il serait excellent d’entendre si quelqu’un d’autre a des idées sur la manière d’aborder ce problème. C’est une situation qui risque de se présenter de temps en temps avec les sujets intégrés.

1 « J'aime »

Bonjour Simon,

Merci.

Ce serait formidable (et toute information sur la façon de l’exécuter serait utile).

Je suppose que je devrai mettre à jour manuellement le contenu des publications qui renvoient à l’article original. (c’est-à-dire la partie du texte de la publication qui indique : « Ceci est un sujet de discussion complémentaire pour l’entrée originale à… »).

Je suis d’accord — quelque chose qui doit rarement être fait, mais qui semble être une véritable corvée lorsqu’il faut le faire.

Brad

Je vais partager le script ici. Gardez à l’esprit que je ne suis pas certain que ce soit la meilleure approche pour résoudre ce problème. Le script doit être exécuté après que des sujets en double aient commencé à être créés à la suite du changement de nom de domaine. Comme les sujets ne seront créés que lorsque les utilisateurs commenceront à visiter vos articles de blog sur le nouveau nom de domaine, vous devrez probablement exécuter le script plusieurs fois pour capturer tous les sujets. Assurez-vous de remplacer old.domain.com sur la première ligne du script par le véritable domaine où se trouvait votre blog auparavant.

# Exécutez ceci en premier :
original_embeds = TopicEmbed.where("embed_url LIKE ?", "%old.domain.com%")

# Ensuite :
original_embeds.each do |original_embed|
  original_topic = Topic.find(original_embed.topic_id)
  if (original_topic && original_topic.title)
    possible_dups = Topic.where(title: original_topic.title).order(:created_at)
    if possible_dups.length === 2
      new_embed = TopicEmbed.find_by(topic_id: possible_dups.last.id)
      new_embed_url = new_embed.embed_url
      puts "Destruction de TopicEmbed : #{new_embed.id} Sujet : #{new_embed.topic_id}"
      new_embed.destroy
      puts "Mise à jour de TopicEmbed : #{original_embed.id} Nouveau embed_url : #{new_embed_url}"
      original_embed.update(embed_url: new_embed_url)
    end
  end
end

Pour exécuter le script, ouvrez la console Rails de votre site, puis copiez la première ligne du script dans la console et exécutez-la. Cela affectera la variable original_embeds à un tableau d’enregistrements TopicEmbed. Une fois cela fait, vous pouvez copier le reste du script dans la console et l’exécuter.

Par mesure de sécurité, vous devriez créer une sauvegarde de la base de données de votre site avant d’exécuter le script. Il serait également judicieux de faire un test à blanc du script qui n’effectue aucune modification. Voici comment procéder :

original_embeds.each do |original_embed|
  original_topic = Topic.find(original_embed.topic_id)
  if (original_topic && original_topic.title)
    possible_dups = Topic.where(title: original_topic.title).order(:created_at)
    if possible_dups.length === 2
      new_embed = TopicEmbed.find_by(topic_id: possible_dups.last.id)
      new_embed_url = new_embed.embed_url
      puts "(Test à blanc) Destruction de TopicEmbed : #{new_embed.id} Sujet : #{new_embed.topic_id}"
      #new_embed.destroy
      puts "(Test à blanc) Mise à jour de TopicEmbed : #{original_embed.id} Nouveau embed_url : #{new_embed_url}"
      #original_embed.update(embed_url: new_embed_url)
    end
  end
end

Assurez-vous que la sortie semble raisonnable avant de décommenter les lignes qui effectuent les modifications réelles sur votre base de données.

Voici ce que fait le script :

  • la variable original_embeds est affectée à tous les enregistrements TopicEmbed correspondant à l’ancien domaine de votre blog

  • pour chacun des original_embeds, il tente de trouver un sujet avec un titre en double (le nouvel embed en double)

  • si un sujet en double est trouvé et qu’un enregistrement TopicEmbed existe pour ce sujet en double, cet enregistrement TopicEmbed est supprimé et la valeur de sa propriété embed_url est transférée à l’ancien enregistrement TopicEmbed.

Je vous recommande vivement de faire un test à blanc (en utilisant le deuxième script de cet article) avant d’exécuter le script qui effectue réellement les modifications. Si des erreurs sont retournées lors du test à blanc, vous devrez identifier leur cause. En examinant le code, je remarque un problème potentiel qui pourrait survenir si un sujet sur votre site Discourse avait un titre en double avec un sujet intégré, mais sans enregistrement TopicEmbed associé. Si c’est le cas, cela peut être résolu.

3 « J'aime »

Bonjour Simon,

C’est vraiment utile. Merci.

Dans mon cas, je pense que les choses sont encore plus simples, car le site du blog n’a pas encore été déplacé et je n’ai aucun doublon. Je pense que tout ce que j’ai à faire est de mettre à jour les entrées d’intégration existantes avec la nouvelle URL.

Je n’ai jamais utilisé Ruby auparavant, mais à partir de votre exemple, j’ai bricolé le script ci-dessous. En plus de mettre à jour les intégrations de sujets, je l’ai étendu pour mettre à jour également le texte et les liens dans les publications associées.

Pourriez-vous y jeter un coup d’œil rapide pour m’assurer que je suis sur la bonne voie ? Je l’ai exécuté avec les mises à jour commentées et il semble afficher les bonnes informations.

(Au fait : quelle est la méthode habituelle pour exécuter ces scripts ? J’ai édité dans un éditeur de texte puis collé dans la console)

Brad

original_embeds = TopicEmbed.where("embed_url LIKE ?", "https://blog.cantabilesoftware.com%")

old_url_prefix = "https://blog.cantabilesoftware.com/"
new_url_prefix = "https://www.cantabilesoftware.com/blog/"
original_embeds.each do |original_embed|

    new_embed_url = original_embed.embed_url
    new_embed_url.sub!(old_url_prefix, new_url_prefix)
    puts "Updating TopicEmbed: #{original_embed.id} with new url: #{new_embed_url}"
    #original_embed.update(embed_url: new_embed_url)

    post = Post.find_by(id: original_embed.post_id)
    new_raw = post.raw
    new_raw.gsub!(old_url_prefix, new_url_prefix)
    new_cooked = post.cooked
    new_cooked.gsub!(old_url_prefix, new_url_prefix)

    puts "Updating raw with #{new_raw}"
    puts "Updating cooked with #{new_cooked}"

    #post.update(raw: new_raw, cooked: new_cooked)
    
end
2 « J'aime »

Pour la forme, ce qui précède a parfaitement fonctionné. Voici l’intégralité de la procédure que j’ai suivie :

  1. Mise de Discourse en mode lecture seule
  2. Création d’une sauvegarde
  3. Exécution du script ci-dessus
  4. Vérification que les pages de Discourse ont été mises à jour correctement
  5. Arrêt de l’ancien blog et démarrage du nouveau blog
  6. Configuration d’une redirection depuis l’ancien site de blog vers le nouveau
  7. Désactivation du mode lecture seule de Discourse
  8. Reconfiguration des intégrations Discourse pour interdire l’ancien domaine et accepter le nouveau
  9. Configuration des intégrations sur le nouveau blog.

Merci beaucoup à @simon pour votre aide. :+1:

1 « J'aime »