Configurer un fournisseur de stockage d'objets compatible S3 pour les téléchargements

J’ai dû mettre cela en pause pour l’instant, car il semblait que cela allait fonctionner, mais il y a quelque chose d’étrange qui se passe avec R2 en termes de codage de contenu avec les actifs, soit lors du téléchargement et de la non-définition de l’en-tête, soit autre chose. Cela échoue avec un message « Jeton invalide ou inattendu » étant donné l’actif gz de quelque chose comme browser-detect-7af298cd000a967d2bdc01b04807eda2924a388584ea38ad84919b726283c2ed.gz.js. Le rake s3:upload_assets semble fonctionner, mais les fichiers ne sont pas lus correctement du côté du navigateur.

Je ne comprends pas vraiment pourquoi avec AWS S3, il est acceptable d’utiliser l’URL du serveur local pour les actifs (ils n’existent pas dans notre bucket S3 existant pour les téléchargements), mais pour R2, il veut utiliser DISCOURSE_S3_CDN_URL uniquement pour les actifs. Si je pouvais forcer les actifs à provenir de l’URL du serveur, tout cela fonctionnerait probablement.

EDIT : En discutant sur le CF, cela semble être le problème, et à partir d’aujourd’hui, c’est pourquoi R2 ne peut pas être utilisé avec Discourse sans quelques modifications. Je pourrais créer un script dans l’étape post hook pour supprimer les actifs gz, mais je pense que je suis déjà « hors de la voie » assez loin pour une journée :

Les fichiers que vous compressez en gzip ne sont actuellement pas correctement gérés par R2. Vous devez télécharger des fichiers non compressés. Cloudflare a une compression transparente, ils choisissent l’identité, le gzip ou le Brotli en fonction de ce que le client peut gérer. C’est une différence par rapport à S3.

2 « J'aime »

Excellent travail ! Et c’est un message clair de Cloudflare expliquant pourquoi cela ne fonctionnera pas. Merci beaucoup. Je vais copier cela dans le message initial bientôt.

2 « J'aime »

Merci encore ! J’ai mis à jour le message initial :

3 « J'aime »

Merci d’avoir préparé ce guide ! J’ai eu quelques succès en utilisant Minio.

Pour tous ceux qui essaient de le configurer localement avec Docker Compose, vous pouvez dire à Docker d’ajouter un alias d’hôte afin qu’il fonctionne comme un sous-domaine, comme ceci :

  minio:
    image: minio/minio
    command: server --console-address :9001 /data
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - ./data/minio:/data
    environment:
      MINIO_DOMAIN: minio.mydomain.com
    networks:
      default:
        aliases:
          - assets.minio.mydomain.com

Dans ce cas, vous définiriez DISCOURSE_S3_ENDPOINT=http://minio.mydomain.com:9000, DISCOURSE_S3_CDN_URL=//assets.minio.mydomain.com:9000, et définiriez votre fichier local /etc/hosts/ pour pointer le sous-domaine vers localhost.

Cela fonctionne la plupart du temps, mais j’ai remarqué que Discourse ne peut pas télécharger de fichiers depuis une adresse qui n’a pas le port 80 ou 443, donc le téléchargement d’une image fonctionnera, mais lorsqu’il tentera de la télécharger pour la redimensionner, cela échouera.

Je pensais qu’il serait bon de le mentionner dans la section Minio ou dans le résumé, que le DISCOURSE_S3_CDN_URL doit être sur le port 80 ou 443.

4 « J'aime »

Salut @Falco - Est-ce que cela fait référence à la façon dont l’en-tête Content-Encoding: gzip fonctionne avec leur CDN Spaces ? Cela ressemble à Cloudflare R2, dans le sens où l’emplacement de l’actif est le même que le CDN de téléchargement, donc le gzip casse ? Voici ce qui se passe avec R2 aujourd’hui.

Il pourrait être intéressant d’envisager un interrupteur pour ce comportement, c’est-à-dire servir les actifs depuis l’origine plutôt que toujours DISCOURSE_S3_CDN_URL ? Je serais heureux d’aller voir comment faire cela, si cela pouvait être considéré comme un changement de configuration potentiel.

3 « J'aime »

C’est ce qui devrait se passer si vous omettez la configuration de DISCOURSE_S3_CDN_URL, mais comme il s’agit d’un cas particulier étrange et d’une erreur potentiellement coûteuse, ce n’est pas une configuration courante.

