Configura un provider di archiviazione oggetti compatibile con S3 per i caricamenti

:information_source: Questo argomento tratta la configurazione di alcuni provider di Object Storage compatibili con S3 comuni (cloni S3). Consulta Set up file and image uploads to S3 per maggiori dettagli sulla configurazione di Amazon AWS S3, che è ufficialmente supportata e utilizzata internamente da Discourse per i nostri servizi di hosting.

Provider Nome Servizio Funziona con Discourse?
Amazon AWS S3
Digital Ocean Spaces
Linode Object Storage
Google Cloud Storage
Scaleway Object Storage
Vultr Object Storage
BackBlaze Cloud Storage Sì*
Self-hosted MinIO
Azure Blob Storage Flexify.IO
Oracle Cloud Object Storage No [1]
Wasabi Object Storage Forse
Cloudflare R2
Contabo Object Storage No

Se hai fatto funzionare un servizio diverso, aggiungilo a questa wiki.

Configurazione

Per memorizzare le risorse statiche di Discourse nel tuo Object Storage, aggiungi questa configurazione nel tuo app.yml sotto la sezione 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

Quando si utilizza l’object storage, è inoltre necessario un CDN per servire ciò che viene memorizzato nel bucket. Ho utilizzato StackPath CDN nei miei test e, a parte la necessità di impostare Dynamic Caching By Header: Accept-Encoding nella loro configurazione, funziona bene.

DISCOURSE_CDN_URL è un CDN che punta al tuo hostname Discourse e memorizza nella cache le richieste. Sarà utilizzato principalmente per le risorse scaricabili: CSS e altre risorse del tema.

DISCOURSE_S3_CDN_URL è un CDN che punta al tuo bucket di object storage e memorizza nella cache le richieste. Sarà utilizzato principalmente per le risorse caricabili: JS, immagini e caricamenti degli utenti.

Consigliamo che questi siano diversi e che gli amministratori impostino entrambi.

Non utilizzare un CDN (o inserire l’URL del bucket come URL CDN) è probabile che causi problemi e non è supportato.

Negli esempi seguenti, https://falcoland-files-cdn.falco.dev è un CDN configurato per servire i file sotto il bucket. Il nome del bucket è stato impostato su falcoland-files nei miei esempi.

Si consiglia di configurare queste impostazioni nelle variabili d’ambiente nel tuo app.yml, poiché è così che CDCK lo fa nella propria infrastruttura, quindi è ben testato. Inoltre, l’attività di caricamento delle risorse avviene dopo la compilazione delle risorse, che avviene durante un rebuild. Se desideri avviare un Discourse che funzioni correttamente con l’object storage fin dall’inizio, devi impostare le variabili d’ambiente in modo che le risorse vengano caricate prima che il sito venga avviato.

Scegli il tuo provider dall’elenco qui sotto e aggiungi queste impostazioni alla sezione env del tuo file app.yml, regolando i valori di conseguenza:

AWS S3

Ciò che supportiamo ufficialmente e utilizziamo internamente. La loro offerta CDN Cloudfront funziona anche per fronteggiare i file del bucket. Consulta Set up file and image uploads to S3 per sapere come configurare correttamente i permessi.

  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’offerta DO è buona e funziona fuori dalla scatola. È corretto abilitare la restrizione dell’elenco dei file. L’unico problema è che la loro offerta CDN è terribilmente rotta, quindi devi utilizzare un CDN diverso per i file. Inoltre, non devi installare la regola CORS, poiché viene reinstallata ad ogni rebuild.

Configurazione di esempio:

  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

È richiesto un parametro di configurazione aggiuntivo, HTTP_CONTINUE_TIMEOUT, per Linode.

Configurazione di esempio:

  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

L’elenco dei file è rotto, quindi hai bisogno di una variabile d’ambiente aggiuntiva per saltarlo in modo che le risorse funzionino. Salta anche CORS e configuralo manualmente.

:warning: Poiché non puoi elencare i file, non sarai in grado di elencare i backup e i backup automatici falliranno; non consigliamo di utilizzarlo per i backup. Tuttavia, alcuni suggeriscono che se cambi il ruolo da Storage Legacy Object Owner a Storage Legacy Bucket Owner, i backup funzionano correttamente. Consulta questo argomento per una discussione specifica su Google Cloud.

Esiste un plugin di terze parti per migliorare l’integrazione su Discourse GCS Helper.

