Mettre à jour les URL dans un sondage après avoir changé le CDN

J’ai créé un sondage sur mon forum comme ceci :

[poll name=freestyle type=multiple results=always min=1 max=14 public=true chartType=bar]
* **#1** ![DSC_2281.jpg|332x500, 33%](upload://ujMDcnd4syevNGdEN2O1qUTeWeK)
* **#2** ![IMG_3248.jpg|690x459, 33%](upload://tsecEjlruXEpg3faidWmENBupM4)
[/poll]

J’ai migré d’un CDN vers l’absence de CDN, et les URLs ont été modifiées de cdn.unicyclist.com vers unicyclist.com.

Cependant, les URLs des images ici restent cassées, bien qu’elles apparaissent dans l’aperçu du message :

Le retraitement des messages et l’exécution de rake 'posts:remap[cdn.unicyclist.com,unicyclist.com]' n’ont pas résolu le problème.

ask.discourse.org conseille :

Ce qui se passe probablement

Les options de votre sondage ne sont pas seulement dans le texte brut du message. Sur le schéma de votre site, les sondages stockent également le HTML rendu des options dans :

  • polls
  • poll_options.html

Ainsi, l’aperçu du message peut sembler correct, mais le rendu du sondage peut toujours utiliser un HTML obsolète avec l’ancien nom de domaine du CDN.

Documentation associée :

Avertissement important

Faites d’abord une sauvegarde complète.

De plus, évitez de « simplement modifier » le sondage s’il a des votes, car les modifications de sondage effacent normalement les votes :

Approche plus sûre : inspectez d’abord un sondage cassé

Dans le conteneur :

cd /var/discourse
./launcher enter app
rails c

Ensuite, trouvez le sondage pour ce message :

poll = Poll.find_by(post_id: POST_ID, name: "freestyle")
PollOption.where(poll_id: poll.id).pluck(:id, :html)

Si vous voyez cdn.unicyclist.com dans ce HTML, cela le confirme.

Réparez ce sondage

poll = Poll.find_by(post_id: POST_ID, name: "freestyle")

PollOption.where(poll_id: poll.id).find_each do |opt|
  new_html = opt.html.gsub("cdn.unicyclist.com", "unicyclist.com")
  opt.update_columns(html: new_html, updated_at: Time.zone.now)
end

Ensuite, retraiter également ce message :

Post.find(POST_ID).rebake!

Si cela fonctionne, corrigez en lot toutes les options de sondage

PollOption.find_each do |opt|
  next unless opt.html&.include?("cdn.unicyclist.com")
  opt.update_columns(
    html: opt.html.gsub("cdn.unicyclist.com", "unicyclist.com"),
    updated_at: Time.zone.now
  )
end

Pourquoi posts:remap n’a pas aidé

Parce que cette tâche rake est destinée au contenu des messages, tandis que vos références d’images cassées se trouvent probablement dans le cache HTML des options de sondage :

Recommandation

  1. testez sur un seul sondage cassé
  2. confirmez que les images se chargent
  3. uniquement ensuite, exécutez la correction en lot

Si vous le souhaitez, je peux vous écrire un script à copier-coller où vous ne devez remplacer que POST_ID et l’exécuter en toute sécurité sur un seul sondage d’abord.

Cela vous semble-t-il correct ? Je ferai bien sûr une sauvegarde au préalable, mais je préfère éviter de devoir restaurer mon forum.

Je dois conserver tous les résultats des sondages :slight_smile:

Question bonus : Discourse devrait-il gérer nativement ces cas ?

Je viens de lire ce message et, si vous ne l’avez pas encore corrigé, je pense que vous pouvez utiliser la fonction intégrée discourse remap.

Contrairement à la tâche rake, discourse remap utilise DbHelper.remap, qui effectue une recherche et un remplacement par expression régulière globale sur toutes les colonnes de texte de toutes les tables de la base de données PostgreSQL. Il devrait donc réussir à trouver et à mettre à jour les URL CDN compilées piégées dans poll_options.html (ainsi que dans toute autre table que la tâche rake ignore).

cd /var/discourse
./launcher enter app
# créer une sauvegarde de sécurité
discourse backup
# exécuter le remappage global (domaine uniquement, sans protocole, pour capturer toutes les variantes)
discourse remap 'cdn.unicyclist.com' 'unicyclist.com'
# vider le cache Redis (crucial car Discourse met fortement en cache le HTML compilé)
rake cache:clear

J’ai fait quelque chose de similaire ici (mais dans l’autre sens) : Chat thumbnails bypass s3_cdn_url & use raw S3 bucket URLs - #8 by Lilly