Configurer un fournisseur de stockage d'objets compatible S3 pour les uploads

:information_source: 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.

:warning: 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.

:warning: 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 :

  1. Vous disposez d’une instance de serveur MinIO entièrement configurée.
  2. 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.
  3. 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).
  4. Le bucket discourse-data existe sur le serveur MinIO et possède une stratégie « public » définie dessus.
  5. 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.
  6. 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.com lorsqu’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.

  1. Dans le portail Azure, créez une nouvelle ressource Flexify.IO - Amazon S3 API for Azure Blob Storage.
  2. 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.
  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 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 buckets est activé. Copiez l’URL et les clés du point de terminaison S3.
  4. 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.
  5. 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 par BEGIN PRIVATE KEY et non BEGIN RSA PRIVATE KEY qui est PKCS#1)

    Ces fichiers sont propriété de root, vous devrez donc utiliser sudo pour 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, soit root:root et la permission 600.

  1. 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/1 qui ouvrira une page de configuration cachée !
  2. Spécifiez le domaine de base S3 (disons s3.mydomain.com) dans le champ Endpoint hostname, qui devrait être vide par défaut. Appuyez sur Save pour enregistrer 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 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 :

  1. 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 & Write lors de la création de la clé API (la valeur par défaut est uniquement Object Read only).

  2. 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 .yml s’il est collé.

  3. Décommentez # DISCOURSE_S3_USE_CDN_URL_FOR_ALL_UPLOADS: true si vous souhaitez utiliser votre bucket de téléversement R2 pour tous les téléversements, y compris les fichiers PDF et ZIP. (Notez que cela rendra tous les fichiers téléversés accessibles publiquement via un lien direct)

  4. Si vous activez DISCOURSE_ENABLE_DIRECT_S3_UPLOADS (true), vous devez désactiver DISCOURSE_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 sous CORS Policy remplace 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)

  1. Oracle Cloud ne prend pas en charge l’accès aux buckets de 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
Set up BackBlaze S3 with BunnyCDN
Can not access backup page and related error when restoring using GCP Object Storage
Setting up backup and image uploads to Backblaze B2
Upload assets to S3 after in-browser upgrade
What are the right settings to use S3 bucket (with non-Amazon URL)?
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
Custom emoji don't use CDN for S3 stored assets in a few pages
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
Run Discourse as docker swarm service
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?
Install Discourse on a residential internet with Cloudflare Tunnel
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?
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
[PAID] Configure an S3 compatible object storage provider for uploads
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
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?
S3 and Cloudfront - Setup Not Working
S3 and Cloudfront - Setup Not Working
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)
Why you should use Discourse internally for your company/team instead of Slack (4 years use case)
Make s3_region a string value
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
Colored loading dots because assets not uploaded
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?
Secure 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
Backup Files Not Showing in Discourse Backend After Uploading to Cloudflare R2
Resizing images off server
Unable to setup S3 bucket
Discourse Stuck on Loading (Logs)
Discourse Stuck on Loading (Logs)
Unable to setup S3 bucket
Rebuild failure - skipping "after_assets_precompile" section of app.yml
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
Setting up backup and image uploads to Backblaze B2
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?
An AWS S3 Integration with Discourse Tutorial would be nice
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附件上传成功后,论坛中无法加载出来?
Imgur upload built into the post buttons
Backup discourse from the command line
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
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
Migrate_to_S3 Fails on Rebake
Cannot rebake after setting up CDN
High Availability 3 Server setup
Enable hidden setting to include S3 uploads in the backups
S3 error, when updating to 2.9.0.beta1
Azure Blob Storage Plugin
How might we better structure #howto?
Migrating uploaded files from DO to S3
Discourse as a closed wiki
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