Configurazione di esempio:

  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’offerta Scaleway è anche molto buona e tutto funziona bene per la maggior parte.

:warning: I caricamenti multipart di Scaleway supportano solo un massimo di 1.000 parti. Questo non corrisponde ad Amazon S3, che supporta un massimo di 10.000 parti. Per istanze più grandi, questo causerà il fallimento dei backup di Discourse e il caricamento incompleto potrebbe dover essere eliminato manualmente prima di ulteriori tentativi. Per istanze piccole questo non è un problema. Scaleway sembra molto aperta ai feedback, quindi se vuoi che questo limite venga modificato, dovresti contattarli.

Nota che per il parametro DISCOURSE_S3_ENDPOINT, Discourse utilizza l’endpoint dell’intera regione: https://s3.{region}.scw.cloud. L’endpoint del bucket trovato nella dashboard di Scaleway viene fornito sotto forma di https://{bucketName}.s3.{region}.scw.cloud. Ometti il sottodominio del nome del bucket per evitare errori di connessione.

Configurazione di esempio:

  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

È richiesto un parametro di configurazione aggiuntivo, HTTP_CONTINUE_TIMEOUT, per Vultr.

Configurazione di esempio:

  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

Devi saltare CORS e configuralo manualmente.

Ci sono segnalazioni che indicano che la funzione clean up orphan uploads non funziona correttamente con BackBlaze. Devi modificare le regole di ciclo di vita per il tuo bucket affinché la pulizia degli orfani funzioni.

Configurazione di esempio:

  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

Nota: Durante la migrazione iniziale a B2, potresti raggiungere il limite gratuito giornaliero di 2500 transazioni di classe C. Dovrai aggiungere un metodo di pagamento per rimuovere i limiti.

MinIO Storage Server

Ci sono alcune avvertenze e requisiti che devi assicurarti di soddisfare prima di poter utilizzare il server di storage MinIO come alternativa a S3:

  1. Hai un’istanza del server MinIO completamente configurata
  2. Hai abilitato il supporto dei domini nella configurazione di MinIO, per gli URL degli bucket basati sul dominio. Questo è un requisito obbligatorio per MinIO e Discourse, poiché MinIO supporta ancora gli stili “path” S3 legacy che non sono più supportati in Discourse.
  3. Hai configurato correttamente il DNS per MinIO in modo che i sottodomini degli bucket risolvano correttamente al server MinIO e il server MinIO sia configurato con un dominio di base (in questo caso, minio.example.com)
  4. Il bucket discourse-data esiste sul server MinIO e ha una policy “pubblica” impostata su di esso
  5. Il tuo URL CDN S3 punta a un CDN correttamente configurato che punta al bucket e memorizza nella cache le richieste, come indicato in precedenza in questo documento.
  6. I tuoi CDN sono configurati per utilizzare effettivamente un’intestazione “Host” dell’URL S3 principale - ad esempio, discourse-data.minio.example.com quando recupera i dati - altrimenti può causare problemi CORB.

Assumendo che le avvertenze e i prerequisiti sopra siano soddisfatti, una configurazione di esempio sarebbe qualcosa del genere:

  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 sarà comunque abilitato su MinIO anche se la regola non viene installata dal rebuild dell’app - di default, sembra, CORS è abilitato su tutti i verbi HTTP in MinIO, e MinIO non supporta BucketCORS (API S3) di conseguenza.

Azure Blob Storage con Flexify.IO

Azure Blob Storage non è un servizio compatibile con S3, quindi non può essere utilizzato con Discourse. Esiste un plugin, ma è rotto.

Il modo più semplice per esporre un’interfaccia compatibile con S3 per Azure Blob Storage è aggiungere un server Flexify.IO che traduce il protocollo di archiviazione di Azure in S3.

