J’essaie de déplacer les téléchargements vers s3 sur un site relativement fréquenté.
Tout se passe comme prévu, sauf lorsque j’exécute rake uploads:migrate_to_s3, je reçois l’erreur suivante :
Mise à jour des URL dans la base de données...
Suppression des anciennes images optimisées...
Marquage de tous les messages contenant des lightboxes pour re-cuisson...
2023 messages ont été marqués pour une re-cuisson
rake a été interrompu !
FileStore::ToS3MigrationError: 1 des 9629 téléchargements n'ont pas été migrés vers S3. La migration S3 a échoué pour la base de données 'default'.
/var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:79:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:373:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:66:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:123:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:102:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:90:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:100:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:96:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tâches : TOP => uploads:migrate_to_s3
(Voir la trace complète en exécutant la tâche avec --trace)
Cette ligne en particulier a attiré mon attention : FileStore::ToS3MigrationError: 1 of 9629 uploads are not migrated to S3. S3 migration failed for db 'default'.
Je suppose que cela signifie qu’un fichier problématique provoque l’échec de l’ensemble de la tâche rake ? Existe-t-il un moyen de découvrir quel fichier cause le problème et peut-être de le supprimer pour que le reste de la tâche se termine paisiblement ?
Mise à jour :
Le site semble se charger normalement et, d’après ce que je peux voir, les images téléchargées sont servies depuis le CDN.
La copie locale de tous les téléchargements existe toujours sur le serveur. Je suppose que c’est parce que la migration est marquée comme échouée.
Voici une sortie de rake uploads:s3_migration_status si cela peut être utile ?
# rake uploads:s3_migration_status
1 des 9630 téléchargements n'ont pas été migrés vers S3. La migration S3 a échoué pour la base de données 'default'.
19 publications n'ont pas été remappées vers la nouvelle URL de téléchargement S3. La migration S3 a échoué pour la base de données 'default'.
Aucune publication ne nécessite de ré-cuisson.
Le site n'est pas prêt pour la migration.
Vous pourriez trouver une référence au fichier qui a échoué via Admin > Logs > Error Logs
Si cela ne vous aide pas, je pense que la recherche dans la base de données des publications avec cooked qui contiennent votredomaine/uploads/ vous donnera une liste de ces 19 publications mentionnées dans le statut de migration. Au pire, vous pourriez alors les examiner manuellement et comparer les téléchargements avec ce qui se trouve dans S3.
Quelque chose comme :
rails c
Post.where("cooked like '%discourse.example.com/uploads/%'")
J’ai essayé vos suggestions, malheureusement, je n’ai rien trouvé de pertinent dans les journaux d’erreurs. Je vois une entrée comme Failed to optimize image: unknown reason mais elle ne me donne pas plus d’informations que ce qu’elle dit.
J’ai également essayé votre requête suggérée, j’obtiens un tas de publications en résultat, mais en visitant ces publications, elles contiennent un tas de miniatures provenant d’aperçus onebox. lorsque j’essaie d’ouvrir l’image dans un nouvel onglet sur ces miniatures, elles semblent se charger depuis le CDN.
Je m’attendrais à voir quelque chose comme ça pour 18 de ces 19 publications, peut-être même les 19 si le téléchargement échoué se trouve dans une publication avec plusieurs téléchargements.
Ce qui pourrait être plus facile, c’est d’extraire tous les noms de fichiers du résultat de la requête (par exemple, f8a2d9381889b8693db2777acac566bd7b134fa5.png) et de les rechercher dans S3. En théorie, il en manquera exactement un. Ignorez les dérivés, recherchez uniquement ceux qui ont /originals/ dans le chemin.
Un peu fastidieux mais ne devrait pas prendre trop de temps si cette requête n’a sélectionné que ces 19 publications.
S’il n’y a pas de solution évidente pour réussir le téléchargement, les options 1 ou 3 semblent être de bonnes pistes. Je laisserais probablement la 2 à Discourse, spécifiquement la tâche de nettoyage des téléchargements orphelins, dont l’intervalle est contrôlé par le réglage clean orphan uploads grace period hours (période de grâce de nettoyage des téléchargements orphelins en heures).
Il pourrait être judicieux de récupérer le fichier avant qu’il ne soit supprimé. S’il ne contient pas de données sensibles, il pourrait être utile pour tester pourquoi il ne peut pas être téléchargé pendant la migration.
Voici autre chose que vous pourriez essayer après avoir supprimé le fichier et terminé la migration (et après avoir téléchargé le fichier défaillant) : modifier à nouveau la publication pour remettre le fichier. Il serait intéressant de savoir si le téléchargement vers S3 échoue entièrement ou seulement pendant la tâche de migration.
Si vous êtes d’accord pour perdre ces 64 fichiers, ce que j’ai fait lorsque cette même tâche rake continuait d’échouer est de la modifier, et de la faire échouer uniquement s’il y a 100 erreurs au lieu d’une.
Essayé avec SKIP_FAILED=100 rake uploads:migrate_to_s3
=> 0 fichiers
Listage des fichiers S3
… .. => 81070 fichiers
Synchronisation des fichiers vers S3
Mise à jour des URL dans la base de données…
Suppression des anciennes images optimisées…
Signalement de tous les messages contenant des lightboxes pour un nouveau rendu…
54453 messages ont été signalés pour un nouveau rendu
53 messages ne sont pas remappés vers la nouvelle URL de téléchargement S3. La migration S3 a échoué pour la base de données ‘default’.
Je n’ai pas compris comment placer le fichier modifié sur mon script discourse
Ah, c’est dommage. Il y a l’autre suggestion de @Falco d’éditer la tâche rake - mais malheureusement, je ne sais pas comment faire, et je ne trouve aucune instruction lorsque je cherche.