La ri-elaborazione dei vecchi post non recupererà il nuovo S3 CDN URL dopo il cambio di nome del bucket S3

Dopo aver installato Discourse (2.7.0.beta1) e importato i vecchi post di Google Groups, ho aggiunto la configurazione del bucket/chiave S3 (ma nessun URL CDN) ed eseguito

rake uploads:migrate_to_s3

che sembrava funzionare alla grande. Tutte le immagini sono state caricate su S3 e Discourse stava cercando di accedervi tramite un URL S3 generato automaticamente, qualcosa del genere:

https://ortus-discourse.s3.dualstack.us-west-2.amazonaws.com/original/1X/75747ca17a3ca01f298f836691e1990916bafccb.png

Poi ho rinominato il bucket (in ortus-discourse-uploads) e configurato una distribuzione Cloudfront davanti ad esso con un CNAME configurato su Cloudflare chiamato:

https://communitycdn.ortussolutions.com/

Il CNAME, Cloudfront e S3 funzionano tutti perfettamente. URL come questo servono correttamente una delle immagini nel bucket:

https://communitycdn.ortussolutions.com/original/1X/75747ca17a3ca01f298f836691e1990916bafccb.png

Tuttavia, il problema è che Discourse è completamente bloccato sul vecchio dominio ortus-discourse.s3.dualstack.us-west-2.amazonaws.com (che non funziona a causa della rinomina del bucket) e non importa quante volte ricompili il container o riforni i vecchi post, non riesco assolutamente a far sì che Discourse utilizzi il nuovo URL CDN. Ho cercato su Google per un giorno e ho rifatto il baking probabilmente una dozzina di volte (dentro il container app) con varie impostazioni. Ogni thread del forum dà lo stesso consiglio: ricompila e rifai il baking, ma non funziona.

Non sono solo le immagini nei post a essere rotte; anche il tag <link rel="icon" type="image/png" href=""> e il logo del sito sono bloccati sul vecchio dominio e non vogliono usare l’URL CDN di S3.

Ecco le mie attuali impostazioni S3:

  DISCOURSE_S3_ACCESS_KEY_ID: '********'
  DISCOURSE_S3_SECRET_ACCESS_KEY: '******'
  DISCOURSE_BACKUP_LOCATION: 's3'
  DISCOURSE_ENABLE_S3_UPLOADS: true
  DISCOURSE_S3_BUCKET: 'ortus-discourse-uploads'
  DISCOURSE_S3_UPLOAD_BUCKET: 'ortus-discourse-uploads'
  DISCOURSE_S3_BACKUP_BUCKET: 'ortus-discourse-backups'
  DISCOURSE_S3_REGION: 'us-west-2'
  DISCOURSE_S3_CDN_URL: https://communitycdn.ortussolutions.com

  DISCOURSE_CDN_URL: https://community.ortussolutions.com

Ho persino provato a mappare di nuovo il vecchio URL al nuovo URL nei post come segue:

rake posts:remap["ortus-discourse.s3.dualstack.us-west-2.amazonaws.com","communitycdn.ortussolutions.com"]

ma il comando ha detto che 0 post sono stati interessati.

In nessun punto delle mie variabili d’ambiente o delle impostazioni del DB ho qualcosa che fa riferimento al vecchio nome del bucket ortus-discourse, quindi non riesco a capire da dove Discourse continui a prenderlo. Sono nuovo di Discourse e non sono uno sviluppatore Ruby, quindi non ho scavato più a fondo di quanto riesco a vedere nel mio app.yml, nell’interfaccia di amministrazione e nell’output dei comandi rake che ho trovato sui forum.

Qual è il valore di quei caricamenti nella tabella Uploads?

./launcher enter app
rails c
Upload.all.sample(10).pluck(:url)

@Falco Grazie per la risposta. Ecco l’output di quel comando.