Al momento della stesura di questo documento, il servizio è gratuito su Azure e hai bisogno solo di un tier VM molto base (economico) per iniziare a eseguirlo. Tuttavia, richiede un po’ di configurazione.

  1. Nel portale di Azure, crea una nuova risorsa di Flexify.IO - Amazon S3 API for Azure Blob Storage.
  2. Per un utilizzo leggero, la configurazione VM minima sembra funzionare bene. Puoi accettare la maggior parte della configurazione predefinita. Ricordati di salvare il file della chiave PEM quando crei la VM.
  3. Naviga al link della VM Flexify.IO e accedi al sistema. Segui le istruzioni impostando il provider di dati Azure Blob Storage e l’endpoint S3 generato. Assicurati che l’impostazione della configurazione dell’endpoint Public read access to all objects in virtual buckets sia vera. Copia l’URL e le chiavi dell’endpoint S3.
  4. Premi New Virtual Bucket e crea un bucket virtuale. Può avere lo stesso nome del tuo contenitore Azure Blob Storage o può essere un nome diverso. Collega qualsiasi contenitore per unirlo a questo bucket virtuale. Questo bucket virtuale viene utilizzato per esporre un bucket leggibile pubblicamente tramite S3.
  5. Di default, Flexify.IO installa un certificato SSL autofirmato, mentre un endpoint S3 richiede HTTPS. Connettiti via SSH alla VM utilizzando il file della chiave (il nome utente è di default azureuser) e sostituisci i seguenti file con quelli corretti:
  • /etc/flexify/ssl/cert.pem - sostituisci con il file del certificato (codifica PEM)

  • /etc/flexify/ssl/key.pem - sostituisci con il file della chiave privata (codifica PKCS#8 PEM, ovvero quello che inizia con BEGIN PRIVATE KEY e non BEGIN RSA PRIVATE KEY che è PKCS#1)

    Questi file sono di root, quindi dovrai usare sudo per sostituirli. È meglio assicurarsi che i file di sostituzione abbiano la stessa proprietà e gli stessi permessi degli originali, ovvero root:root e permesso 600.

  1. Di default, Flexify.IO crea un servizio S3 a livello di root con più bucket. Discourse richiede il supporto dei sottodomini per i bucket. Vai a: <your Flexify.IO VM IP>/flexify-io/manage/admin/engines/configs/1 che aprirà una pagina di configurazione _nascosta`!
  2. Specifica il dominio di base S3 (diciamo s3.mydomain.com) nel campo Endpoint hostname, che dovrebbe essere vuoto di default. Premi Save per salvare l’impostazione.
  3. Riavvia la VM Flexify.IO nel portale di Azure.
  4. Nel tuo DNS, mappa s3.mydomain.com e *.s3.mydomain.com all’IP della VM Flexify.IO.
  5. In Discourse, imposta quanto segue nella pagina di amministrazione (sì, non è necessario che le impostazioni siano in 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>  (qualsiasi contenitore va bene, poiché non richiede accesso in lettura pubblico e Flexify.IO li esporrà automaticamente)
backup location: s3

Non è consigliabile utilizzare lo stesso bucket per produzione e staging. Se lo fai comunque, prendi misure per assicurarti che il tuo sito di staging non elimini le risorse di produzione (imposta almeno s3 disable cleanup e controlla che non elimini i backup di produzione).

Wasabi

@pfaffman ha provato Wasabi per i backup, ma sembrava fallire intermittente e silenziosamente, lasciando i backup sull’hard disk e alla fine riempiendo il disco. Né Wasabi né meta avevano indizi, quindi non lo consiglio, anche se i tuoi risultati potrebbero variare. @pfaffman è ora abbastanza sicuro che questo problema fosse dovuto al fatto che i backup e i riavvii automatici erano in qualche modo programmati nello stesso momento; era usato solo per i backup, ma sembrava funzionare bene. Se qualcuno vuole provarlo e riferire qui, dovrebbe funzionare, almeno per i backup.

Oracle Cloud

Oracle Cloud non supporta l’accesso agli bucket in stile virtual-host e non funzionerà

Cloudflare R2

Per configurare Cloudflare R2, dovrai configurare le impostazioni pertinenti nella dashboard di Cloudflare sotto R2 Object Storage.

A seconda delle tue esigenze (caricamenti o backup o entrambi), queste sono le impostazioni pertinenti da inserire nel tuo file app.yml o nella tua ricerca Admin-All site settings per 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

Se non vuoi modificare il tuo app.yml, puoi farlo nell’interfaccia di amministrazione:

“Admin → All site settings” (cerca S3):

  • Abilita caricamenti S3 = true
  • Abilita caricamenti S3 diretti = true
  • ID chiave di accesso S3 = "xxx"
  • Chiave segreta di accesso S3 = "xxx"
  • Regione S3 = any
  • Bucket di caricamento S3 = your upload bucket name
  • Endpoint S3 = https://<your-account-id>.r2.cloudflarestorage.com
  • URL CDN S3 = https://uploads.yourdomain.com
  • Usa ACL S3 = false (disabilita questo!)
  • Bucket di backup S3 = your backup bucket name
  • Posizione backup = S3

Note:

  1. Permessi del token API: Poiché Discourse ha solo un insieme di campi di credenziali, il token API che generi in Cloudflare deve avere il permesso di accedere sia al tuo bucket di caricamento che al tuo bucket di backup. Quando crei il tuo token, seleziona “Applica a tutti i bucket” o usa “Applica a bucket specifici” e assicurati che entrambi siano selezionati. Inoltre, assicurati di spuntare Object Read & Write quando crei la chiave API (il default è solo Object Read only).

  2. Quando copi l’URL dell’endpoint da Cloudflare, potrebbe aggiungere il nome del bucket all’URL - dovresti eliminare il nome del bucket dalla fine della stringa nel tuo file .yml se viene incollato.

  3. Rimuovi il commento da # DISCOURSE_S3_USE_CDN_URL_FOR_ALL_UPLOADS: true se vuoi utilizzare il tuo bucket di caricamento R2 per tutti i caricamenti, inclusi i file PDF e ZIP. (Nota che questo renderà tutti i file caricati pubblicamente disponibili tramite link diretto)

  4. Se abiliti DISCOURSE_ENABLE_DIRECT_S3_UPLOADS (true), allora dovresti disabilitare DISCOURSE_S3_USE_ACLS (false). Questo perché Cloudflare R2 utilizza permessi a livello di bucket; il tuo bucket di caricamenti dovrebbe essere pubblico e il bucket di backup dovrebbe essere privato. Per i caricamenti Cloudflare R2, NON devi configurare le attività rake delle regole CORS o scrivere IAM json, poiché lo configurerai nella dashboard di Cloudflare quando imposti i permessi del tuo bucket. Il token “Object Read & Write” di Cloudflare concede automaticamente i permessi per i caricamenti multipart, e incollare la seguente regola CORS direttamente nelle impostazioni del bucket di caricamenti R2 nella dashboard di Cloudflare sotto CORS Policy sostituisce la necessità dell’attività rake.

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

Contabo

@tuxed ha provato a far funzionare Contabo Object Storage per i caricamenti compatibili con S3. Sembra che durante il caricamento aggiunga il nome del repository all’URL e non è riuscito a farlo funzionare.

Caricamenti sicuri

I caricamenti sicuri sono supportati solo per AWS S3. Se il tuo rake uploads:migrate_to_s3 fallisce, dovresti inserire questi comandi per prima cosa contare e poi segnare come non sicuri quei caricamenti, dato che sai che non hanno bisogno di essere sicuri, nel qual caso, dovrai utilizzare AWS S3.

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

  1. Oracle Cloud non supporta l’accesso agli bucket in stile virtual-host e non funzionerà ↩︎

69 Mi Piace
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
Upload assets to S3 after in-browser upgrade
What are the right settings to use S3 bucket (with non-Amazon URL)?
Setting up backup and image uploads to Backblaze B2
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
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
[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
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
Setting up backup and image uploads to Backblaze B2
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附件上传成功后,论坛中无法加载出来?
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
Cloudflare R2 Storage Issues
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
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

Ciao a tutti,

Utilizzo lo storage S3 da diversi anni senza una CDN.

Seguendo il consiglio ricevuto in un altro thread, oggi ho configurato la CDN CloudFront.

Prima di aggiungere l’URL della CDN al mio pannello di controllo e rigenerare oltre 230.000 post solo per scoprire di aver impostato male CloudFront e rompere tutto, potreste confermarmi che questo è il comportamento atteso per me? :bowing_man:t2:

Attualmente, ecco un esempio di URL per un’immagine caricata da un utente:

https://greyarrows.s3.dualstack.eu-west-2.amazonaws.com/original/3X/8/3/8335cab232f512f4a979c7f0c8562e149c01b212.png

Che viene visualizzata così:

Il “Domain Name” della mia CloudFront è: d1q8cepst0v8xp.cloudfront.net

Se modifico manualmente l’URL di esempio sopra e sostituisco la parte esistente S3 del nome di dominio con il nome di dominio della mia CloudFront, ottengo:

https://d1q8cepst0v8xp.cloudfront.net/original/3X/8/3/8335cab232f512f4a979c7f0c8562e149c01b212.png

E infatti, l’immagine si carica correttamente:

Quindi, ho ragione a pensare che debba semplicemente aggiungere un URL CDN S3 di d1q8cepst0v8xp.cloudfront.net al mio pannello di controllo Discourse, rigenerare tutti i post e poi rilassarmi in attesa che la magia avvenga?

Grazie in anticipo, la CDN è tutta nuova per me e non ho un ambiente di sviluppo in cui testarla in sicurezza :grimacing:

4 Mi Piace

Ho anche abilitato l’impostazione s3 configure tombstone policy:

Screen Shot 2021-02-14 at 21.08.39

Questo sarà un problema? Dato che ora sto usando una CDN? O le operazioni in background controllano ancora il bucket S3 originale, invece di un URL CDN?

Penso naturalmente che sia quest’ultimo caso, ma non posso permettermi di bloccare i caricamenti di foto di centinaia di migliaia dei miei utenti :scream:

:blush:

2 Mi Piace

La risposta è sì.

Per testare questa teoria, prima di rifare il baking di centinaia di migliaia di post, ho eseguito i seguenti controlli di coerenza:

  • Ho caricato un’immagine
  • Ho modificato l’impostazione dell’URL CDN S3
  • Ho ricostruito l’HTML del mio post di prova (tramite l’interfaccia utente)
  • Ho aggiornato la pagina nel browser
  • Ho controllato la scheda Network della console del browser per confermare che l’immagine venisse caricata tramite CloudFront
  • Ho caricato una nuova immagine di prova in un nuovo post
  • Ho controllato la scheda Network della console del browser per confermare che l’immagine venisse caricata tramite CloudFront

Al momento sto rifacendo il baking di tutti i post :+1:t2:

14 Mi Piace

Grazie per la segnalazione, Richie. Anche io ho utilizzato l’archiviazione immagini di AWS S3 per diversi anni e sono arrivato a questo post tramite il messaggio della console. Tuttavia, la descrizione in alto non menziona il caso in cui si dispone già di S3 e si ha semplicemente bisogno di una CDN.

Per completezza, ecco cosa ho fatto:

  1. Sono andato alla console di AWS, sotto Network and Content Delivery ho selezionato CloudFront.
  2. Ho cliccato sul pulsante Create distribution.
  3. Ho compilato il modulo abbastanza intuitivo; l’unica cosa che dovevo davvero fare era selezionare il bucket AWS S3 contenente le immagini dal menu a discesa.
  4. Ho aspettato qualche istante il completamento della configurazione di CloudFront.
  5. Un dominio <gibberish>.cloudfront.net è apparso nella colonna “Domain Name” dell’elenco delle distribuzioni CloudFront.
  6. Ho copiato e incollato quel dominio nel campo s3 cdn url nelle impostazioni File dell’amministrazione del mio sito.
  7. Ho eseguito alcuni test:
    a. Ho creato un nuovo post con un’immagine caricata e ho confermato che era su CloudFront.
    b. Ho cliccato su Rebuild HTML su alcuni post esistenti con immagini a caso e ho visto che sono stati ricostruiti con immagini cloudfront.net.
  8. Poiché tutto sembrava funzionare correttamente, ho avviato un rebake, che ha richiesto diverse ore dato che ora ho circa mezzo milione di post:
./launcher enter app
# rake posts:rebake
  1. Tutto sembra funzionare bene. Ha inserito un sacco di job nella coda di Sidekiq, uno per ogni post a quanto pare, che richiederanno alcuni giorni per essere elaborati, ma sta già lavorando su di essi a blocchi.
18 Mi Piace

Sei sicuro che sia così? Questo sito utilizza asset da CDN e non abbiamo dovuto svuotare la cache. Inoltre, si tratta di una modifica EmberCli che non dovrebbe influire sulla produzione :thinking:

5 Mi Piace

Oh, quei dannati ottimizzatori. Ti consiglierei di disabilitarli se possibile, dato che Discourse include già configurazioni ottimali per ogni risorsa. Questi ottimizzatori sono ottimi quando si ospita un software web “black box” degli anni 2000, ma falliscono miseramente con le tecnologie moderne. Inoltre, persino il famoso ottimizzatore di Cloudflare spesso rompe Discourse, quindi non mi faccio troppe speranze per gli altri. Potrebbero funzionare un giorno e rompere tutto il giorno dopo, lasciando tutti i visitatori con una pagina vuota. Tutto questo senza alcun beneficio.

6 Mi Piace

C’è la possibilità che tu abbia abilitato secure_uploads nelle impostazioni del sito?

Sembra anche che questo problema sia stato segnalato e risolto oggi a causa della compatibilità con Discourse:

6 Mi Piace

C’è un modo per disabilitare questo avviso che appare sulla mia dashboard di amministrazione?

Il server è configurato per caricare file su S3, ma non è configurato nessun CDN S3.

Ho avuto problemi a configurare un CDN S3, ma non mi costa un occhio della testa, quindi mi va bene usare direttamente S3. Tuttavia, mi piacerebbe molto che questa notifica scomparisse, poiché sono pienamente consapevole delle conseguenze.

2 Mi Piace

Ciao.

Voglio solo dare un aggiornamento. Ora saremo in grado di configurare il backup utilizzando GCS. L’ho pubblicato anche in un altro thread. Spero che questo possa aiutare altre persone che hanno cercato con difficoltà questa soluzione.

Come fare?
Abilita la configurazione predefinita per il backup (o puoi impostarla dal pannello di amministrazione).

DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backup
DISCOURSE_BACKUP_LOCATION: s3

Quindi imposta i permessi del bucket come Storage Legacy Object Owner:

  1. Vai al tuo progetto nella Google Cloud Console
  2. Seleziona Storage
  3. Seleziona il tuo bucket
  4. Vai alla scheda Permessi
  5. Aggiungi un nuovo permesso, inserisci l’email del tuo account di servizio con il tuo account. Per i ruoli, seleziona Storage Legacy Object Owner
  6. Salva ed è fatto.

Scusa per il doppio post, volevo solo condividere questo buon aggiornamento.
Grazie

5 Mi Piace

Sarebbe fantastico se poteste aggiungere anche Wasabi

1 Mi Piace

Ho usato Wasabi per i backup per un po’. Per quanto riguarda la configurazione, “ha funzionato semplicemente”, quindi potresti provarlo se vuoi.

Tuttavia, con una certa frequenza i backup fallivano in modo silenzioso e rimanevano sul computer locale, riempiendo il disco. Ho esaminato gli errori di Wasabi e di Discourse, ma non ho mai trovato una spiegazione che permettesse a una delle due parti di “risolvere” qualcosa.

Non lo consiglio, poiché non sono sicuro che sia “eccellente.”

2 Mi Piace

Grazie!
Controllerò come va questa volta.
La frequenza di backup predefinita è di 7 giorni tra un backup e l’altro, con un massimo di 5 backup.
Condividerò come va.

1 Mi Piace

Facevo backup quotidiani; non ricordo quanti ne volessi conservare, ma l’hard disk locale aveva spazio solo per un paio.

2 Mi Piace

Quale archiviazione consiglieresti personalmente?
Non credo che AWS e Azure siano convenienti per progetti personali.
Non sono sicuro riguardo ad Azure, ma AWS sembra confuso e imprevedibile…

1 Mi Piace

Speravo che Wasahi fosse almeno buono per i backup. Backblaze S3 è conveniente. Non credo di averlo usato per gli upload, ma funziona per i backup (credo). Penso che l’unico problema con Backblaze sia che (l’ultima volta che l’ho testato) dovevi usare una chiave globale (quindi non potevo usarla per clienti che potevano vedere la chiave). Credo che qualcuno abbia recentemente pubblicato una soluzione per questo (qualcosa del tipo “legacy” da qualche parte). Per un progetto personale, è quello che proverei dopo, credo. (E se sei su Digital Ocean, Spaces va bene, credo.)

3 Mi Piace

Io uso DO, ma in termini di costi Blackblaze/Wasabi è più economico.
Cosa hai usato per i caricamenti?

1 Mi Piace

Scusa, non riesco a capire.
Perché dobbiamo specificare le impostazioni in app.yml, dato che possiamo inserire queste informazioni direttamente da Discourse > Impostazioni?

1 Mi Piace

A causa di come gestisce la creazione degli asset quando il contenitore viene costruito, credo. È piuttosto confuso che il comportamento sia diverso quando le impostazioni sono nelle variabili d’ambiente rispetto al database, ma è così che funziona. È anche un modo migliore per gestirle, poiché significa che puoi creare e ripristinare un nuovo sito dalla riga di comando.

4 Mi Piace

Dove devo impostarlo? Non riesco a trovarlo nelle impostazioni di amministrazione di Discourse?

1 Mi Piace