Digital Ocean Spaces n'implémente pas l'API AWS S3 pour la règle CORS

,

Je lutte toujours pour déplacer les uploads vers Spaces. Lorsque s3_cdn_url est défini, Discourse pointe vers le CDN S3 pour les ressources, mais elles n’y sont pas. J’ai essayé rake s3:upload_assets et j’ai obtenu :

root@shadrack-rbx:/var/www/discourse# rake s3:upload_assets                                                             \ninstalling CORS rule\nUploading: assets/vendor-3037640def3beef9cc83cef108868f2bac887cf141d032c6b7388c7879c19601.js\nOPTS: {:cache_control=>\"max-age=31556952, public, immutable\", :content_type=>\"application/ecmascript\", :acl=>\"public-read\", :tagging=>\"\"} # NOTE: Pfaffman added this debug line. . . \nrake aborted!\nAws::S3::Errors::InvalidArgument: \n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-core-3.46.1/lib/seahorse/client/plugins/raise_response_errors.rb:15:in `call'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-s3-1.30.1/lib/aws-sdk-s3/plugins/sse_cpk.rb:22:in `call'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-s3-1.30.1/lib/aws-sdk-s3/plugins/dualstack.rb:26:in `call'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-s3-1.30.1/lib/aws-sdk-s3/plugins/accelerate.rb:35:in `call'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-core-3.46.1/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:20:in `call'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-core-3.46.1/lib/aws-sdk-core/plugins/idempotency_token.rb:17:in `call'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-core-3.46.1/lib/aws-sdk-core/plugins/param_converter.rb:24:in `call'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-core-3.46.1/lib/aws-sdk-core/plugins/response_paging.rb:10:in `call'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-core-3.46.1/lib/seahorse/client/plugins/response_target.rb:23:in `call'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-core-3.46.1/lib/seahorse/client/request.rb:70:in `send_request'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-s3-1.30.1/lib/aws-sdk-s3/client.rb:5856:in `put_object'\n/var/www/discourse/vendor/bundle/ruby/2.5.0/gems/aws-sdk-s3-1.30.1/lib/aws-sdk-s3/object.rb:928:in `put'\n/var/www/discourse/lib/s3_helper.rb:44:in `upload'\n/var/www/discourse/lib/tasks/s3.rake:38:in `block in upload'\n/var/www/discourse/lib/tasks/s3.rake:37:in `open'\n/var/www/discourse/lib/tasks/s3.rake:37:in `upload'\n/var/www/discourse/lib/tasks/s3.rake:148:in `block (2 levels) in <top (required)>'\n/var/www/discourse/lib/tasks/s3.rake:147:in `each'\n/var/www/discourse/lib/tasks/s3.rake:147:in `block in <top (required)>'\n/usr/local/bin/bundle:23:in `load'\n/usr/local/bin/bundle:23:in `<main>'\nTasks: TOP => s3:upload_assets\n(See full trace by running task with --trace)\nroot@shadrack-rbx:/var/www/discourse# vi config/discourse.\ndiscourse.conf           discourse.config.sample  discourse.pill.sample    \nroot@shadrack-rbx:/var/www/discourse# vi config/discourse.conf\nroot@shadrack-rbx:/var/www/discourse# rails c\n```

Pour information, cette configuration permet d'uploader des images vers S3 sans problème.

