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

:information_source: Ce sujet explique comment configurer certains fournisseurs de stockage d’objets compatibles S3 (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 Fonctionne 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 réussi à faire fonctionner un autre service, veuillez l’ajouter à cette wiki.

Configuration

Pour stocker les actifs 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 ce qui est stocké dans le bucket. J’ai utilisé le CDN StackPath lors de mes tests, et à part avoir besoin de définir Dynamic Caching By Header: Accept-Encoding dans leur configuration, cela fonctionne correctement.

DISCOURSE_CDN_URL est un CDN qui pointe vers le nom d’hôte de votre Discourse et met en cache les requêtes. Il sera utilisé principalement pour les actifs récupérables (pullable) : CSS et autres actifs de thème.

DISCOURSE_S3_CDN_URL est un CDN qui pointe vers votre bucket de stockage d’objets et met en cache les requêtes. Il sera principalement utilisé pour les actifs poussables (pushable) : JS, images et uploads d’utilisateurs.

Nous recommandons qu’ils soient différents et que les administrateurs définissent les deux.

Ne pas utiliser de CDN (ou entrer l’URL du bucket comme URL du 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 sous le bucket. Le nom du bucket a été défini sur falcoland-files dans mes exemples.

La configuration de ces paramètres dans les variables d’environnement de votre app.yml est recommandée car c’est ainsi que CDCK le fait dans leur infrastructure, ce qui est donc bien testé. De plus, la tâche de téléchargement des actifs a lieu après la compilation des actifs, ce qui se produit lors d’une reconstruction (rebuild). Si vous souhaitez lancer un Discourse qui fonctionne correctement avec le stockage d’objets dès le début, vous devez définir les variables d’environnement afin que les actifs soient téléchargé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 possible d’activer la restriction de la liste des fichiers. Le seul problème est que leur offre CDN est très mal conçue, vous devez donc utiliser un autre CDN pour les fichiers. De plus, vous ne devez pas installer la règle CORS, car elle se réinstalle à 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 avez donc besoin d’une variable ENV supplémentaire pour la contourner afin que les actifs fonctionnent. Contournez également CORS et configurez-le manuellement.

:warning: Comme vous ne pouvez pas lister les fichiers, vous ne pourrez pas lister les sauvegardes, et les sauvegardes automatiques échoueront ; nous ne recommandons pas de l’utiliser 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 sur 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 Scaleway est également très bonne, et tout fonctionne bien dans la plupart des cas.

:warning: Les uploads multipart de Scaleway ne supportent qu’un maximum de 1 000 parties. Cela ne correspond pas à Amazon S3, qui supporte un maximum de 10 000 parties. Pour les instances plus grandes, cela causera l’échec des sauvegardes Discourse et l’upload incomplet devra peut-être être supprimé manuellement avant de nouvelles tentatives. 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 l’endpoint de la région entière : https://s3.{region}.scw.cloud. L’“Endpoint du bucket” 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 contourner CORS et le configurer manuellement.

Il y a des rapports indiquant que le nettoyage des uploads orphelins 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

Remarque : Lors de la migration initiale vers B2, vous pouvez atteindre la limite de 2500 transactions de classe C gratuites par jour. Vous devrez ajouter un moyen de paiement pour lever les plafonds.

MinIO Storage Server

Il y a quelques avertissements et exigences que vous devez vous assurer d’avoir respectés avant de pouvoir utiliser le serveur de stockage MinIO comme alternative à S3 :

  1. Vous disposez d’une instance de serveur MinIO entièrement configurée
  2. Vous avez activé le support de domaine dans la configuration MinIO, pour les URLs de buckets basées sur les domaines. C’est une exigence de configuration obligatoire pour MinIO et Discourse, car MinIO supporte encore les styles “path” S3 legacy qui ne sont plus supportés dans Discourse.
  3. Vous avez correctement configuré le DNS pour MinIO afin que les sous-domaines des buckets 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)
  4. Le bucket discourse-data existe sur le serveur MinIO et a une politique “publique” définie dessus
  5. Votre URL CDN S3 pointe vers un CDN correctement configuré pointant vers le bucket et mettant en cache les requêtes, comme indiqué plus haut dans ce document.
  6. Vos CDNs sont configurés pour utiliser réellement un en-tête “Host” de l’URL S3 de base - par exemple, discourse-data.minio.example.com lorsqu’il récupère les données - sinon cela peut causer des problèmes CORB.

En supposant que les avertissements et prérequis ci-dessus sont respectés, une configuration exemple serait quelque chose comme ceci :

  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 sera toujours activé sur MinIO même si la règle n’est pas installée par le recompileur d’application - par défaut, il semble, CORS est activé sur tous les verbes HTTP dans MinIO, et MinIO ne supporte pas BucketCORS (API S3) par conséquent.

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é.

La façon la plus simple d’exposer une interface compatible S3 pour Azure Blob Storage est d’ajouter un serveur Flexify.IO qui traduit le protocole de stockage Azure en S3.

À ce jour, le service est gratuit sur Azure, et vous n’avez besoin que d’une couche VM très basique (bon marché) pour commencer à l’exécuter. Cela nécessite cependant un peu de configuration.

  1. Dans le portail Azure, créez une nouvelle ressource de type Flexify.IO - Amazon S3 API for Azure Blob Storage.
  2. Pour une utilisation légère, la configuration VM minimale semble fonctionner très bien. 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.
  3. 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 l’endpoint S3 généré. Assurez-vous que le paramètre de configuration de l’endpoint Public read access to all objects in virtual buckets est vrai. Copiez l’URL de l’endpoint S3 et les clés.
  4. Appuyez sur New Virtual Bucket et créez un bucket virtuel. Il peut porter le même nom que votre conteneur Azure Blob Storage, ou un nom différent. Liez n’importe quel conteneur(s) à fusionner dans ce bucket virtuel. Ce bucket virtuel est utilisé pour exposer un bucket lisible publiquement via S3.
  5. Par défaut, Flexify.IO installe un certificat SSL auto-signé, tandis qu’un endpoint 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 PEM PKCS#8, c’est celui commençant par BEGIN PRIVATE KEY et non BEGIN RSA PRIVATE KEY qui est PKCS#1)

    Ces fichiers sont root, donc vous devrez utiliser sudo pour les remplacer. Il est préférable de s’assurer que les fichiers de remplacement ont la même propriété et les mêmes permissions que les originaux, c’est-à-dire root:root et permission 600.

  1. Par défaut, Flexify.IO crée un service S3 de niveau racine avec plusieurs buckets. Discourse nécessite le support de sous-domaines pour les buckets. Allez à : <votre IP VM Flexify.IO>/flexify-io/manage/admin/engines/configs/1 qui ouvrira une page de configuration cachée !
  2. Spécifiez le domaine de base S3 (disons qu’il est s3.mydomain.com) dans le champ Endpoint hostname, qui devrait être vide par défaut. Appuyez sur Save pour sauvegarder le paramètre.
  3. Redémarrez la VM Flexify.IO dans le portail Azure.
  4. Dans votre DNS, mappez s3.mydomain.com et *.s3.mydomain.com vers l’IP de la VM Flexify.IO.
  5. Dans Discourse, définissez ce qui suit dans la page administrateur (oui, il n’y a pas besoin 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 conviendra, car il ne nécessite pas d'accès en lecture publique et Flexify.IO les exposera automatiquement)
backup location: s3

L’utilisation du même bucket pour la production et la préproduction (staging) n’est pas recommandée. Si vous le faites quand même, prenez des mesures pour vous assurer que votre site de préproduction ne supprime pas vos actifs de production (définissez s3 disable cleanup au minimum, et faites attention à ce qu’il ne supprime pas les sauvegardes de la 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 remplissant éventuellement 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 planifiés en même temps ; il n’était utilisé que pour les sauvegardes, mais semblait fonctionner correctement. Si quelqu’un veut essayer et en faire le rapport ici, cela devrait fonctionner, du moins pour les sauvegardes.

Oracle Cloud

Oracle Cloud ne prend pas en charge l’accès aux buckets en style virtual-host et ne fonctionnera pas

Cloudflare R2

Cloudflare R2 est compatible avec le stockage d’objets S3 lors de l’utilisation du CDN Cloudflare. Le plan gratuit de Cloudflare offre 10 Go de stockage, ce qui devrait être largement suffisant pour les besoins de la plupart des forums.

Pour configurer Cloudflare R2, vous devrez configurer les paramètres pertinents dans le tableau de bord Cloudflare sous R2 Object Storage.

Selon vos besoins (uploads ou sauvegardes ou les deux), voici les paramètres pertinents à insérer dans votre fichier app.yml ou dans votre recherche Admin-Tous les paramètres du site pour 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 app.yml, vous pouvez le faire dans l’interface administrateur :

“Admin → Tous les paramètres du site” (recherchez S3) :

  • Activer les uploads S3 = true
  • Activer les uploads S3 directs = true
  • ID de clé d’accès S3 = "xxx"
  • Clé secrète d’accès S3 = "xxx"
  • Région S3 = any
  • Bucket d’upload S3 = nom de votre bucket d'upload
  • Endpoint S3 = https://<your-account-id>.r2.cloudflarestorage.com
  • URL CDN S3 = https://uploads.yourdomain.com
  • Utiliser les ACLs S3 = false (désactivez ceci !)
  • Bucket de sauvegarde S3 = nom de votre bucket de sauvegarde
  • Emplacement de sauvegarde = S3

Notes importantes sur la configuration de Cloudflare R2 :

  1. Lors de la configuration de votre app.yml ou web_only.yml pour Cloudflare R2, définissez uniquement le DISCOURSE_S3_CDN_URL. Ne définissez PAS DISCOURSE_CDN_URL. Si vous proxyez votre domaine principal via Cloudflare, il met déjà en cache et sert vos actifs d’application automatiquement. Si vous tentez de configurer un DISCOURSE_CDN_URL séparé en utilisant DNS Cloudflare, le routage strict d’hôte NGINX de Discourse rejettera les requêtes, entraînant des boucles de redirection 301 infinies, des blocages de politique CORS et un site cassé.
  • Laissez DISCOURSE_CDN_URL commenté.
  • Définissez DISCOURSE_S3_CDN_URL: https://your-r2-custom-domain.com
  1. Permissions du jeton API : Comme Discourse n’a qu’un seul ensemble de champs de credentials, le jeton API que vous générez dans Cloudflare doit avoir la permission d’accéder à la fois à votre bucket d’upload et à votre bucket de sauvegarde. Lors de la création de votre jeton, sélectionnez soit “Appliquer à tous les buckets” ou utilisez “Appliquer à des buckets spécifiques” et assurez-vous que les deux sont cochés. Assurez-vous également de cocher Lecture & Écriture d'objets lors de la création de la clé API (la valeur par défaut est uniquement Lecture d'objets).

  2. Lors de la copie de l’URL de l’endpoint depuis Cloudflare, il peut ajouter le nom du bucket à l’URL - vous devriez supprimer le nom du bucket de la fin de la chaîne dans votre fichier .yml (ou paramètres administrateur) s’il est collé.

  3. Décommentez # DISCOURSE_S3_USE_CDN_URL_FOR_ALL_UPLOADS: true si vous souhaitez utiliser votre bucket d’upload R2 pour tous les uploads, y compris les fichiers PDF et ZIP. (Notez que cela rendra tous les fichiers uploadés accessibles publiquement via un lien direct)

  4. Si vous activez DISCOURSE_ENABLE_DIRECT_S3_UPLOADS (true), vous devriez désactiver DISCOURSE_S3_USE_ACLS (false). C’est parce que Cloudflare R2 utilise des permissions au niveau du bucket ; votre bucket d’upload devrait être public et le bucket de sauvegarde devrait être privé. Pour les uploads Cloudflare R2, vous NE DEVEZ PAS configurer les tâches rake des règles CORS ou écrire du json IAM, car vous les configurerez dans le tableau de bord Cloudflare lors de la configuration des permissions de votre bucket. Le jeton “Lecture & Écriture d’objets” de Cloudflare accorde automatiquement les permissions d’upload multipart, et le collage de la règle CORS suivante directement dans les paramètres du bucket d’uploads R2 du tableau de bord Cloudflare sous Politique CORS remplace le besoin de la tâche rake.

[
  {
    "AllowedOrigins": [
      "https://forum.yourdomain.com"
    ],
    "AllowedMethods": [
      "GET",
      "PUT",
      "POST",
      "DELETE",
      "HEAD"
    ],
    "AllowedHeaders": [
      "*"
    ],
    "ExposeHeaders": [
      "ETag"
    ],
    "MaxAgeSeconds": 3000
  }
]

Consultez également ce sujet pour plus d’informations sur la configuration de Cloudflare : Using Discourse with Cloudflare: Best Practices

Contabo

@tuxed a essayé de faire fonctionner Contabo Object Storage pour les uploads compatibles S3. Il semble que lors de l’upload, il préfixe le nom du dépôt dans l’URL et il n’a pas réussi à le faire fonctionner.

Uploads sécurisés

Les uploads sécurisés ne sont pris en charge que pour AWS S3. Si votre rake uploads:migrate_to_s3 échoue, vous devriez entrer ces commandes pour d’abord compter, puis marquer comme non sécurisés ces uploads, étant donné que vous savez qu’ils n’ont pas besoin d’être sécurisés, auquel cas, vous devrez utiliser AWS S3.

./launcher enter app
rails c
Upload.where(secure: true).count
Upload.where(secure: true).update_all(secure:false)

  1. Oracle Cloud ne prend pas en charge l’accès aux buckets en style virtual-host et ne fonctionnera pas ↩︎

69 « J'aime »
Defining DISCOURSE_S3_CDN_URL links to assets in S3 CDN URL
Backblaze S3 issue: duplicated uploads after delete
Migrate from AWS to Digital Ocean with 2 containers, spaces and 2 CDNs
Using Scaleway s3-compatible object storage
Extend S3 configuration for other s3 API compatible cloud storage solutions
Setting up backup and image uploads to Backblaze B2
What are the right settings to use S3 bucket (with non-Amazon URL)?
Upload assets to S3 after in-browser upgrade
Using multiple containers - what needs to be shared?
Virus scanning of uploaded files
Imgur images broken
Admin role conflates server admin and board admin
Error in rebuilding using minio as object store
Use WebTorrent to load media objects
Issues with changing File/Image upload location to S3 Server from local storage
Hosting Optimization with Digital Ocean
Hosting Optimization with Digital Ocean
Theme modifiers: A brief introduction
Configure automatic backups for Discourse
Problem with Backblaze for backup- Failed to list backups from S3: Signature validation failed
Move from BackBlaze B2 to Digital Ocean Spaces
Which free storage for many images? also to be used for thumbnails etc
Migrate from AWS to Digital Ocean with 2 containers, spaces and 2 CDNs
Restore Failure - S3 (compatible) backup
Restore Failure - S3 (compatible) backup
Digitalocean block storage VS amazon S3
Digitalocean block storage VS amazon S3
Admin upgrade page doesn't load with a CDN
Install Discourse for Production Environment on Windows Server
Running Discourse on Azure Web Sites vs. Azure VM?
How to turn off S3 storage?
Access Denied error message when trying to upload images
What are the right settings to use S3 bucket (with non-Amazon URL)?
REQ: Support S3 backup to a service like Backblaze
REQ: Support S3 backup to a service like Backblaze
Using Scaleway s3-compatible object storage
Overwrite meta og:image image source to use externally public loaded images on topics?
How to store uploads with multiple web_only servers?
Can not edit topics with picture with S3 backend
Finding UI generated backup and restoring site
Looking for doc to connect discourse with digital ocean spaces
Looking for doc to connect discourse with digital ocean spaces
Looking for doc to connect discourse with digital ocean spaces
403 Error with digital ocean cdn
Link to headers (anchor links)
NoMethodError downcase s3_bucket_name absolute_base_url
What should I enter in the S3 CDN settings if I don't have a CDN?
Backing up files in Object Storage
Minio: A header you provided implies S3 functionality that is not implemented
Configure automatic backups for Discourse
S3 OVH Object Storage
File directory system
Unable to backup or navigate to backups
Uploads to AWS S3 and Configured CDN
Migration to a Self-Hosted solution from Kubernetes
How to develop discourse in a team?
Images didn't load after configuring S3 uploads
Need Azure blob storage
Use Google Cloud Storage Instead of S3
Move discourse uploads to free space on server
Strange behavior with Digital Ocean Spaces/S3 and lots of duplicated CORS rules for `example.com`
Can't upload PDF to S3
"canned acl" error when uploading images
AWS S3 Object Ownership
What’s your server configurations?
How to debug S3 uploads
Problems with Patreon Login, Force HTTPS, and S3 CDN (three) Issues
Cron task to sync local backups to DigitalOcean Spaces
Cron task to sync local backups to DigitalOcean Spaces
Problems with Patreon Login, Force HTTPS, and S3 CDN (three) Issues
Help restoring - system hung at midnight
Help restoring - system hung at midnight
Image upload error: The bucket does not allow ACL's
Make s3_region a string value
How can I set s3_force_path to true?
S3 assets folder, is a cleanup needed?
BunnyCDN storage for automatic backups
BunnyCDN storage for automatic backups
Move Uploads and Backups to DigitalOcean Block Storage
Required local storage for URL referenced images vs. uploaded images?
Colored loading dots because assets not uploaded
Is DO Spaces CDN still broken? Any workarounds?
Is DO Spaces CDN still broken? Any workarounds?
Is DO Spaces CDN still broken? Any workarounds?
Basic How-To for Using MinIO storage server run by you for your Discourse Instance
Minio instead of S3?
Configure automatic backups for Discourse
S3 image bandwidth costs are getting annoying
S3 image bandwidth costs are getting annoying
Support for ImgBB image upload service
Install Discourse on Amazon Web Services (AWS)
Account creation not working with discourse_encrypt
Cannot load any images “Uncaught (in promise) no-response: no-response”
Tips on Google Cloud S3
Enable a CDN for your Discourse
Invalid URL for markdown-it-bundle
Not using volumes (or automatically using S3) when hosting with Docker
Configuring automatic backups
I have a problem with my proxy status
Inline PDF Previews
My images are not working
Getting error 422 invalid argument when configure S3 upload with GCS
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
Strange behavior with Digital Ocean Spaces/S3 and lots of duplicated CORS rules for `example.com`
My install broke after updating, how can I fix it?
Uploads Subdomain For Cloudflare
Hetzner deleted my account, my server and I was left with nothing. What to do?
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
Understanding Uploads, Images, and Attachments
S3, Assets & CDN Error
Capacity planning / Resource requirements
Migrate assets to s3 rake tasks
Best option for DB and file Storage
S3 error, when updating to 2.9.0.beta1
Forum rendered unusable
Forum rendered unusable
Configure automatic backups for Discourse
Migrate Discourse broke S3 images
Configure automatic backups for Discourse
Cloud storage and cdn
Migrating uploads from S3 to local
Another discourse offline "bootstrap failed with exit code 5"
Another discourse offline "bootstrap failed with exit code 5"
AI Plugin Build Error - 'bundle exec rake db:migrate' failed
Your Docker installation is not working correctly - no space left on device - safe to use ./launcher cleanup?
Uncaught SyntaxError: forum spins nonstop and never loads
Why is my upload limit 100mb?It's set to 500mb
Trouble with Google Bucket for backup
Did I overwrite my site settings with a cross-instance backup/restore?
Need tips on making my forum faster
What should be the server requirements
SSL_connect returned=1 errno=0 peeraddr=162.243.189.2:443 state=error: certificate verify failed (Hostname mismatch)
Set up BackBlaze S3 with BunnyCDN
Why you should use Discourse internally for your company/team instead of Slack (4 years use case)
Make s3_region a string value
Imgur upload built into the post buttons
Decoupled Discourse Application - Managed Redis, Managed Postgres, and DIgital Ocean Volume with Discourse
S3 and Cloudfront - Setup Not Working
Cannot upload images in mobile discourse
Cloudflare R2: Navigating Setup and Handling Configuration Errors
Cloudflare R2: Navigating Setup and Handling Configuration Errors
Cloudflare R2: Navigating Setup and Handling Configuration Errors
S3 assets broken after moving forum
Backup request via FTP
Error when doing "bundle exec rake s3:upload_assets" - Could not locate Gemfile or .bundle/ directory
Separate S3 access keys for backups and uploads?
Topic List Previews (legacy)
Disk usage spike during backup, Discourse crashed hard :-(
Make s3_region a string value
Favicon setup: "To work correctly over a CDN it must be a png"
Change image folder to symlinked folder
Migrating uploads from S3 to local
S3 Upload Confusion: Dashboard vs. app.yml
Old installation failing upgrade
Where are Images and uploads stored?
Rebuild issue: [Cannot set dual-stack in combination with a custom endpoint.]
Problem updating data in the separate database
Resizing images off server
Unable to setup S3 bucket
Discourse Stuck on Loading (Logs)
Discourse Stuck on Loading (Logs)
Unable to setup S3 bucket
How to add AWS Cloudfront as a Discourse CDN
Unable to setup S3 bucket
Configured s3, but i want asset to serve locally
Configured s3, but i want asset to serve locally
Set up BackBlaze S3 with BunnyCDN
Discourse s3 backup folder
SSO broken after rebuild with stable v3.3.3
How to Configure Cloudflare R2 for your Discourse Community
如何批量修改文件链接地址
Can't migrate uploads to S3
Backup discourse from the command line
Stuck and lost updating forum, problems with PG migration
Can't rebuild due to AWS SDK gem bump and new AWS Data Integrity Protections
Can't rebuild due to AWS SDK gem bump and new AWS Data Integrity Protections
S3 (not AWS) backups stopped working, presumably since an update
Troubleshooting S3 Uploads: Site hangs after rebuild, JS assets fail to load with net::ERR_... on both R2 and GCS
Inquiry About Discourse’s Support for Amazon S3 Storage
Backup discourse from the command line
Inquiry About Discourse’s Support for Amazon S3 Storage
Inquiry About Discourse’s Support for Amazon S3 Storage
Cloudflare R2 Storage Issues
Hetzner S3 support
Can the /var/discourse and /var/lib/docker folders be on different volumes?
Setting up backup and image uploads to Backblaze B2
Issues with AWS CDN and S3
Digital Ocean Spaces (S3) "unable to sign request without credentials set"
Issues with AWS CDN and S3
Digital Ocean Spaces (S3) "unable to sign request without credentials set"
Digital Ocean Spaces (S3) "unable to sign request without credentials set"
Digital Ocean Spaces (S3) "unable to sign request without credentials set"
Digital Ocean Spaces (S3) "unable to sign request without credentials set"
为啥我的七牛云s3附件上传成功后,论坛中无法加载出来?
Install Discourse on a residential internet with Cloudflare Tunnel
Custom emoji don't use CDN for S3 stored assets in a few pages
S3 and Cloudfront - Setup Not Working
Secure Uploads
Make s3_region a string value
Backup Files Not Showing in Discourse Backend After Uploading to Cloudflare R2
Images after a restore don't have S3 bucket URL
Can't upload to S3 (Cloudflare R2)
Daily Summary (9pm UTC)
Custom Emojis loaded from S3/R2 bypass CDN routing
An AWS S3 Integration with Discourse Tutorial would be nice
Is Scaleway a good option for object storage?
Blackblaze&Cloudflare: image uploading works, but not showing in post
SMF2 Conversion and Rake to S3 Help
Backing up your forum
What causes rake uploads:fix_relative_upload_links
Running 2 hosts behind haproxy fails with random 404s
Site Blank After Rebuild
Rebuild goes into a loop
Custom Emojis loaded from S3/R2 bypass CDN routing
Backblaze S3 issue: duplicated uploads after delete
Migrate_to_S3 Fails on Rebake
Downloads coming from S3 even with DISCOURSE_S3_CDN_URL set
Errors trying to use custom S3 storage
Moving from one S3 bucket to another
S3 image bandwidth costs are getting annoying
Basic How-To for Using MinIO storage server run by you for your Discourse Instance
SSL error - can't upload images
Digital Ocean Spaces don’t implement the AWS S3 API for the CORS rule
Extend S3 configuration for other S3 API compatible services
How to separate uploaded files to another server
Storing Images in the cloud
S3 and Cloudfront - Setup Not Working
Migrate_to_S3 Fails on Rebake
Can not access backup page and related error when restoring using GCP Object Storage
Cannot rebake after setting up CDN
Rebuild failure - skipping "after_assets_precompile" section of app.yml
High Availability 3 Server setup
Enable hidden setting to include S3 uploads in the backups
Run Discourse as docker swarm service
Azure Blob Storage Plugin
How might we better structure #howto?
Migrating uploaded files from DO to S3
Discourse as a closed wiki