Umzug einer Website mit Discourse-Integrationen für Kommentare

Hallo zusammen,

ich verwende Discourse-Integrationen, um Kommentare für einen Blog zu hosten, der sich aktuell auf einer Subdomain befindet, möchte den Blog jedoch in einen Unterpfad der Hauptdomain verschieben.

Beispiel: Der Blog befindet sich derzeit unter

blog.somedomain.com

ich möchte ihn jedoch nach

somedomain.com/blog

verschieben.

Wie aktualisiere ich die bestehenden Discourse-Kommentartopics, damit sie auf den neuen Blogstandort verweisen?

Ich vermute, ich kann den Inhalt der Beiträge manuell aktualisieren, aber führt ein Besuch der neuen Blogseite dazu, dass neue Topics erstellt werden, da sie sich nun unter einer anderen URL befinden?

(Der Blog ist ein Ghost-Blog, falls das relevant ist.)

Jede Hilfe ist willkommen.
Brad

1 „Gefällt mir“

Ich habe kürzlich mit einem ähnlichen Problem zu tun gehabt. In diesem Fall hatte die Website bereits die Domain ihres Blogs geändert. Das Ergebnis war, dass für alle Blogposts, die bereits Discourse-Themen generiert hatten, doppelte Themen auf Discourse erstellt wurden.

Die Lösung bestand darin, ein Skript über die Rails-Konsole der Website auszuführen, um alle TopicEmbed-Einträge zu finden, die eine embed_url mit der alten Domain hatten. Diese embed_url-Werte wurden dann auf die korrekte Domain aktualisiert, nachdem der TopicEmbed-Eintrag für das doppelte Thema gelöscht worden war. Die neu generierten Themen wurden anschließend gelöscht.

Das scheint ein umständlicher Weg zu sein, das Problem zu lösen. Ich kann Details zu dem von mir verwendeten Skript posten, aber es wäre großartig zu hören, ob jemand andere Ideen hat, wie man das Problem angehen könnte. Dies ist etwas, das bei eingebetteten Themen von Zeit zu Zeit auftreten wird.

1 „Gefällt mir“

Hallo Simon,

vielen Dank.

Das wäre großartig (und jede Information darüber, wie man es ausführt, wäre hilfreich).

Ich vermute, ich muss den Inhalt der Beiträge manuell aktualisieren, wo sie auf den ursprünglichen Artikel verweisen (z. B. den Teil des Beitragstextes, der sagt: „Dies ist ein begleitendes Diskussionsthema für den ursprünglichen Eintrag unter …“).

Ich stimme zu – etwas, das selten durchgeführt werden muss, aber wenn es doch passiert, eine totale Qual zu sein scheint.

Brad

Ich werde das Skript hier teilen. Beachte bitte, dass ich nicht sicher bin, ob dies der beste Ansatz für das Problem ist. Das Skript muss nachdem doppelte Themen aufgrund der Domainnamen-Änderung erstellt wurden, ausgeführt werden. Da die Themen erst erstellt werden, wenn Benutzer deine Blogbeiträge an der neuen Domain besuchen, musst du das Skript wahrscheinlich mehrmals ausführen, um alle Themen zu erfassen. Ersetze unbedingt old.domain.com in der ersten Zeile des Skripts durch die tatsächliche Domain, unter der dein Blog früher erreichbar war.

# Führe dies zuerst aus:
original_embeds = TopicEmbed.where("embed_url LIKE ?", "%old.domain.com%")

# Dann:
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 "Destroying TopicEmbed: #{new_embed.id} Topic: #{new_embed.topic_id}"
      new_embed.destroy
      puts "Updating TopicEmbed: #{original_embed.id} New embed_url: #{new_embed_url}"
      original_embed.update(embed_url: new_embed_url)
    end
  end
end

Um das Skript auszuführen, öffne die Rails-Konsole deiner Website, kopiere die erste Zeile des Skripts in die Konsole und führe sie aus. Dadurch wird die Variable original_embeds mit einem Array von TopicEmbed-Datensätzen gefüllt. Sobald dies erledigt ist, kannst du den Rest des Skripts in die Konsole kopieren und ausführen.