root@discourse-app:/var/www/discourse# rails c
Upload.all.sample(10).pluck(:url)
[1] pry(main)> Upload.all.sample(10).pluck(:url)
=> ["//ortus-discourse.s3.dualstack.us-west-2.amazonaws.com/original/1X/52b3aff4e63a7e38bef42d469bafd1ed7c1cc1a2.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/9f90374a280a4681332bcd2191b8de43462f8776.png",
 "//ortus-discourse.s3.dualstack.us-west-2.amazonaws.com/original/1X/29691fba566fc998a966aa93859753e3cf0b8528.cfc",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/6ae912ced40d60adc1356c1d7acf144b0fa0985a.jpeg",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/4dfe5b48fc8cb5d79880d70355c34d7ed02be812.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/897c4b4e755c1c8e93224a27187dc631a02e4388.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/59886f322e6834b567d473138108fab6e0f33764.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/e3e3429d63155cf0d850e161846d187bc6f273ea.jpeg",
 "//ortus-discourse.s3.dualstack.us-west-2.amazonaws.com/original/1X/1b701869b4b235daa8d6a9a7728766f3b4e69814.txt",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/c83aaee941462d47ef91f0c6448257d07487b231.png"]
[2] pry(main)>

Quindi ci sono effettivamente diversi file con il vecchio bucket.

Il remapping di cui hai bisogno dovrebbe essere:

./launcher enter app
rails c
DbHelper.remap("ortus-discourse.s3.dualstack.us-west-2.amazonaws.com", "ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com")

Effettua prima un backup, poiché non è possibile annullare tale operazione.

@Falco Grazie ancora. Ho eseguito due rimappature:

DbHelper.remap("ortus-discourse.s3.dualstack.us-west-2.amazonaws.com", "communitycdn.ortussolutions.com")
DbHelper.remap("ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com", "communitycdn.ortussolutions.com")

Ho ricompilato l’immagine e questo ha risolto problemi come il logo nell’intestazione del sito. Sto rigenerando tutti i post per vedere se risolve anche il problema delle immagini nei post, ma ci vorrà un po’ di tempo.


Mentre aspettiamo la rigenerazione, cosa è andato storto? Si tratta di un bug in Discourse per cui i miei upload sono rimasti bloccati sull’URL vecchio e non sono passati a quello nuovo?

Ho letto post come questo che parlavano della modifica di un URL CDN, ma menzionavano solo la sostituzione delle stringhe nei post (che non ha funzionato) e non facevano alcun accenno alla rimappatura tramite DBUtil. How do I change the legacy CDN URLs of images in posts?

Ho persino provato a rieseguire lo script rake di importazione su S3, ma ho ricevuto un errore (scusa, non ho preso nota del messaggio al momento).

Ho anche trovato uno script rake migrate_from_s3 che quasi ho eseguito per vedere se potevo ricominciare da capo, ma poi ho trovato un post nel forum qui che indicava che avrebbe rovinato il mio database se l’avessi eseguito, quindi l’ho lasciato stare.

Non so cosa avrei dovuto fare diversamente o quale post del forum avrebbe potuto darmi la risposta. (Ho davvero cercato di risolvere il problema da solo prima di pubblicare qui!)

Purtroppo, la nuova elaborazione non sembra aver risolto il problema delle immagini incorporate nei post. Ciò che è interessante è che, se scelgo un vecchio post e lo modifico, vedo l’immagine rappresentata in questo modo:

![COMMANDBOXERROR.png|1169x984](upload://yTDVQSa4wbIeLGEZvE7muXe8sAJ.png)

ma quando visualizzo il post, c’è semplicemente un grande spazio vuoto che punta a

https://community.ortussolutions.com/images/transparent.png

Questo è un cambiamento piuttosto recente. Per la maggior parte di ieri, queste immagini puntavano semplicemente al vecchio URL S3 errato, ma in qualche momento tra ieri sera e oggi è apparso il PNG trasparente.

Hmmmm, non è esattamente quello che ti avevo detto di fare nella mia risposta :face_with_raised_eyebrow:

Nella tabella uploads ci aspettiamo il percorso S3, e viene sostituito con la CDN solo durante il processo di elaborazione del markdown.

Hai inserito la CDN nella tabella Uploads, ma non è così che il software funziona normalmente.

Scusa per questo, ho pensato che tu non avessi letto attentamente l’OP e non avessi notato che avevo menzionato la distribuzione Cloudflare e che dovevo adattarla per utilizzare il mio URL reale. Non avevo capito che l’URL indesiderato fosse effettivamente memorizzato nel database. Quasi ti ho risposto chiedendo se fosse quello che intendevi, ma mi sembrava ovvio cosa dovessi fare.

Nessun problema, posso facilmente rimappare quegli URL all’URL S3. Questa è una nuova installazione di Discourse e tutto il contenuto caricato si trova nello stesso posto, quindi è facile cambiare.

Le mie domande su cosa è andato storto nel mio precedente post restano valide.

Credo che la questione sia semplice: non supportiamo la modifica del bucket di Object Storage.

Per “supporto” si intende che non è possibile modificarlo aspettandosi che funzioni, e non esiste alcuna guida scritta né un task rake pre-confezionato per farlo. Quindi, se alla fine hai bisogno di cambiare un bucket, sarà necessario intervenire manualmente sul database.

Ok, giusto. Quindi il problema principale è stato quando ho rinominato il bucket S3 e ho presunto che aggiornare il nome del bucket nell’interfaccia di amministrazione avrebbe risolto tutto. Forse sarebbe utile un avviso nell’interfaccia di amministrazione quando si modifica il nome del bucket. (Ho iniziato con le impostazioni nell’interfaccia di amministrazione prima di passare all’uso delle variabili d’ambiente, pensando che potesse in qualche modo aiutare) Non era affatto chiaro che cambiare il nome del bucket dopo il caricamento sarebbe stato problematico.

Ho rimappato i domini al corretto dominio AWS S3.

DbHelper.remap("communitycdn.ortussolutions.com", "ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com")
[1] pry(main)> Upload.all.sample(10).pluck(:url)
=> ["//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/fc05f9be9b783479819fec68b1d8e493110007a4.cfc",
 "/images/d-logo-sketch-small.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/50f0d6f260cdb4ef91e29023d92b46df096ab34e.cfc",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/65d80cddc6dc15b9a4d1b9e9d88cc9a8928c5316.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/a86aa2a12183428f3289caa95787ea16f22e2e4d.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/9f76b5238b147a60c8ad5f65bd7fa4bb6b58d852.png",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/6a4c9b992e6cd8a15ddeaec0d158ebd473164525.zip",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/3a532dec6390d5087ed6154fc0335c2c0f1ea543.zip",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/93420848249ecea2261d405e46f7f450cc02a3af.txt",
 "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/d67c39e06ce624b9deb7625dd041d21cffd96df9.png"]

Ho ricompilato l’app di nuovo e ora sto rigenerando i post. Vediamo se la trentasettesima volta è quella buona :slight_smile:

Tutti gli upload hanno l’URL corretto del bucket S3, il contenitore è stato ricostruito e tutti i 30.000 post sono stati rigenerati. Tuttavia, vedo ancora

/images/transparent.png

al posto di tutte le mie immagini.

La modifica dei post mostra ancora questo:

![COMMANDBOXERROR.png|1169x984](upload://yTDVQSa4wbIeLGEZvE7muXe8sAJ.png)

Ciò che è interessante è che altri allegati, come i file zip, funzionano correttamente ora.

Manca qualche elemento necessario per far funzionare le immagini incorporate nei post vecchi?

Puoi stampare gli attributi dell’oggetto Upload corrispondente a yTDVQSa4wbIeLGEZvE7muXe8sAJ?

Mi farebbe molto piacere, ma in questo caso avrò bisogno di un po’ di aiuto. Sono uno sviluppatore, ma non uno sviluppatore Ruby. Ho capito come stampare tutti gli attributi di un caricamento casuale in questo modo:

[17] pry(main)> Upload.all.sample(1)
=> [#<Upload:0x00005633230f8af0
  id: 353,
  user_id: 273,
  original_filename: "helloWorldF.zip",
  filesize: 50542,
  width: nil,
  height: nil,
  url: "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/3a532dec6390d5087ed6154fc0335c2c0f1ea543.zip",
  created_at: Wed, 30 Dec 2020 18:46:31 UTC +00:00,
  updated_at: Wed, 30 Dec 2020 18:46:31 UTC +00:00,
  sha1: "3a532dec6390d5087ed6154fc0335c2c0f1ea543",
  origin: nil,
  retain_hours: nil,
  extension: "zip",
  thumbnail_width: nil,
  thumbnail_height: nil,
  etag: nil,
  secure: false,
  access_control_post_id: nil,
  original_sha1: nil,
  animated: nil,
  verification_status: 1>]

E ho trovato alcuni riferimenti per Active Record di ROR per trovare record specifici, ma non riesco a trovare alcun dato che assomigli minimamente a yTDVQSa4wbIeLGEZvE7muXe8sAJ. Come posso trovare il record di caricamento corrispondente?

Oh, ottime notizie. Mentre facevo ricerche su come trovare i record degli Upload, ho trovato questo post che mi ha mostrato come convertire la stringa base62 nell’hash sha1.

Viene menzionato che le immagini che mostrano solo “transparent.png” sono state “tombstoned”. Non sono del tutto sicuro di cosa significhi, ma suppongo che un processo sia stato eseguito durante la notte mentre le immagini erano danneggiate e le ha contrassegnate come non in uso. Sono riuscito a eseguire

rake uploads:recover_from_tombstone

e sembra che tutte le mie immagini incorporate siano tornate e ora puntino al mio CDN S3!

Per completezza, ecco come ho trovato il record Upload partendo dalla stringa yTDVQSa4wbIeLGEZvE7muXe8sAJ.

[14] pry(main)> Base62.decode("yTDVQSa4wbIeLGEZvE7muXe8sAJ").to_s(16)
=> "f49428d6af35d7e0414408ccb65e7316f5003215"
[15] pry(main)> Upload.where( "original_filename ilike '%f49428d6af35d7e0414408ccb65e7316f5003215%'" )
=> [#<Upload:0x000056313aa91fe8
  id: 899,
  user_id: 549,
  original_filename: "f49428d6af35d7e0414408ccb65e7316f5003215.png",
  filesize: 25514,
  width: 1169,
  height: 984,
  url: "//ortus-discourse-uploads.s3.dualstack.us-west-2.amazonaws.com/original/1X/f49428d6af35d7e0414408ccb65e7316f5003215.png",
  created_at: Tue, 12 Jan 2021 23:01:35 UTC +00:00,
  updated_at: Tue, 12 Jan 2021 23:01:36 UTC +00:00,
  sha1: "f49428d6af35d7e0414408ccb65e7316f5003215",
  origin: nil,
  retain_hours: nil,
  extension: "png",
  thumbnail_width: 594,
  thumbnail_height: 500,
  etag: "6977f35ddbf39a4399dc76f92a5079d4",
  secure: false,
  access_control_post_id: nil,
  original_sha1: nil,
  animated: nil,
  verification_status: 1>]

Grazie ancora per il tuo aiuto @Falco. Sono nuovo su Discourse, ma hai dimostrato di essere molto paziente e disponibile :+1: