Définition des liens DISCOURSE_S3_CDN_URL vers des ressources dans l'URL CDN S3

Vous pouvez vérifier les variables que nous définissons ici : infra/modules/services/discourse/web.yml at master · debtcollective/infra · GitHub

Voici les variables que nous définissons concernant S3/CDN :

  • DISCOURSE_CDN_URL
  • DISCOURSE_S3_ACCESS_KEY_ID
  • DISCOURSE_S3_BACKUP_BUCKET
  • DISCOURSE_S3_CDN_URL
  • DISCOURSE_S3_REGION
  • DISCOURSE_S3_SECRET_ACCESS_KEY
  • DISCOURSE_S3_UPLOAD_BUCKET
  • USE_DB_S3_CONFIG: true

Je pense que DISCOURSE_S3_BUCKET a été déprécié au profit de DISCOURSE_S3_UPLOAD_BUCKET et DISCOURSE_S3_BACKUP_BUCKET. Vous devriez définir ces derniers à la place.

C’est ce que j’ai supposé, mais je n’avance pas tant que je ne définis pas à la fois DISCOURSE_S3_UPLOAD_BUCKET et DISCOURSE_S3_BUCKET. Comme vous pouvez le constater dans l’extrait de code ci-dessus, use_s3? cherche toujours s3_bucket et non s3_upload_bucket.

La définition de DISCOURSE_BACKUP_BUCKET ne résout pas le problème, autant que je puisse en juger.

Si je définis les deux variables d’environnement de bucket, je progresse d’un cran, mais je me heurte alors à un nouveau problème : Discourse ignore mon URL CDN S3 et tente de charger les ressources depuis mon chemin de base. Cela provoque des erreurs CSP, car la Politique de Sécurité du Contenu n’inclut que le chemin des ressources de mon CDN S3.

Il devrait s’agir de DISCOURSE_S3_BACKUP_BUCKET et non de DISCOURSE_BACKUP_BUCKET. À part cela, si vous définissez toutes les variables avec les deux distributions CloudFront, cela devrait fonctionner. Si vous consultez nos paramètres, vous verrez que nous ne définissons pas DISCOURSE_S3_BUCKET.

Je ne sais pas si un rebake est également nécessaire.

@Falco, pour autant que je m’en souvienne, ce qui rendait cela très contre-intuitif, c’est qu’il y a une différence de comportement entre la définition de DISCOURSE_S3_CDN_URL en tant que variable d’environnement ou paramètre global et sa configuration en tant que paramètre du site. Peut-être que c’est quelque chose sur lequel tu veux prêter attention dans ton howto.

Oui, désolé, c’était une faute de frappe dans mon message précédent. DISCOURSE_S3_BACKUP_BUCKET ne définit pas s3_bucket dans GlobalSetting pour moi. Je ne sais pas comment tu exécutes cette tâche Rake sans définir DISCOURSE_S3_BUCKET.

Je te remercie vraiment pour ton aide, au fait, et je comprends que ce n’est pas à toi de résoudre ce problème, alors merci.

Pas de souci, ce n’est pas un problème. J’ai oublié de mentionner que nous définissons également USE_DB_S3_CONFIG: true dans notre fichier app.yml. infra/modules/services/discourse/web.yml at master · debtcollective/infra · GitHub

Et je pense que vous avez raison, car cela modifie le comportement de la définition des buckets S3 (discourse/lib/tasks/s3.rake at 427d54b2b00fa94474c0522eaed750452c4e7f43 · discourse/discourse · GitHub), et il s’agit probablement d’un bug.

Vérifiez si ce réglage résout le problème pour vous.

Cher @eatcodetravel, merci pour ton excellent post.

J’essaie de configurer CloudFront comme toi.

Dois-je télécharger le dossier des ressources dans mon bucket S3 ou cela se fera-t-il automatiquement ?

Que se passera-t-il après une mise à jour de Discourse ? Devrai-je à nouveau télécharger le thème si cela ne se fait pas automatiquement ?

Merci.

Bien sûr.

def ensure_s3_configured!
  unless GlobalSetting.use_s3? || use_db_s3_config
    STDERR.puts "ERREUR : Assurez-vous que S3 est configuré dans config/discourse.conf ou dans les variables d'environnement"
    exit 1
  end
end

use_db_s3_config vous évite d’avoir à définir cette variable supplémentaire. Cela doit être un bug dans global_setting.rb, car je devrais pouvoir simplement définir DISCOURSE_S3_UPLOAD_BUCKET, sauf s’il existe une différence entre cela et DISCOURSE_S3_BUCKET. Cependant, je pense que vous avez raison : ce dernier devrait être déprécié.

