Spostare un sito che utilizza integrazioni Discourse per i commenti

Ciao a tutti,

Sto utilizzando le integrazioni di Discourse per ospitare i commenti di un blog situato su un sottodominio, ma vorrei spostare il blog in una sottopagina del dominio principale.

Ad esempio: attualmente il blog si trova su

blog.somedomain.com

ma vorrei spostarlo su

somedomain.com/blog

Come posso aggiornare gli argomenti esistenti dei commenti di Discourse per puntare alla nuova posizione del blog?

Immagino di poter aggiornare manualmente il contenuto dei post, ma visitare il nuovo sito del blog causerà la creazione di nuovi argomenti dato che ora si trovano su un URL diverso?

(Il blog è un blog Ghost, nel caso fosse rilevante)

Qualsiasi aiuto è apprezzato.
Brad

1 Mi Piace

Ho affrontato una situazione simile di recente. In quel caso, il sito aveva già modificato il dominio del proprio blog. Il risultato di tale operazione è stato la creazione di argomenti duplicati su Discourse per tutti i post del blog che avevano già generato argomenti su Discourse.

La soluzione consisteva nell’eseguire uno script dalla console Rails del sito per trovare tutte le voci TopicEmbed che avevano un embed_url sul vecchio dominio. Questi valori di embed_url sono stati poi aggiornati al dominio corretto dopo aver eliminato la voce TopicEmbed relativa all’argomento duplicato. Gli argomenti nuovi che erano stati generati sono stati successivamente eliminati.

Questa sembra una soluzione complessa. Posso condividere i dettagli dello script che ho utilizzato, ma sarebbe ottimo sapere se qualcun altro ha idee su come affrontare il problema. È una situazione che inevitabilmente si presenterà di tanto in tanto con gli argomenti incorporati.

1 Mi Piace

Ciao Simon,

Grazie.

Sarebbe fantastico (e sarebbe utile qualsiasi informazione su come eseguirlo).

Immagino che dovrò aggiornare manualmente il contenuto dei post dove fanno riferimento all’articolo originale. (cioè: la parte del testo del post che dice “Questa è una discussione di accompagnamento per la voce originale su…”).

Sono d’accordo: qualcosa che raramente deve essere fatto, ma che sembra una seccatura totale quando si presenta.

Brad

Condividerò lo script qui. Tieni presente che non sono certo che questo sia l’approccio migliore al problema. Lo script deve essere eseguito dopo che sono stati creati argomenti duplicati a seguito della modifica del nome di dominio. Poiché gli argomenti non verranno creati finché gli utenti non inizieranno a visitare i tuoi post del blog sul nuovo nome di dominio, probabilmente dovrai eseguire lo script più volte per intercettare tutti gli argomenti. Assicurati di sostituire old.domain.com dalla prima riga dello script con il dominio effettivo del tuo blog precedente.

# Esegui prima questo:
original_embeds = TopicEmbed.where("embed_url LIKE ?", "%old.domain.com%")

# Poi:
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 "Distruzione di TopicEmbed: #{new_embed.id} Argomento: #{new_embed.topic_id}"
      new_embed.destroy
      puts "Aggiornamento di TopicEmbed: #{original_embed.id} Nuovo embed_url: #{new_embed_url}"
      original_embed.update(embed_url: new_embed_url)
    end
  end
end

Per eseguire lo script, apri la console Rails del tuo sito, quindi copia la prima riga dello script nella console ed eseguila. Questo assegnerà la variabile original_embeds a un array di record TopicEmbed. Una volta fatto ciò, puoi copiare il resto dello script nella console ed eseguirlo.

Per sicurezza, dovresti creare un backup del database del tuo sito prima di eseguire lo script. Sarebbe anche una buona idea eseguire una simulazione dello script che non apporta alcuna modifica. Ecco come fare:

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 "(Simulazione) Distruzione di TopicEmbed: #{new_embed.id} Argomento: #{new_embed.topic_id}"
      #new_embed.destroy
      puts "(Simulazione) Aggiornamento di TopicEmbed: #{original_embed.id} Nuovo embed_url: #{new_embed_url}"
      #original_embed.update(embed_url: new_embed_url)
    end
  end
end

Assicurati che l’output sembri ragionevole prima di rimuovere i commenti dalle righe che apportano le modifiche effettive al database.

Cosa fa lo script:

  • la variabile original_embeds viene impostata su tutti i record TopicEmbed che corrispondono al vecchio dominio del tuo blog

  • per ciascuno degli original_embeds, cerca un argomento con un titolo duplicato (il nuovo embed duplicato)

  • se viene trovato un argomento duplicato e un record TopicEmbed associato a tale argomento, quel record TopicEmbed viene eliminato e il valore della sua proprietà embed_url viene trasferito al vecchio record TopicEmbed.

Consiglio vivamente di eseguire una simulazione (utilizzando il secondo script di questo post) prima di eseguire lo script che apporta effettivamente le modifiche. Se la simulazione restituisce errori, dovrai capire cosa li causa. Osservando il codice ora, vedo un possibile problema che potrebbe verificarsi se sul tuo sito Discourse esistesse un argomento con lo stesso titolo di un argomento incorporato, ma senza un TopicEmbed associato. Se è così, è qualcosa che può essere risolto.

3 Mi Piace

Ciao Simon,

È davvero utile. Grazie.

Nel mio caso, penso che le cose siano ancora più semplici, dato che il sito del blog non è stato ancora spostato e non ho duplicati. Penso che tutto ciò di cui ho bisogno sia aggiornare le voci di incorporamento esistenti con il nuovo URL.

Non ho mai usato Ruby prima, ma dal tuo esempio ho messo insieme lo script qui sotto. Oltre ad aggiornare gli incorporamenti dei topic, l’ho esteso per aggiornare anche il testo e i link nei post associati.

Ti dispiacerebbe dargli un’occhiata veloce per assicurarti che sia sulla strada giusta? L’ho eseguito con gli aggiornamenti commentati e sembra mostrare le cose giuste.

(a proposito: qual è il modo normale per eseguire questi script? Ho continuato a modificarli in un editor di testo e poi incollarli nella 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 Mi Piace

Per la cronaca, quanto sopra ha funzionato perfettamente. Ecco l’intero processo che ho seguito:

  1. Impostato Discourse in sola lettura
  2. Creato un backup
  3. Eseguito lo script sopra
  4. Verificato che le pagine di Discourse fossero aggiornate correttamente
  5. Arrestato il vecchio blog e avviato il nuovo
  6. Configurato un reindirizzamento dal vecchio sito del blog a quello nuovo
  7. Disattivato la modalità sola lettura di Discourse
  8. Riconfigurato gli embedding di Discourse per non accettare il vecchio dominio e accettare quello nuovo
  9. Configurato gli embedding sul nuovo blog.

Grazie mille @simon per l’aiuto. :+1:

1 Mi Piace