Stavo migrando la nostra istanza Discourse da un server a un altro e mi sono imbattuto in un problema interessante…
Utilizziamo S3 per archiviare gli upload dal forum. Li abbiamo abilitati diversi anni fa, quindi non è qualcosa che abbiamo introdotto in questa migrazione.
Dopo aver risolto un paio di altri problemi, sono riuscito a importare il backup. Tuttavia, è fallito in un passaggio relativo a S3 con il seguente errore:
Aggiornamento degli URL nel database...
Rimozione delle vecchie immagini ottimizzate...
Segnalazione di tutti i post contenenti lightbox per il rebake...
72038 post sono stati segnalati per un rebake
ECCEZIONE: 257 post non sono stati rimappati al nuovo URL di upload S3. Migrazione S3 fallita per il db 'default'.
Dopo aver approfondito un po’, sono riuscito a risalire al problema a questa riga:
Quindi, sono andato nella console rails e sono stato in grado di replicare le query con quanto segue:
discourse(prod)> SiteSetting.cdn_path("/uploads/#{@current_db}/original").sub(/https?:/, "")
=> "/uploads//original"
discourse(prod)> RailsMultisite::ConnectionManagement.current_db
=> "default"
discourse(prod)> cdn_path = SiteSetting.cdn_path("/uploads/default/original").sub(/https?:/, "")
=> "/uploads/default/original"
discourse(prod)> Post.where("cooked LIKE '%#{cdn_path}%'")
=> ...
Quindi, sono andato a quei post particolari, ed erano parte dei Performance Reports (lo screenshot è di dopo che ho eseguito uno script di ricerca e sostituzione):
Apparentemente, quel controllo recupera qualsiasi post contenente /uploads/default/original nel campo cooked, nonostante potrebbe non essere un asset legittimo. In questo caso, /uploads/default/original è stato utilizzato come “testo normale”, quindi non è stato perso durante il processo di migrazione.
Non sono sicuro se questo sia previsto?
Grazie!
