Une nouvelle ère pour les téléversements de fichiers dans Discourse

Vous avez peut-être remarqué au cours des derniers mois de nombreux commits liés aux téléchargements dans le cœur de Discourse. Cela fait partie d’un effort global au sein du cœur pour remplacer les utilisations de jQuery file upload de notre base de code, dans le cadre d’un effort global encore plus large pour remplacer les utilisations de jQuery lui-même de notre base de code. jQuery file uploader est un très vieux projet, et fait partie du cœur de Discourse depuis presque le début. Je pense l’avoir utilisé pendant toute ma carrière dans d’autres projets également. Mais il est temps de retirer le bon vieux fiable :

Nous avons remplacé jQuery file upload (et remplacerons bientôt aussi une autre bibliothèque, resumable.js) par une bibliothèque appelée Uppy. Il s’agit d’une bibliothèque de téléchargement beaucoup plus moderne, facilement extensible avec des plugins et capable de gérer tous les différents flux de travail que nous lui imposons. Fait important, cela nous permet d’effectuer des téléchargements multipartites directs vers S3 depuis le client Discourse, plutôt que d’avoir à envoyer de gros fichiers via notre API.

Le compositeur utilise maintenant Uppy pour tous les téléchargements, et de nombreux autres endroits de l’application l’utilisent (téléchargements d’avatars, téléchargements d’arrière-plans de profil, etc.). Les derniers récalcitrants disparaîtront dans les prochaines semaines. Ce devrait être un changement largement invisible pour la plupart des utilisateurs, mais les auteurs de plugins et de composants de thème devront apporter quelques modifications.

API des plugins

Préprocesseurs

Tous les préprocesseurs de téléchargement doivent maintenant être écrits comme un plugin Uppy. Ces plugins sont assez simples à écrire et utilisent un flux de travail simple basé sur les promesses. Un préprocesseur de téléchargement peut modifier un fichier ou y ajouter des métadonnées avant qu’Uppy ne le télécharge vers S3 ou vers le point de terminaison /uploads.json. Nous avons déjà plusieurs préprocesseurs dans le cœur que vous pouvez utiliser comme référence lorsque vous écrivez les vôtres :

Les préprocesseurs de téléchargement pour le compositeur sont enregistrés via api.addComposerUploadPreProcessor en utilisant l’API des plugins :

Gestionnaires de téléchargement

Les gestionnaires de téléchargement ne sont pas écrits comme des plugins Uppy ; ils fonctionnent toujours comme ils l’ont toujours fait avec une modification mineure. Désormais, lorsqu’un fichier correspond à une extension enregistrée auprès d’un gestionnaire de téléchargement, tous les fichiers correspondants seront envoyés en même temps. Auparavant, un seul fichier à la fois était envoyé au gestionnaire de téléchargement, et un tableau est envoyé maintenant :

Les fichiers gérés par un gestionnaire de téléchargement ne seront pas traités davantage dans le pipeline de téléchargement Uppy. Les préprocesseurs sont exécutés avant l’invocation des gestionnaires de téléchargement.

Téléchargements directs multipartites S3

Plus tôt, j’ai mentionné que notre utilisation d’Uppy nous permet également d’effectuer des téléchargements multipartites directs vers S3 depuis l’interface utilisateur. Pour activer cette fonctionnalité, vous devez définir le paramètre de site enable_direct_s3_uploads sur true.

Si vous êtes hébergé chez nous, les autorisations S3 pertinentes sont déjà appliquées à votre bucket. Cependant, si vous auto-hébergez, plusieurs autorisations et règles CORS doivent être configurées sur votre bucket pour que cela fonctionne.

Pour les règles CORS, il vous suffit d’exécuter la tâche rake s3:ensure_cors_rules avec rake s3:ensure_cors_rules. Elle ajoutera les règles suivantes à votre bucket tant que vous disposez des autorisations S3:GetBucketCors et S3:PutBucketCors activées pour les clés d’accès et secrètes que vous avez configurées pour vos identifiants S3 sur votre instance Discourse.

{
  "AllowedHeaders": [
    "Authorization",
    "Content-Disposition",
    "Content-Type"
  ],
  "AllowedMethods": [
    "GET",
    "HEAD",
    "PUT"
  ],
  "AllowedOrigins": [
    "*"
  ],
  "ExposeHeaders": [
    "ETag"
  ],
  "MaxAgeSeconds": 3000
}

