Ce sujet explique comment configurer certains fournisseurs de stockage d’objets compatibles S3 courants (clones S3). Consultez Set up file and image uploads to S3 pour plus de détails sur la configuration d’Amazon AWS S3, qui est officiellement prise en charge et utilisée en interne par Discourse pour nos services d’hébergement.
| Fournisseur | Nom du service | Compatible avec Discourse ? |
|---|---|---|
| Amazon AWS | S3 | Oui |
| Digital Ocean | Spaces | Oui |
| Linode | Object Storage | Oui |
| Google Cloud | Storage | Oui |
| Scaleway | Object Storage | Oui |
| Vultr | Object Storage | Oui |
| BackBlaze | Cloud Storage | Oui* |
| Auto-hébergé | MinIO | Oui |
| Azure Blob Storage | Flexify.IO | Oui |
| Oracle Cloud | Object Storage | Non [1] |
| Wasabi | Object Storage | Peut-être |
| Cloudflare | R2 | Oui |
| Contabo | Object Storage | Non |
Si vous avez fait fonctionner un autre service, veuillez l’ajouter à ce wiki.
Configuration
Pour stocker les assets statiques de Discourse dans votre stockage d’objets, ajoutez cette configuration dans votre fichier app.yml sous la section hooks :
after_assets_precompile:
- exec:
cd: $home
cmd:
- sudo -E -u discourse bundle exec rake s3:upload_assets
- sudo -E -u discourse bundle exec rake s3:expire_missing_assets
Lors de l’utilisation d’un stockage d’objets, vous avez également besoin d’un CDN pour servir le contenu stocké dans le bucket. J’ai utilisé le CDN StackPath lors de mes tests ; en dehors de la nécessité de définir Dynamic Caching By Header: Accept-Encoding dans leur configuration, cela fonctionne correctement.
DISCOURSE_CDN_URL est un CDN pointant vers votre nom d’hôte Discourse et mettant en cache les requêtes. Il sera principalement utilisé pour les assets téléchargeables : CSS et autres assets de thème.
DISCOURSE_S3_CDN_URL est un CDN pointant vers votre bucket de stockage d’objets et mettant en cache les requêtes. Il sera principalement utilisé pour les assets téléversables : JS, images et uploads d’utilisateurs.
Nous recommandons que ces deux valeurs soient différentes et que les administrateurs définissent les deux.
Ne pas utiliser de CDN (ou entrer l’URL du bucket comme URL CDN) est susceptible de causer des problèmes et n’est pas pris en charge.
Dans les exemples suivants, https://falcoland-files-cdn.falco.dev est un CDN configuré pour servir les fichiers du bucket. Le nom du bucket a été défini sur falcoland-files dans mes exemples.
Il est recommandé de configurer ces paramètres dans les variables d’environnement de votre fichier app.yml, car c’est ainsi que CDCK le fait dans son infrastructure, ce qui garantit une bonne stabilité. De plus, la tâche de téléversement des assets se produit après la compilation des assets, qui a lieu lors d’une reconstruction. Si vous souhaitez lancer un Discourse fonctionnant correctement avec un stockage d’objets dès le début, vous devez définir les variables d’environnement afin que les assets soient téléversés avant le démarrage du site.
Choisissez votre fournisseur dans la liste ci-dessous et ajoutez ces paramètres à la section env de votre fichier app.yml, en ajustant les valeurs en conséquence :
AWS S3
Ce que nous prenons officiellement en charge et utilisons en interne. Leur offre CDN Cloudfront fonctionne également pour servir les fichiers du bucket. Consultez Set up file and image uploads to S3 pour savoir comment configurer correctement les permissions.
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: us-west-1
DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
DISCOURSE_S3_CDN_URL: https://falcoland-files-cdn.falco.dev
DISCOURSE_S3_BUCKET: falcoland-files
DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backups
DISCOURSE_BACKUP_LOCATION: s3
Digital Ocean Spaces
L’offre de DO est bonne et fonctionne immédiatement. Il est acceptable d’activer « Restrict File Listing ». Le seul problème est que leur offre CDN est carrément cassée, vous devez donc utiliser un CDN différent pour les fichiers. De plus, vous ne devez pas installer la règle CORS, car elle est réinstallée à chaque reconstruction.
Exemple de configuration :
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: whatever
DISCOURSE_S3_ENDPOINT: https://nyc3.digitaloceanspaces.com
DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
DISCOURSE_S3_CDN_URL: https://falcoland-files-cdn.falco.dev
DISCOURSE_S3_BUCKET: falcoland-files
DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backups
DISCOURSE_BACKUP_LOCATION: s3
DISCOURSE_S3_INSTALL_CORS_RULE: false
Linode Object Storage
Un paramètre de configuration supplémentaire, HTTP_CONTINUE_TIMEOUT, est requis pour Linode.
Exemple de configuration :
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: us-east-1
DISCOURSE_S3_HTTP_CONTINUE_TIMEOUT: 0
DISCOURSE_S3_ENDPOINT: https://us-east-1.linodeobjects.com
DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
DISCOURSE_S3_CDN_URL: https://falcoland-files-cdn.falco.dev
DISCOURSE_S3_BUCKET: falcoland-files
DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backup
DISCOURSE_BACKUP_LOCATION: s3
Google Cloud Platform Storage
La liste des fichiers est cassée, vous devez donc ajouter une variable d’environnement supplémentaire pour sauter cette étape afin que les assets fonctionnent. Ignorez également CORS et configurez-le manuellement.
Puisque vous ne pouvez pas lister les fichiers, vous ne pourrez pas lister les sauvegardes, et les sauvegardes automatiques échoueront. Nous ne recommandons donc pas son utilisation pour les sauvegardes. Cependant, certains suggèrent que si vous changez le rôle de Storage Legacy Object Owner à Storage Legacy Bucket Owner, les sauvegardes fonctionnent correctement. Consultez ce sujet pour une discussion spécifique à Google Cloud.
Il existe un plugin tiers pour améliorer l’intégration à Discourse GCS Helper.
Exemple de configuration :
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: us-east1
DISCOURSE_S3_INSTALL_CORS_RULE: false
FORCE_S3_UPLOADS: 1
DISCOURSE_S3_ENDPOINT: https://storage.googleapis.com
DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
DISCOURSE_S3_CDN_URL: https://falcoland-files-cdn.falco.dev
DISCOURSE_S3_BUCKET: falcoland-files
#DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backup
#DISCOURSE_BACKUP_LOCATION: s3
Scaleway Object Storage
L’offre de Scaleway est également très bonne, et tout fonctionne bien dans l’ensemble.
Les téléversements multipart de Scaleway ne prennent en charge qu’un maximum de 1 000 parties. Cela ne correspond pas à Amazon S3, qui prend en charge un maximum de 10 000 parties. Pour les instances plus grandes, cela entraînera l’échec des sauvegardes de Discourse et le téléversement incomplet devra peut-être être supprimé manuellement avant de réessayer. Pour les petites instances, ce n’est pas un problème. Scaleway semble assez ouvert aux retours, donc si vous souhaitez que cette limite soit modifiée, vous devriez les contacter.
Notez que pour le paramètre DISCOURSE_S3_ENDPOINT, Discourse utilise le point de terminaison de toute la région : https://s3.{region}.scw.cloud. Le « Bucket endpoint » trouvé dans votre tableau de bord Scaleway est sous la forme https://{bucketName}.s3.{region}.scw.cloud. Omettez le sous-domaine du nom du bucket pour éviter les erreurs de connexion.
Exemple de configuration :
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: fr-par
DISCOURSE_S3_ENDPOINT: https://s3.fr-par.scw.cloud
DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
DISCOURSE_S3_CDN_URL: https://falcoland-files-cdn.falco.dev
DISCOURSE_S3_BUCKET: falcoland-files
DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backups
DISCOURSE_BACKUP_LOCATION: s3
Vultr Object Storage
Un paramètre de configuration supplémentaire, HTTP_CONTINUE_TIMEOUT, est requis pour Vultr.
Exemple de configuration :
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: whatever
DISCOURSE_S3_HTTP_CONTINUE_TIMEOUT: 0
DISCOURSE_S3_ENDPOINT: https://ewr1.vultrobjects.com
DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
DISCOURSE_S3_CDN_URL: https://falcoland-files-cdn.falco.dev
DISCOURSE_S3_BUCKET: falcoland-files
DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backup
DISCOURSE_BACKUP_LOCATION: s3
Backblaze B2 Cloud Storage
Vous devez ignorer CORS et le configurer manuellement.
Il existe des rapports indiquant que la fonction « clean up orphan uploads » ne fonctionne pas correctement avec BackBlaze. Vous devez modifier les règles de cycle de vie de votre bucket pour que le nettoyage des orphelins fonctionne.
Exemple de configuration :
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: "us-west-002"
DISCOURSE_S3_INSTALL_CORS_RULE: false
DISCOURSE_S3_CONFIGURE_TOMBSTONE_POLICY: false
DISCOURSE_S3_ENDPOINT: https://s3.us-west-002.backblazeb2.com
DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
DISCOURSE_S3_CDN_URL: https://falcoland-files-cdn.falco.dev
DISCOURSE_S3_BUCKET: falcoland-files
DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backup
DISCOURSE_BACKUP_LOCATION: s3
Note : Lors de la migration initiale vers B2, vous pourriez atteindre la limite gratuite quotidienne de 2 500 transactions de classe C. Vous devrez ajouter un moyen de paiement pour lever ces limites.
MinIO Storage Server
Il y a quelques précautions et exigences que vous devez vérifier avant d’utiliser un serveur de stockage MinIO comme alternative à S3 :
- Vous disposez d’une instance de serveur MinIO entièrement configurée.
- La prise en charge des domaines est activée dans la configuration de MinIO pour les URL de buckets basées sur le domaine. Ceci est une exigence de configuration obligatoire pour MinIO et Discourse, car MinIO prend encore en charge les styles « path » S3 hérités qui ne sont plus pris en charge par Discourse.
- Vous avez configuré correctement le DNS pour MinIO afin que les sous-domaines de bucket résolvent correctement vers le serveur MinIO et que le serveur MinIO soit configuré avec un domaine de base (dans ce cas,
minio.example.com). - Le bucket
discourse-dataexiste sur le serveur MinIO et possède une stratégie « public » définie dessus. - Votre URL CDN S3 pointe vers un CDN correctement configuré servant les fichiers du bucket et mettant en cache les requêtes, comme indiqué précédemment dans ce document.
- Vos CDN sont configurés pour utiliser réellement un en-tête « Host » de l’URL S3 principale – par exemple,
discourse-data.minio.example.comlorsqu’il récupère des données – sinon cela peut causer des problèmes CORB.
En supposant que les précautions et prérequis ci-dessus sont respectés, un exemple de configuration serait le suivant :
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: anything
DISCOURSE_S3_ENDPOINT: https://minio.example.com
DISCOURSE_S3_ACCESS_KEY_ID: myaccesskey
DISCOURSE_S3_SECRET_ACCESS_KEY: mysecretkey
DISCOURSE_S3_CDN_URL: https://discourse-data-cdn.example.com
DISCOURSE_S3_BUCKET: discourse-data
DISCOURSE_S3_BACKUP_BUCKET: discourse-backups
DISCOURSE_BACKUP_LOCATION: s3
DISCOURSE_S3_INSTALL_CORS_RULE: false
CORS restera activé sur MinIO même si la règle n’est pas installée par le rebuild d’application – par défaut, il semble que CORS soit activé sur toutes les verbes HTTP dans MinIO, et MinIO ne prend pas en charge BucketCORS (API S3) en conséquence.
Azure Blob Storage avec Flexify.IO
Azure Blob Storage n’est pas un service compatible S3, il ne peut donc pas être utilisé avec Discourse. Il existe un plugin, mais il est cassé.
Le moyen le plus simple d’exposer une interface compatible S3 pour Azure Blob Storage consiste à ajouter un serveur Flexify.IO qui traduit le protocole Azure Storage en S3.
À la date de rédaction de ce document, le service est gratuit sur Azure, et vous n’avez besoin que d’une instance VM très basique (peu coûteuse) pour commencer à l’exécuter. Cela nécessite cependant une configuration.
- Dans le portail Azure, créez une nouvelle ressource
Flexify.IO - Amazon S3 API for Azure Blob Storage. - Pour une utilisation légère, la configuration VM minimale semble fonctionner parfaitement. Vous pouvez accepter la plupart des configurations par défaut. N’oubliez pas de sauvegarder le fichier de clé PEM lorsque vous créez la VM.
- Accédez au lien de la VM Flexify.IO et entrez dans le système. Suivez les instructions en configurant le fournisseur de données Azure Blob Storage et le point de terminaison S3 généré. Assurez-vous que le paramètre de configuration du point de terminaison
Public read access to all objects in virtual bucketsest activé. Copiez l’URL et les clés du point de terminaison S3. - Appuyez sur New Virtual Bucket et créez un bucket virtuel. Il peut avoir le même nom que votre conteneur Azure Blob Storage ou un nom différent. Liez tout conteneur(s) à fusionner dans ce bucket virtuel. Ce bucket virtuel est utilisé pour exposer un bucket publiquement lisible via S3.
- Par défaut, Flexify.IO installe un certificat SSL auto-signé, tandis qu’un point de terminaison S3 nécessite HTTPS. Connectez-vous en SSH à la VM en utilisant le fichier de clé (le nom d’utilisateur est par défaut
azureuser) et remplacez les fichiers suivants par les fichiers corrects :
-
/etc/flexify/ssl/cert.pem– remplacez par le fichier de certificat (encodage PEM) -
/etc/flexify/ssl/key.pem– remplacez par le fichier de clé privée (encodage PKCS#8 PEM, celui qui commence parBEGIN PRIVATE KEYet nonBEGIN RSA PRIVATE KEYqui est PKCS#1)Ces fichiers sont propriété de root, vous devrez donc utiliser
sudopour les remplacer. Il est préférable de vous assurer que les fichiers de remplacement ont la même propriété et les mêmes permissions que les originaux, soitroot:rootet la permission600.
- Par défaut, Flexify.IO crée un service S3 de niveau racine avec plusieurs buckets. Discourse nécessite une prise en charge des sous-domaines pour les buckets. Allez à :
<votre IP de VM Flexify.IO>/flexify-io/manage/admin/engines/configs/1qui ouvrira une page de configuration cachée ! - Spécifiez le domaine de base S3 (disons
s3.mydomain.com) dans le champEndpoint hostname, qui devrait être vide par défaut. Appuyez sur Save pour enregistrer le paramètre. - Redémarrez la VM Flexify.IO dans le portail Azure.
- Dans votre DNS, mappez
s3.mydomain.comet*.s3.mydomain.comvers l’IP de la VM Flexify.IO. - Dans Discourse, définissez les paramètres suivants dans la page d’administration (oui, il n’est pas nécessaire que les paramètres soient dans
app.yml) :
use s3: true
s3 region: anything
s3 endpoint: https://s3.mydomain.com
s3 access key: myaccesskey
s3 secret assess key: mysecret key
s3 cdn url: https://<azure-blob-account>.blob.core.windows.net/<container>
s3 bucket: <virtual bucket>
s3 backup bucket: <backup bucket> (n'importe quel conteneur fera l'affaire, car il ne nécessite pas d'accès de lecture public et Flexify.IO les exposera automatiquement)
backup location: s3
Il n’est pas recommandé d’utiliser le même bucket pour la production et la préproduction. Si vous le faites quand même, prenez des mesures pour vous assurer que votre site de préproduction ne supprime pas vos assets de production (définissez au minimum s3 disable cleanup et surveillez la suppression des sauvegardes de production).
Wasabi
@pfaffman a essayé Wasabi pour les sauvegardes, mais cela semblait échouer de manière intermittente et silencieuse, laissant les sauvegardes sur le disque dur et finissant par remplir le disque. Ni Wasabi ni Meta n’avaient d’indices, donc je ne le recommande pas, bien que vos résultats puissent varier. @pfaffman est maintenant assez certain que ce problème était dû au fait que les sauvegardes et les redémarrages automatiques étaient programmés en même temps ; il n’était utilisé que pour les sauvegardes, mais semblait fonctionner correctement. Si quelqu’un souhaite l’essayer et faire un rapport ici, cela devrait fonctionner, du moins pour les sauvegardes.
Oracle Cloud
Oracle Cloud ne prend pas en charge l’accès aux buckets de style « virtual-host » et ne fonctionnera pas
Cloudflare R2
Pour configurer Cloudflare R2, vous devrez configurer les paramètres pertinents dans le tableau de bord Cloudflare sous R2 Object Storage.
Selon vos besoins (téléversements, sauvegardes ou les deux), voici les paramètres pertinents à insérer dans votre fichier app.yml ou dans vos Paramètres du site - Tous en recherchant S3 :
DISCOURSE_ENABLE_S3_UPLOADS: true
DISCOURSE_S3_REGION: auto
DISCOURSE_S3_ENDPOINT: https://<your-account-id>.r2.cloudflarestorage.com
DISCOURSE_S3_ACCESS_KEY_ID: "xxx"
DISCOURSE_S3_SECRET_ACCESS_KEY: "xxx"
DISCOURSE_S3_UPLOAD_BUCKET: your-upload-bucket-name
DISCOURSE_S3_CDN_URL: https://uploads.yourdomain.com
# DISCOURSE_S3_USE_CDN_URL_FOR_ALL_UPLOADS: true
DISCOURSE_ENABLE_DIRECT_S3_UPLOADS: true
DISCOURSE_S3_USE_ACLS: false
DISCOURSE_BACKUP_LOCATION: s3
DISCOURSE_S3_BACKUP_BUCKET: your-backup-bucket-name
Si vous ne souhaitez pas modifier votre fichier app.yml, vous pouvez le faire dans l’interface d’administration :
« Admin → Tous les paramètres du site » (recherchez S3) :
- Activer les téléversements S3 =
true - Activer les téléversements S3 directs =
true - Clé d’accès S3 =
"xxx" - Clé secrète d’accès S3 =
"xxx" - Région S3 =
any - Bucket de téléversement S3 =
your upload bucket name - Point de terminaison S3 =
https://<your-account-id>.r2.cloudflarestorage.com - URL CDN S3 =
https://uploads.yourdomain.com - Utiliser les ACL S3 =
false(désactivez ceci !) - Bucket de sauvegarde S3 =
your backup bucket name - Emplacement de sauvegarde =
S3
Notes :
-
Autorisations du jeton API : Comme Discourse n’a qu’un seul ensemble de champs d’identification, le jeton API que vous générez dans Cloudflare doit avoir l’autorisation d’accéder à la fois à votre bucket de téléversement et à votre bucket de sauvegarde. Lors de la création de votre jeton, sélectionnez soit « Appliquer à tous les buckets », soit « Appliquer à des buckets spécifiques » et assurez-vous que les deux sont cochés. De plus, assurez-vous de cocher
Object Read & Writelors de la création de la clé API (la valeur par défaut est uniquementObject Read only). -
Lors de la copie de l’URL du point de terminaison depuis Cloudflare, le nom du bucket peut être ajouté à la fin de l’URL – vous devez supprimer le nom du bucket de la fin de la chaîne dans votre fichier
.ymls’il est collé. -
Décommentez
# DISCOURSE_S3_USE_CDN_URL_FOR_ALL_UPLOADS: truesi vous souhaitez utiliser votre bucket de téléversement R2 pour tous les téléversements, y compris les fichiersPDFetZIP. (Notez que cela rendra tous les fichiers téléversés accessibles publiquement via un lien direct) -
Si vous activez
DISCOURSE_ENABLE_DIRECT_S3_UPLOADS(true), vous devez désactiverDISCOURSE_S3_USE_ACLS(false). En effet, Cloudflare R2 utilise des autorisations au niveau du bucket ; votre bucket de téléversement doit être public et le bucket de sauvegarde doit être privé. Pour les téléversements Cloudflare R2, vous NE DEVEZ PAS configurer les tâches rake des règles CORS ou écrire un JSON IAM, car vous le configurerez dans le tableau de bord Cloudflare lors de la configuration de vos autorisations de bucket. Le jeton « Object Read & Write » de Cloudflare accorde automatiquement les autorisations de téléversement multipart, et coller la règle CORS suivante directement dans les paramètres du bucket de téléversement R2 du tableau de bord Cloudflare sousCORS Policyremplace le besoin de la tâche rake.
[
{
"AllowedOrigins": [
"https://forum.yourdomain.com"
],
"AllowedMethods": [
"GET",
"PUT",
"POST",
"DELETE",
"HEAD"
],
"AllowedHeaders": [
"*"
],
"ExposeHeaders": [
"ETag"
],
"MaxAgeSeconds": 3000
}
]
Contabo
@tuxed a essayé de faire fonctionner le stockage d’objets Contabo pour les téléversements compatibles S3. Il semble que lors du téléversement, il ajoute le nom du dépôt en préfixe dans l’URL et il n’a pas réussi à le faire fonctionner.
Téléversements sécurisés
Les téléversements sécurisés ne sont pris en charge que pour AWS S3. Si votre commande rake uploads:migrate_to_s3 échoue, vous devez entrer ces commandes pour d’abord compter, puis marquer comme non sécurisés les téléversements, étant donné que vous savez qu’ils n’ont pas besoin d’être sécurisés. Dans ce cas, vous devrez utiliser AWS S3.
./launcher enter app
rails c
Upload.where(secure: true).count
Upload.where(secure: true).update_all(secure:false)