Et, si cela fonctionnait, les ressources seraient-elles poussées vers S3 lors du bootstrap ? Je veux vraiment déplacer ce site vers S3 (73 Go d'images) pour passer à une autre configuration de serveur. Spaces est attrayant car j'ai des crédits de parrainage et un CDN gratuit. Mais peut-être devrais-je simplement abandonner et passer à AWS S3 ?

Why do you need to push assets to S3? Can’t they be served from a push CDN like normal? Uploads assets means JS files not uploads.

That’s what I thought, but what’s happening is that all the assets are linked to the S3 CDN url and they aren’t there. I’d assumed that they’d either be served by the CDN like normal (I have one site configured with regular CDN and it points to S3 cdn when that’s configured) or from local storage (I have another site configured with no regular CDN and when I have s3_cdn_url in global settings, all the assets are linked to the s3 CDN.

So, I either need to push assets to S3 or have Discourse not point to assets in S3. I don’t really care, but they need to be somewhere that they can be found, as without assets the whole site is hosed and I have to make changes in console.

Making sure you saw this @pfaffman because this topic makes very little sense the way it is phrased now.

Do you mean “uploads” as in “uploaded files”?

No, I really mean assets (uploads seem fine). It seems that when GlobalSettings.s3_cdn_url is defined, discourse expects assets (i.e., the javascript stuff) to be in the S3 CDN, so the site is broken because none of the assets are available.

It makes zero sense to me either. :frowning_face:

I just set SiteSettings.s3_cdn_url (not in GlobalSettings) and assets seem to still be coming from the server, not the CDN. So maybe it’s a bug with GlobalSettings.s3_cdn_url?

Yup. Re-setting the value in discourse.conf does this:

All those red things link to the CDN for the assets.

I turned it back on/off and defining it as a global makes assets link to the s3_cdn_url.

So I guess the thing to do is configure those values in a plugin and hide them from the UX that way.

Looks like spaces don’t implement the AWS S3 API for the CORS rule. That is a must have since assets can contain fonts, and those really need CORS.

Maybe work on a way to disable the rules insertion and took care of that manually?

@rishabh did this already with the tombstone rule to allow our S3 compatibility with more providers, so makes sense to expand on that.

So if I want to move this site to S3 maybe I should just give in and stick this on AWS S3 and then stick CloudFlare or KeyCDN in front of it?

No.

That means that if you want to use the GlobalSettings for S3 in the current state you will need to deal with the missing feature in the S3-like service in Digital Ocean, patching around it somehow.

You already have a workaround (use a normal site setting), and we know that we need a setting to disable the CORS rule (pr-welcome for that).

Sorry I’m dense. I’ve been working on this off and on for months.

Ah, so as long as I don’t use GlobalSettings it’ll work just fine? (Because GlobalSettings also wants assets to be in S3?)

Je ne sais pas si vous (ou quelqu’un d’autre) rencontrez encore des problèmes avec cela, ou si ce qui suit pourrait résoudre le problème, mais comme je suis tombé sur cela en dépannant mon propre problème, j’ai pensé le partager :

  • Si vous utilisez Digital Ocean Spaces pour le stockage S3, et
  • Vous avez des thèmes avec des polices téléchargées, par exemple WOFF, qui sont copiées vers le stockage S3, et
  • Vous rencontrez des erreurs CORS lors du chargement des polices sur votre site Discourse, alors –

Digital Ocean Spaces propose désormais des paramètres de configuration CORS sur le point de terminaison que vous utilisez pour le stockage S3. Définissez l’URL de votre site Discourse comme Origine, GET pour les méthodes autorisées, et une valeur raisonnable comme 86400 pour la durée.

Donc, la conclusion de tout ce sujet était une méprise.

J’ai passé une journée entière à tester la compatibilité de Discourse avec les offres de DO, et le problème CORS ici était un faux ami.

Le problème vient du fait que DO Spaces n’implémente pas l’en-tête tagging dans leur clone S3.

La correction pour la tâche upload_assets est assez simple et se trouve dans une branche.

Le souci, c’est que nous utilisons réellement tagging dans une autre tâche rake, donc si vous utilisez DO Spaces, vous ne pourrez jamais vraiment utiliser la tâche s3:expire_missing_assets. Ce qui peut être un compromis « acceptable » pour certains.

Je compte mettre à jour et créer de nouveaux guides à ce sujet la semaine prochaine.

Uggggh, pouvons-nous signaler cela à DO ? Pour qu’ils corrigent leur clone ?

Je rédige un rapport sur une grande expérience utilisant les services DO avec Discourse (comme le service Redis, le service PostgreSQL, le service Object Store, le service CDN), afin que nous puissions le présenter dans un document concis. J’ai déjà découvert un problème bien plus grave. Leur CDN clone S3 supprime l’en-tête Content-Encoding des fichiers, ce qui empêche de servir nos fichiers JavaScript compressés en GZip et Brotli, et cela casse tout.

Le meilleur résultat à long terme pour tous est que tous les clones AWS S3 soient réellement… précis ? Donc, si nous pouvons suivre et relancer les fournisseurs pour améliorer leurs clones, c’est la voie supérieure.

En effet.

Cela serait fantastique, mais je ne m’y attends pas vraiment.

D’un autre côté, ils ne peuvent pas réparer ce qu’ils ne savent pas être défectueux. Peut-être que cela leur donnera l’impulsion nécessaire.

J’ai pris contact avec Digital Ocean, et il semble qu’ils utilisent MinIO en interne. MinIO a pris en charge les étiquettes il y a un mois. Ils ajouteront le support dès le déploiement de cette nouvelle version.

Cela fonctionne maintenant.

Suivez simplement Utilisation du stockage objet pour les téléchargements (clones S3)