Pour les autorisations, vous devrez avoir les autorisations suivantes activées pour les clés d’accès et secrètes que vous avez configurées pour vos identifiants S3 sur votre instance Discourse.

{
    "Sid": "YourSid",
    "Effect": "Allow",
    "Action": [
        "s3:PutObjectVersionAcl",
        "s3:PutObjectAcl",
        "s3:PutObject",
        "s3:GetObjectAcl",
        "s3:GetObject",
        "s3:DeleteObject",
        "s3:CreateMultipartUpload",
        "s3:CompleteMultipartUpload",
        "s3:AbortMultipartUpload"
    ],
    "Resource": [
        "YOUR_RESOURCE"
    ]
}

Ce processus a pris plusieurs longs mois et nous n’avons pas encore terminé ! Je publierai dans ce sujet lorsque nous serons sur le point de supprimer complètement jQuery file uploader et resumable.js du cœur de Discourse. Faites-moi savoir si vous avez des questions sur ce que j’ai posté ici !

49 « J'aime »

5 messages ont été déplacées vers un nouveau sujet : Uppy ne fonctionne pas sur Firefox 68

itsgoneitsdone

Avec ces deux commits, jQuery file uploader et resumable.js ne font plus partie du cœur de Discourse :

J’ai fait de mon mieux pour supprimer toutes les références à cela et à notre ancien UploadMixin dans tous les plugins que nous connaissons, mais il peut y en avoir que j’ai manqués ou dont j’ignore l’existence. N’ayez crainte, le processus de migration est facile. 99 % des cas d’utilisation peuvent simplement utiliser notre nouveau UppyUploadMixin comme remplacement direct avec des changements très minimes nécessaires. Pour un exemple, regardez ici :

Pour les 1 % restants, vous pouvez créer une instance d’Uppy et vous connecter directement aux événements. Pour un exemple, regardez ici :

J’ai également couvert les changements de plugins dans l’OP de ce sujet. Il nous reste encore quelques semaines avant notre prochaine version, donc si quelqu’un rencontre des problèmes, veuillez les signaler ici. Ce fut une aventure mouvementée ! :roller_coaster:

14 « J'aime »

Par ailleurs, la documentation de l’API a été mise à jour avec les nouveaux points d’accès Upload. Rendez-vous sur Discourse API Docs pour voir.

(cc @mattdm, ceci pourrait vous intéresser)

6 « J'aime »

Après avoir activé le téléchargement direct sur S3, nous recevons des rapports d’utilisateurs en Chine qui ne parviennent pas à télécharger d’images — le téléchargement reste bloqué à 0 % et expire.

La première idée pourrait être que S3 est bloqué en Chine, mais nous savons pertinemment que ce n’est pas le cas — du moins pas entièrement : nos utilisateurs en Chine peuvent voir les images stockées sur S3 sans problème (le bucket est dans la région eu-central-1 dans notre cas). Mais, d’une manière ou d’une autre, seul le téléchargement ne semble pas fonctionner.

Il est difficile de déboguer cela sans être derrière le GFW, mais certains de nos utilisateurs en Chine ont mentionné qu’une différence peut-être pertinente semble être que les images sont chargées en utilisant le point de terminaison double pile, mais le téléchargement utilise le point de terminaison régulier (IPv4 uniquement) (bucket-name.s3.dualstack.eu-central-1.amazonaws.com contre bucket-name.s3.eu-central-1.amazonaws.com). D’après certains tests, nous constatons que c’est effectivement le cas, mais je ne suis pas sûr si c’est intentionnel ou requis pour le téléchargement.

Plus révélateur peut-être, certains ont signalé qu’en ajoutant une IP résolue à partir du nom d’hôte double pile à leur fichier hosts (pour le nom d’hôte non double pile), le problème était entièrement résolu et ils ont pu télécharger avec cette seule modification.

Je ne sais pas si l’équipe Discourse a quelqu’un basé en Chine qui pourrait aider à mieux déboguer cela ?

4 « J'aime »

Un message a été scindé dans un nouveau sujet : Error while configuring S3: actions do not exist