ToS3MigrationError : les téléchargements n'ont pas été migrés vers S3, entraînant des pièces jointes corrompues. Comment corriger cette erreur ?

FileStore::ToS3MigrationError : 182 des 21 512 téléchargements n’ont pas été migrés vers S3. La migration S3 a échoué pour la base de données ‘default’.

puis une pile d’appels provenant de ‘raise_or_log’, ‘migration_successful?’, ‘migrate_to_s3’, ‘migrate’, ‘block in migrate_to_s3_all_sites’

J’ai rencontré ces erreurs deux fois lors de l’exécution de la tâche uploads:migrate_to_s3. Environ 1 % des fichiers n’ont pas été migrés avec succès, ce qui a entraîné des pièces jointes brisées sur le site après un rebake. Il semble que tous ces fichiers soient plus anciens, datant des premiers mois suivant la création de cette instance Discourse.

En examinant le bucket S3, il semble que les fichiers aient bien été téléchargés avec succès vers S3 ; ils ne sont simplement pas liés correctement après le rebake.


La réexécution de la migration (avant un autre rebake) semble avoir résolu le problème pour une raison inconnue. La même erreur se produit toujours lors de la tâche migrate_to_s3.

Cependant, si je lance à nouveau le rebake, les liens des pièces jointes se brisent à nouveau.

Je ne pense pas qu’il s’agisse d’erreurs, mais je vais inclure la sortie générée pendant le rebake :

/var/www/discourse/lib/file_store/base_store.rb:6: warning: already initialized constant FileStore::BaseStore::UPLOAD_PATH_REGEX
/var/www/discourse/lib/file_store/base_store.rb:6: warning: previously definition of UPLOAD_PATH_REGEX was here
/var/www/discourse/lib/file_store/base_store.rb:7: warning: already initialized constant FileStore::BaseStore::OPTIMIZED_IMAGE_PATH_REGEX
/var/www/discourse/lib/file_store/base_store.rb:7: warning: previous definition of OPTIMIZED_IMAGE_PATH_REGEX was here

L’exécution de rake posts:missing_uploads ou de PostCustomField.where(name: Post::MISSING_UPLOADS) ne révèle aucun problème, ce qui suggère que cela est sans rapport.

Mon problème est peut-être lié à cette discussion : Migrate_to_S3 Fails on Rebake - #12 by evenif

Je vais voir ce que j’apprends et je pourrais fermer ce sujet pour déplacer la conversation là-bas.

Les pièces jointes ou fichiers téléchargés anciens et défectueux s’affichent sous la forme [{nom du fichier}|attachment](/uploads/default/original/2X/6/{hash SHA1 + extension}) dans le texte brut du message. Cela est interprété comme href="/uploads/default/original/2X/6/{hash SHA1 + extension}", ce qui brise les pièces jointes aux fichiers, mais pas les images.

Les pièces jointes fonctionnelles ultérieures apparaissent sous la forme [{nom du fichier}|attachment](upload://{hash SHA1 converti en base62 + extension}) et sont interprétées comme href="/uploads/short-url/{hash SHA1 converti en base62 + extension}".

J’ai écrit un petit code Ruby pour parcourir tous les messages de la période problématique connue et remplacer toutes les anciennes URL de téléchargement par la nouvelle version. J’ai utilisé la fonction base62_sha1 du modèle Upload pour convertir le hash SHA1 en nom de fichier attendu par les URL courtes de Discourse.

Cela a permis de faire fonctionner les pièces jointes. Ensuite, j’ai exécuté un nouveau rebake simplement pour confirmer la correction, et il semble que cela fonctionne toujours. Il semble que le problème résidait uniquement dans Post.raw et n’avait rien à voir avec Upload.