J’utilise la dernière version bêta et j’ai activé S3 pour gérer les fichiers téléchargés.
Les uploads dans les publications fonctionnent correctement (le fichier est téléchargé vers S3 et affiché dans la publication), mais je constate maintenant que la tentative de télécharger des photos de profil génère des erreurs « Accès refusé » dans l’interface. Rien n’apparaît dans le journal des erreurs administrateur.
Certains de mes premiers utilisateurs semblent avoir réussi à télécharger des images d’avatars, mais celles-ci sont stockées localement, par exemple en examinant le code source :
<img alt="" width="45" height="45" src="/user_avatar/example.com/jackie/90/29_2.png" class="avatar" title="titre de l'image" aria-label="Imagery/FIT">
Existe-t-il un moyen de migrer les images de profil vers S3 et de garantir que les nouvelles images puissent y être téléchargées ?
EDIT : j’aurais dû préciser que l’option de téléchargement sécurisé des médias est bien activée.
Avez-vous par hasard Cloudflare ? Je pense que les images de profil sont bien stockées sur S3, mais sont relayées via votre serveur. J’ai résolu un problème similaire à celui-ci (tous les avatars téléchargés apparaissant en blanc) en ajoutant l’adresse IP du serveur à la liste blanche dans Cloudflare.
Merci, mais non, je n’utilise pas de CDN — je me contente d’un S3 standard avec des médias sécurisés. Je ne sais pas trop comment vérifier si les requêtes sont proxyfiées, mais voici la sortie des en-têtes de curl :
Cela suggère qu’il n’y a pas de proxy, mais je ne suis pas assez expert pour en être certain…
Cette structure d’URL correspond à un avatar proxy, ce qui est déroutant (l’implémentation des URLs d’avatars sur Meta diffère de celle des instances Discourse standard). À partir de la sortie de curl, je ne peux pas vraiment déterminer s’il y a des informations qui excluent le fait que Discourse proxy les avatars (je ne suis pas expert).
D’après mon expérience passée avec ce sujet, si les images des publications sont téléchargées sur S3, alors les avatars le sont aussi, sauf si vous faites quelque chose de très personnalisé. Je n’ai jamais essayé le téléchargement sécurisé de médias ni l’utilisation de S3 sans CDN, donc ces éléments pourraient peut-être faire une différence significative.
Il serait bon de tester en téléchargeant un nouvel avatar et de vérifier si vous pouvez trouver le fichier dans votre stockage local ou dans le bucket S3.
Mon hypothèse serait que l’adresse IP du serveur doit être autorisée (whitelisted) auprès de S3. Je ne suis pas expert, j’espère donc que quelqu’un d’autre pourra intervenir.
Le problème est que les uploads S3 fonctionnent pour les publications, mais pas pour les uploads d’images d’avatar. Mon intuition est que les seuls utilisateurs qui ont des avatars sont ceux qui ont téléchargé des images avant la configuration de S3, mais je ne peux pas le confirmer.
J’ai rencontré un problème similaire : les images des messages s’affichaient, mais pas celles des profils. Les deux types d’images étaient bien téléchargés vers S3, mais il y avait un souci de visualisation (l’adresse IP du serveur était limitée/bloquée).
Je peux confirmer que lorsque j’essaie de télécharger un avatar, la barre de progression se met à jour et atteint 100 %, mais ce n’est qu’à ce moment-là que le message « Erreur : Accès refusé » s’affiche.
En examinant la console JavaScript, je reçois l’erreur suivante :
https://discourse.psy.plymouth.ac.uk/uploads.json?client_id=0a2569993a6b43d6b5f8c60fdd2c913e
Échec du chargement de la ressource : le serveur a répondu avec un statut 422 ()
Si je suis cette URL :
{"errors":["L'URL ou la ressource demandée est introuvable."],"error_type":"not_found"}
En vérifiant le bucket S3, rien n’a été transféré dans le dossier « Originals ».
Cela contraste avec la situation lors du téléchargement d’une image dans un message : tout fonctionne alors correctement, l’image apparaît bien dans le bucket S3 et est également générée en miniature et optimisée.
Le statut HTTP 422 correspond apparemment à « Unprocessable Entity ». Cela suggère que Discourse rejette le téléchargement pour une raison quelconque, mais cela pourrait aussi être autre chose — je pense que 422 signifie essentiellement « la requête a été correctement formée, mais il y a une erreur dans la requête ».
L’image que vous essayez de télécharger est-elle d’un type inhabituel ou peut-être d’une taille énorme ?
Avez-vous essayé d’inclure ce fichier image exact dans un message ?
L’avatar (par défaut) est redimensionné en plusieurs tailles différentes, ce qui pourrait être la cause de l’échec pour une raison quelconque, par exemple en atteignant une limite de mémoire si l’image est gigantesque. Ce n’est pour l’instant qu’une hypothèse.
Je ne pense pas qu’il soit normal de recevoir un 422 de la part de S3, et ce code n’est pas répertorié dans les réponses d’erreur de leur référence d’API. Je pense donc que le problème se produit dans Discourse avant même qu’une tentative de téléchargement vers S3 ne soit effectuée.
Cela semble définitivement lié à la gestion des images d’avatars. Je viens de réessayer avec la même image (en utilisant cette fois le client mobile iOS) : l’upload fonctionne correctement dans un message, mais le même message d’erreur « accès refusé » apparaît lorsque j’utilise la même image comme avatar.
Quelqu’un d’autre utilisant S3 avec des médias sécurisés peut-il reproduire l’erreur ? Serait-ce lié aux permissions du bucket, étant donné que l’upload pour un message fonctionne ?