Indépendamment d’un bug dans global_setting.rb, je constate toujours un problème où Discourse recherche les assets à leur emplacement habituel et non sur mon CDN S3, même si j’ai déclaré toutes mes variables et que DISCOURSE_ENABLE_S3_UPLOADS est défini sur true.

Il y a une tâche pour cela : bundle exec rake uploads:migrate_to_s3. Une fois vos buckets configurés, exécutez cette tâche pour déplacer les fichiers vers S3. S3/CDN a changé ces derniers mois et la documentation n’est pas à jour, alors assurez-vous de faire une sauvegarde et de vous préparer au cas où quelque chose tournerait mal.

Lorsque j’ai activé cela pour la première fois, nous avons connu une interruption de service pendant que nous résolions tous les problèmes.

Je suppose que c’est parce que vous n’avez pas défini DISCOURSE_CDN_URL. Nous l’avons configuré comme ceci dans notre fichier de configuration :

DISCOURSE_CDN_URL: 'https://d16zv78c963s69.cloudfront.net' # cela pointe vers le serveur
DISCOURSE_S3_CDN_URL: 'https://community-cdn-prod.debtcollective.org' # cela pointe vers le bucket S3

Les feuilles de style sont récupérées depuis le serveur, elles utilisent donc DISCOURSE_CDN_URL. Les fichiers JavaScript sont téléchargés dans le bucket S3 et utilisent DISCOURSE_S3_CDN_URL. @Falco m’a expliqué cela ici.

Oui, je l’ai vu. J’ai défini DISCOURSE_CDN_URL, mais je rencontre toujours le même problème. Cependant, je suis fatigué, alors peut-être que j’ai raté quelque chose en raison de toutes les manipulations. Je reprendrai cela demain. Merci pour votre aide.

Cet outil va-t-il télécharger les fichiers d’images et les ressources en tant que fichiers JS vers S3 ? Et dois-je utiliser une URL CloudFront ou S3 suffit-il ? Merci pour votre aide.

bundle exec rake uploads:migrate_to_s3 ne transférera que les pièces jointes vers S3 ; cette tâche doit être exécutée une seule fois. Une fois S3 activé, les nouveaux fichiers seront automatiquement enregistrés dans les buckets S3.

Pour transférer les ressources, vous devez utiliser bundle exec rake s3:upload_assets. Cette commande doit être exécutée après chaque reconstruction ou mise à niveau.

J’ai fait ce que vous avez mentionné et les téléchargements vers S3 (images, etc.) ont réussi, mais pour les assets, je reçois l’erreur suivante :

ERROR: Ensure S3 is configured in config/discourse.conf or environment vars

J’ai défini les deux :

DISCOURSE_CDN_URL: 'https://d16zv78c963s69.cloudfront.net' # cela pointe vers le serveur
DISCOURSE_S3_CDN_URL: 'https://community-cdn-prod.debtcollective.org' # cela pointe vers le bucket S3

Cela est probablement lié à USE_DB_S3_CONFIG: true. Essayez de définir cette variable pour voir si cela fonctionne.

Voici toutes les variables que j’ai définies concernant S3/CDN

Oui. Merci :slightly_smiling_face:. Cela a résolu le problème.

Il y a un problème intéressant : Discourse tente d’accéder aux fichiers d’actifs depuis un mauvais chemin. Il essaie d’accéder via le chemin brotli_asset, mais ce chemin n’existe pas dans le bucket S3.

De plus, il tente d’accéder aux fichiers JavaScript et aux feuilles de style depuis l’URL du CDN. Mais ces fichiers ne sont pas non plus dans le bucket.

@ufukayyildiz Je pense que toutes les réponses à vos problèmes se trouvent dans ce fil de discussion. Je viens littéralement de faire la même configuration.

En bref, vous devez vous assurer d’avoir téléchargé vos ressources une fois qu’elles ont été précompilées.

Attends,
je ne comprends pas une chose.

Pourquoi configurer ces données dans les variables d’environnement (ENV) ?

Je vais donner mon exemple.

En configurant les données dans le panneau d’administration vers S3, tout fonctionne correctement et tout est chargé sur S3. Je n’ai aucune configuration dans les variables d’environnement. Est-ce mauvais ? Est-ce nécessaire si tout fonctionne ?

Le deuxième exemple est différent car je ne peux pas migrer les anciennes données vers S3 (seules les nouvelles fonctionnent). Mais ici, entrer ces données dans le fichier app.yml (DISCOURSE_S3_ACCESS_KEY_ID: ‘key’, etc.) ne change rien et cela ne fonctionne toujours pas (c’est-à-dire

rake uploads:migrate_to_s3

ne fonctionne pas)

Pouvez-vous m’expliquer cela ?

Non, les variables d’environnement offrent un moyen supplémentaire de configurer ces éléments, par exemple avant d’avoir accès au panneau d’administration.