Migrate_to_s3 échoue

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 ?

1 « J'aime »

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/%'")
1 « J'aime »

Salut @Simon_Manning

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.

2 « J'aime »

J’ai trouvé le coupable, comment dois-je procéder ?

Ce qui me semble logique n’est peut-être pas la meilleure solution.
Voici les options qui s’offrent à moi :

  1. Supprimer la référence du fichier du post incriminé
  2. Supprimer le fichier du serveur
  3. Réattribuer le lien du fichier à quelque chose de générique

Ou peut-être que je réfléchis complètement à côté de la plaque ?

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.

J’ai eu la même erreur, sur 64 posts. Impossible de les trouver sur 80K fichiers…

Que se passerait-il si je supprimais les fichiers locaux (la plupart sont déjà migrés) ?

Je confirme que les fichiers sont migrés, mais j’ai obtenu la même erreur.

Des suggestions ? Les téléchargements sont sur s3 et fonctionnent bien, mais la tâche : migrer vers s3 échoue.

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.

Cela me conviendrait.
Que dois-je faire pour modifier la tâche ?

Vous pouvez d’abord essayer de l’exécuter avec : SKIP_FAILED=1 rake uploads:migrate_to_s3.

Si cela ne fonctionne pas, modifiez cette ligne ici et réessayez

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

J’ai peut-être mal compris, mais je pense que vous devez exécuter SKIP_FAILED=1 pour activer SKIP_FAILED, plutôt que de lui assigner un montant.

1 « J'aime »

Essayé avec cette commande. … idem
Résultat

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. :slightly_smiling_face:

J’espère que quelqu’un d’autre pourra aider ? :crossed_fingers:

1 « J'aime »

J’ai réussi à créer mon script.rb dans mon dossier /shared mais je ne peux pas l’exécuter.

D’autres suggestions ? @vulkanino J’ai remarqué que vous aviez un problème similaire