Zur Sicherheit solltest du vor der Ausführung des Skripts ein Backup der Datenbank deiner Website erstellen. Es wäre auch ratsam, eine Testausführung (Dry Run) des Skripts durchzuführen, die keine Änderungen vornimmt. Das folgende Skript eignet sich dafür:

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 "(Dry run) Destroying TopicEmbed: #{new_embed.id} Topic: #{new_embed.topic_id}"
      #new_embed.destroy
      puts "(Dry run) Updating TopicEmbed: #{original_embed.id} New embed_url: #{new_embed_url}"
      #original_embed.update(embed_url: new_embed_url)
    end
  end
end

Stelle sicher, dass die Ausgabe plausibel erscheint, bevor du die Zeilen, die tatsächliche Änderungen an der Datenbank vornehmen, wieder aktivierst (auskommentierst).

Was das Skript tut:

  • Die Variable original_embeds wird mit allen TopicEmbed-Datensätzen gefüllt, die mit der alten Domain deines Blogs übereinstimmen.

  • Für jeden dieser original_embeds wird versucht, ein Thema mit einem doppelten Titel (das neue doppelte Embed) zu finden.

  • Wenn ein doppeltes Thema gefunden wird und ein TopicEmbed-Datensatz für dieses doppelte Thema existiert, wird dieser TopicEmbed-Datensatz gelöscht und der Wert seiner embed_url-Eigenschaft auf den alten TopicEmbed-Datensatz übertragen.

Ich würde dringend empfehlen, vor der Ausführung des Skripts, das tatsächliche Änderungen vornimmt, eine Testausführung (mit dem zweiten Skript aus diesem Beitrag) durchzuführen. Falls bei der Testausführung Fehler auftreten, musst du die Ursache dafür ermitteln. Beim aktuellen Code sehe ich ein mögliches Problem, das auftreten könnte, wenn auf deiner Discourse-Seite ein Thema mit einem doppelten Titel zu einem eingebetteten Thema existiert, aber kein zugehöriger TopicEmbed-Datensatz vorhanden ist. Falls dies der Fall ist, lässt sich dies beheben.

3 „Gefällt mir“

Hallo Simon,

Das ist wirklich hilfreich. Danke.

In meinem Fall ist es meiner Meinung nach sogar noch einfacher, da die Blog-Website noch nicht verschoben wurde und ich keine Duplikate habe. Ich denke, alles, was ich tun muss, ist die vorhandenen Embed-Einträge mit der neuen URL zu aktualisieren.

Ich habe noch nie Ruby verwendet, aber basierend auf deinem Beispiel habe ich das untenstehende Skript zusammengeschustert. Zusätzlich zur Aktualisierung der Topic-Embeds habe ich es erweitert, um auch den Text und die Links in den zugehörigen Beiträgen zu aktualisieren.

Würdest du es bitte kurz durchsehen, um sicherzustellen, dass ich auf dem richtigen Weg bin? Ich habe es mit auskommentierten Updates ausgeführt, und es scheint die richtigen Dinge anzuzeigen.

(Übrigens: Wie führt man solche Skripte normalerweise aus? Ich habe in einem Texteditor bearbeitet und dann in die Konsole eingefügt.)

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 „Gefällt mir“

Zur Aktennotiz: Das oben Genannte hat einwandfrei funktioniert. Hier ist der vollständige Ablauf, den ich befolgt habe:

  1. Discourse auf Nur-Lese-Modus gesetzt
  2. Ein Backup erstellt
  3. Das oben genannte Skript ausgeführt
  4. Geprüft, ob die Discourse-Seiten korrekt aktualisiert wurden
  5. Den alten Blog heruntergefahren und den neuen Blog gestartet
  6. Eine Weiterleitung vom alten Blog zum neuen Blog eingerichtet
  7. Den Nur-Lese-Modus von Discourse deaktiviert
  8. Die Discourse-Embeddings neu konfiguriert, um die alte Domain auszuschließen und die neue zu akzeptieren
  9. Die Embeddings auf dem neuen Blog eingerichtet.

Vielen Dank, @simon, für die Unterstützung dabei. :+1:

1 „Gefällt mir“