Ce problème ressemble à un virus et se propage à davantage d’avatars ! Une observation étrange a été la suivante :
Dans Firefox, certains avatars sont affichés, alors qu’ils manquent dans Chrome. Cela ne signifie pas que Firefox n’a aucun avatar manquant. Il y a aussi des avatars manquants dans Firefox !
Dans le cas que j’examine, les images d’avatar manquantes ont été déplacées vers le dossier tombstone dans S3 après une mise à jour en ligne de commande et une mise à jour manuelle de PostgreSQL de la version 10 à la version 12. Je ne suis toujours pas certain de la raison exacte.
Trouver les uploads
@Jeremie_Leroy@Pad_Pors Si vous souhaitez vérifier si la même situation s’applique dans votre cas, voici comment j’ai recherché les avatars manquants dans mon dossier tombstone S3 :
J’ai obtenu le SHA1 (la chaîne de 16 caractères présente dans l’URL de l’upload) d’un avatar que je savais corrompu après la migration. Pour cela, j’ai extrait l’ID de l’upload depuis l’URL de l’avatar défectueux (c’est la première partie du nom du fichier ; par exemple, pour 6254_2.png, l’ID est 6254), puis j’ai utilisé cet ID pour retrouver le SHA1 correspondant dans un dump récent de la base de données. Si vous n’êtes pas à l’aise avec la ligne de commande, vous pouvez visualiser vos données dans un dump en utilisant une interface graphique PostgreSQL comme Postico 2.
J’ai effectué une recherche du SHA1 dans le dossier tombstone du bucket S3 concerné en utilisant l’outil en ligne de commande AWS CLI.
(vous devez remplacer <bucket_name> et <sha1> par les valeurs appropriées)
Si cela fonctionne, vous obtiendrez une liste de résultats ressemblant à ceci :
{
"Key": "tombstone/original/2X/d/d7b553ff276fca054c7090e859ef5339fd1f936e.jpg",
"LastModified": "2020-05-16T11:45:03+00:00",
"ETag": ## chaîne de lettres et de chiffres,
"Size": 64580,
"StorageClass": "STANDARD",
"Owner": {
"ID": ## chaîne de lettres et de chiffres
}
}
Notez que le 16/05 correspond à la date à laquelle j’ai effectué la mise à jour. Tous les avatars incorrectement marqués comme tombstones ont des horodatages autour de cette date. Je soupçonne que le problème a pris du temps à se manifester en production et qu’il est apparu de manière intermittente en raison de la mise en cache.
Récupération
À ma connaissance, UploadRecovery (et sa tâche rake associée) est spécifique aux uploads de publications et ne gère pas les avatars placés en tombstone.
Je travaille actuellement à l’ajout (au patch) d’une nouvelle méthode à UploadRecovery qui utilise recover_from_s3 pour récupérer les uploads d’avatars.
Si quelqu’un connaît une méthode plus simple pour récupérer des avatars incorrectement placés en tombstone dans S3, je suis tout ouïe.
C’est un peu délicat pour moi. Y a-t-il d’autres personnes dans notre situation ? Cela vaudrait-il la peine de travailler sur une mise à jour ? @sam@codinghorror
Merci @angus d’avoir partagé le chemin de vérification, mais nous n’utilisons plus AWS ni S3. En fait, si je ne me trompe pas, le problème a commencé après notre migration depuis AWS.
Je serais ravi si le problème était résolu, mais pour le moment, il est beaucoup plus simple pour moi de demander à ces quelques utilisateurs de réimporter leurs avatars, en espérant que le problème ne se propage pas aux nouveaux utilisateurs !
J’ai résolu ce problème avec succès sur le site que je gère en utilisant une version adaptée de la même logique qui récupère les images incorrectement marquées comme supprimées (tombstoned) dans les publications : discourse/lib/upload_recovery.rb at main · discourse/discourse · GitHub.
@Jeremie_Leroy Une partie des raisons pour lesquelles j’ai publié les étapes ci-dessus est qu’il existe diverses causes possibles d’absence d’avatars. Pour savoir si cela fonctionnera pour vous, vous devez d’abord confirmer qu’il y a des avatars incorrectement marqués comme supprimés, c’est-à-dire déterminer la cause du problème dans votre cas.
Je comprends également que réaliser cette analyse soit très difficile si vous n’êtes pas familier avec les aspects techniques de Discourse. J’ai intégré la solution que j’ai utilisée dans un plugin que vous pouvez tester sur votre propre site. Consultez les instructions ci-dessous.
@Pad_Pors Si vous êtes d’accord pour demander simplement aux utilisateurs de réimporter leurs avatars, je vous conseillerais de le faire plutôt que d’essayer cette correction.
Instructions
Veuillez noter que cette correction s’applique aux avatars manquants dans les cas suivants :
Les téléchargements sont stockés sur S3
Les avatars sont manquants car ils sont incorrectement marqués comme supprimés (tombstoned)
L’enregistrement du téléchargement de l’avatar existe toujours
Effectuez cette opération pendant une période de faible activité sur votre forum et réalisez d’abord une sauvegarde complète.
Installez ce plugin
Le plugin ajoute recover_avatars à UploadRecovery et utilise une version adaptée de la même méthode de restauration employée par la méthode principale recover pour récupérer les téléchargements manquants dans les publications.
Cela conservera une copie des avatars « récupérés » dans le dossier tombstone pour des raisons de redondance. Ces copies seront supprimées par le tâche en arrière-plan purge_deleted_uploads, qui s’exécute selon la période définie par le paramètre du site purge_deleted_uploads_grace_period_days.
Accédez à la console Rails
Pour utiliser la méthode, vous devez d’abord vous connecter en SSH à votre serveur, entrer dans l’instance Docker et démarrer une console Rails :
./launcher enter app
rails c
Effectuez un test
Pour voir quels téléchargements la méthode tentera de récupérer depuis le dossier tombstone, effectuez d’abord un test :
Cela vous donnera une liste de noms d’utilisateurs et de liens de fichiers S3. Ce sont les fichiers d’avatar que la méthode tentera de déplacer hors du dossier tombstone lors d’une exécution réelle :
Une fois la tâche terminée, vérifiez votre site en direct dans une nouvelle fenêtre de navigation privée (pour éviter les problèmes de mise en cache). Une fois terminé, assurez-vous de fermer la connexion SSH active vers votre serveur. Vous ne voulez pas entrer accidentellement une commande incorrecte dans la console Rails ouverte.