3 « J'aime »

Oui, je comprends. Une nouvelle entrée booléenne GlobalSetting S3_ORIGIN_ASSETS (ou S3_BROKEN_PROXY_FUDGE :slight_smile:) à peu près ici, un peu comme la façon dont les scripts de test ne sont pas compressés permettraient à Digital Ocean Spaces et à Cloudflare R2 de fonctionner avec Discourse dès la sortie de la boîte, ce qui est une belle fonctionnalité ajoutée pour peu d’effort ? Peut-être à considérer pour l’avenir de toute façon. :heart_eyes_cat:

4 « J'aime »

Oh, j’ai vu dans les notes de version 3.0.beta qu’il y a quelque chose de nouveau. Je vais essayer, à moins que je ne comprenne mal à quoi cela sert ? Cela pourrait permettre d’utiliser Cloudflare R2 et Digital Ocean Spaces avec leurs CDN en faisant ces trucs bizarres avec gzip.

1 « J'aime »

Non, ce n’est pas pertinent.

3 « J'aime »

Le paramètre m’a permis de spécifier le site local comme origine, pour contourner la nécessité que les ressources js soient sur le site S3 (dans ce cas Cloudflare ou Digital Ocean Spaces avec CDN activé). Merci à @david pour le changement, même si ce n’était pas l’intention.

4 « J'aime »

Entrez-vous l’URL du site pour le CDN d’assets ? Malin !

1 « J'aime »

Salut tout le monde, quelqu’un sait si cela pourrait être lié à Discourse ?

Voici le XML des fichiers que nous avons essayé de télécharger vers notre stockage S3 précédemment « fonctionnel avec Discourse » :

<Error>
<Code>InvalidArgument</Code>
<Message>
Les requêtes spécifiant le chiffrement côté serveur avec des clés gérées par AWS KMS nécessitent la version 4 de la signature AWS.
</Message>
<ArgumentName>Authorization</ArgumentName>
<ArgumentValue>null</ArgumentValue>
<RequestId>ID</RequestId>
<HostId>
ID
</HostId>
</Error>
1 « J'aime »

Utilisez-vous AWS ? Autre chose ?

Ce compartiment est-il configuré avec le chiffrement côté serveur ?

Il se pourrait qu’une bibliothèque ait été mise à jour et se comporte différemment.

2 « J'aime »

Merci, j’ai revérifié et cela semble fonctionner avec la configuration automatique, mais pas en gérant mes propres clés depuis la gestion S3.

Savez-vous si cela est possible dans Discourse ?

1 « J'aime »

3 messages ont été déplacées vers un nouveau sujet : Pourquoi exécuter UpdatePostUploadsSecureStatus même lorsque les téléchargements sécurisés sont désactivés ?

cela semble avoir été corrigé récemment.
Dans le changelog du 16/03/2023, il est mentionné une correction de bug pour la gestion des fichiers gzip.

Nous exécutons actuellement notre forum discourse sur discourse.aosus.org avec R2 (nous n’avons pas encore exécuté migrate_to_s3), et cela semble fonctionner correctement ! aucun problème notable jusqu’à présent.

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: "us-east-1" # alias vers auto
  #DISCOURSE_S3_INSTALL_CORS_RULE: true # cela devrait être pris en charge
  DISCOURSE_S3_ENDPOINT: S3_API_URL
  DISCOURSE_S3_ACCESS_KEY_ID: xxx
  DISCOURSE_S3_SECRET_ACCESS_KEY: xxxx
  DISCOURSE_S3_CDN_URL: votre url cdn
  DISCOURSE_S3_BUCKET: NOM_DU_BUCKET

y a-t-il un moyen de spécifier un hôte séparé pour les sauvegardes ? ce serait formidable si possible de laisser R2 uniquement pour les choses liées au CDN.

2 « J'aime »

Il n’y en a pas. Il me semble peu probable que cela change.

1 « J'aime »

23 messages ont été déplacés vers un nouveau sujet : Problèmes de configuration du stockage d’objets

Il est étrange que les paramètres dans ENV ne se reflètent pas dans l’interface d’administration. Y a-t-il une substitution ? Les nouveaux paramètres de S3 dans l’interface d’administration remplaceront-ils ceux de l’environnement ?

1 « J'aime »

Oui. Les variables d’environnement remplacent les valeurs de la base de données et sont masquées de l’interface utilisateur.

4 « J'aime »