Konfigurieren Sie einen S3-kompatiblen Object-Storage-Anbieter für Uploads

<div data-theme-toc="true"

:information_source: Dieses Thema behandelt die Konfiguration einiger gängiger S3-kompatibler Object-Storage-Anbieter (S3-Klone). Weitere Details zur Konfiguration von Amazon AWS S3, das offiziell unterstützt und intern von Discourse für unsere Hosting-Dienste verwendet wird, findest du unter Set up file and image uploads to S3.

Anbieter Dienstname Funktioniert mit Discourse?
Amazon AWS S3 Ja
Digital Ocean Spaces Ja
Linode Object Storage Ja
Google Cloud Storage Ja
Scaleway Object Storage Ja
Vultr Object Storage Ja
BackBlaze Cloud Storage Ja*
Selbst gehostet MinIO Ja
Azure Blob Storage Flexify.IO Ja
Oracle Cloud Object Storage Nein [1]
Wasabi Object Storage Vielleicht
Cloudflare R2 Ja
Contabo Object Storage Nein

Falls du einen anderen Dienst zum Laufen bekommen hast, füge ihn bitte dieser Wiki-Seite hinzu.

Konfiguration

Um statische Discourse-Assets in deinem Object Storage zu speichern, füge diese Konfiguration in deiner app.yml unter dem Abschnitt hooks hinzu:

  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

Bei der Nutzung von Object Storage benötigst du außerdem ein CDN, um die im Bucket gespeicherten Inhalte auszuliefern. Ich habe StackPath CDN bei meinen Tests verwendet; abgesehen davon, dass man dort Dynamic Caching By Header: Accept-Encoding in der Konfiguration setzen muss, funktioniert es gut.

DISCOURSE_CDN_URL ist ein CDN, das auf deinen Discourse-Hostnamen verweist und Anfragen zwischenspeichert. Es wird hauptsächlich für pullbare Assets verwendet: CSS und andere Theme-Assets.

DISCOURSE_S3_CDN_URL ist ein CDN, das auf deinen Object-Storage-Bucket verweist und Anfragen zwischenspeichert. Es wird hauptsächlich für pushbare Assets verwendet: JS, Bilder und Benutzer-Uploads.

Wir empfehlen, dass diese beiden URLs unterschiedlich sind und Administratoren beide setzen.

Die Nicht-Nutzung eines CDN (oder das Eingeben der Bucket-URL als CDN-URL) führt wahrscheinlich zu Problemen und wird nicht unterstützt.

In den folgenden Beispielen ist https://falcoland-files-cdn.falco.dev ein CDN, das so konfiguriert ist, dass es die Dateien unter dem Bucket ausliefert. Der Bucket-Name wurde in meinen Beispielen auf falcoland-files gesetzt.

Das Konfigurieren dieser Einstellungen als Umgebungsvariablen in deiner app.yml wird empfohlen, da dies die Vorgehensweise von CDCK in ihrer Infrastruktur ist und daher gut getestet ist. Außerdem findet der Task zum Hochladen der Assets nach der Kompilierung der Assets statt, was bei einem Rebuild geschieht. Wenn du ein Discourse-Setup starten möchtest, das von Anfang an korrekt mit Object Storage funktioniert, musst du die Umgebungsvariablen setzen, damit die Assets hochgeladen werden, bevor die Seite startet.

Wähle deinen Anbieter aus der untenstehenden Liste und füge diese Einstellungen zum Abschnitt env deiner app.yml-Datei hinzu, wobei du die Werte entsprechend anpasst:

AWS S3

Das ist das, was wir offiziell unterstützen und intern verwenden. Ihr CDN-Angebot Cloudfront funktioniert ebenfalls, um die Bucket-Dateien auszuliefern. Siehe Set up file and image uploads to S3, wie man die Berechtigungen richtig konfiguriert.

  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

Das Angebot von DO ist gut und funktioniert out-of-the-box. Es ist in Ordnung, „Restrict File Listing“ zu aktivieren. Das einzige Problem ist, dass ihr CDN-Angebot schrecklich fehlerhaft ist, sodass du ein anderes CDN für die Dateien verwenden musst. Außerdem solltest du die CORS-Regel nicht installieren lassen, da sie bei jedem Rebuild neu installiert wird.

Beispielkonfiguration:

  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

Für Linode ist ein zusätzlicher Konfigurationsparameter, HTTP_CONTINUE_TIMEOUT, erforderlich.

Beispielkonfiguration:

  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

Das Auflisten von Dateien ist fehlerhaft, daher benötigst du eine zusätzliche ENV-Variable, um dies zu überspringen, damit die Assets funktionieren. Überspringe auch CORS und konfiguriere es manuell.

:warning: Da du keine Dateien auflisten kannst, wirst du auch keine Backups auflisten können, und automatische Backups werden fehlschlagen; wir empfehlen daher, es nicht für Backups zu verwenden. Einige schlagen jedoch vor, dass Backups korrekt funktionieren, wenn man die Rolle von Storage Legacy Object Owner zu Storage Legacy Bucket Owner ändert. Siehe dieses Thema für eine Google-Cloud-spezifische Diskussion.

Es gibt ein Drittanbieter-Plugin, um die Integration zu verbessern: Discourse GCS Helper.

Beispielkonfiguration:

  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

Das Angebot von Scaleway ist ebenfalls sehr gut, und im Großen und Ganzen funktioniert alles einwandfrei.

:warning: Scaleway-Multipart-Uploads unterstützen maximal 1.000 Teile. Dies stimmt nicht mit Amazon S3 überein, das maximal 10.000 Teile unterstützt. Bei größeren Instanzen wird dies dazu führen, dass Discourse-Backups fehlerhaft sind, und der unvollständige Upload muss vor weiteren Versuchen manuell gelöscht werden. Bei kleinen Instanzen ist dies jedoch kein Problem. Scaleway scheint sehr offen für Feedback zu sein, daher solltest du sie kontaktieren, wenn du möchtest, dass dieses Limit geändert wird.

Beachte, dass für den Parameter DISCOURSE_S3_ENDPOINT Discourse den Endpunkt der gesamten Region verwendet: https://s3.{region}.scw.cloud. Der „Bucket-Endpunkt“, den du in deinem Scaleway-Dashboard findest, hat die Form https://{bucketName}.s3.{region}.scw.cloud. Lass den Bucket-Namen als Subdomain weg, um Verbindungsfehler zu vermeiden.

Beispielkonfiguration:

  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

Für Vultr ist ein zusätzlicher Konfigurationsparameter, HTTP_CONTINUE_TIMEOUT, erforderlich.

Beispielkonfiguration:

  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

Du musst CORS überspringen und es manuell konfigurieren.

Es gibt Berichte, dass clean up orphan uploads mit BackBlaze nicht korrekt funktioniert. Du musst die Lebenszyklusregeln für deinen Bucket ändern, damit die Bereinigung von Waisen-Uploads funktioniert.

Beispielkonfiguration:

  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

Hinweis: Während der ersten Migration zu B2 kannst du das Limit von 2500 kostenlosen Daily Class C Transaktionen erreichen. Du musst eine Zahlungsmethode hinzufügen, um die Limits zu entfernen.

MinIO Storage Server

Es gibt einige Einschränkungen und Anforderungen, die du erfüllen musst, bevor du den MinIO Storage Server als Alternative zu S3 verwenden kannst:

  1. Du hast eine vollständig konfigurierte MinIO Server-Instanz.
  2. Du hast Domain-Support in der MinIO-Konfiguration aktiviert, für domänenbasierte Bucket-URLs. Dies ist eine obligatorische Einrichtungsvoraussetzung für MinIO und Discourse, da MinIO immer noch die veralteten S3-„Path“-Styles unterstützt, die in Discourse nicht mehr unterstützt werden.
  3. Du hast die DNS-Konfiguration für MinIO richtig eingerichtet, sodass Bucket-Subdomains korrekt zum MinIO-Server auflösen und der MinIO-Server mit einer Basis-Domain konfiguriert ist (in diesem Fall minio.example.com).
  4. Der Bucket discourse-data existiert auf dem MinIO-Server und hat eine „public“-Richtlinie.
  5. Deine S3-CDN-URL verweist auf ein korrekt konfiguriertes CDN, das auf den Bucket verweist und Anfragen zwischenspeichert, wie zuvor in diesem Dokument beschrieben.
  6. Deine CDNs sind so konfiguriert, dass sie tatsächlich einen „Host“-Header der Kern-S3-URL verwenden – zum Beispiel discourse-data.minio.example.com, wenn sie Daten abrufen – andernfalls kann es zu CORB-Problemen kommen.

Unter der Annahme, dass die oben genannten Einschränkungen und Voraussetzungen erfüllt sind, könnte eine Beispielkonfiguration so aussehen:

  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 wird auf MinIO weiterhin aktiviert sein, auch wenn die Regel nicht vom App-Rebuilder installiert wird – standardmäßig scheint CORS auf allen HTTP-Verben in MinIO aktiviert zu sein, und MinIO unterstützt BucketCORS (S3-API) infolgedessen nicht.

Azure Blob Storage mit Flexify.IO

Azure Blob Storage ist kein S3-kompatibler Dienst und kann daher nicht mit Discourse verwendet werden. Es gibt ein Plugin, aber es ist fehlerhaft.

Der einfachste Weg, eine S3-kompatible Schnittstelle für Azure Blob Storage freizulegen, ist das Hinzufügen eines Flexify.IO-Servers, der das Azure-Storage-Protokoll in S3 übersetzt.

Zum Zeitpunkt dieses Schreibens ist der Dienst auf Azure kostenlos, und du benötigst nur eine sehr grundlegende (günstige) VM-Ebene, um ihn zum Laufen zu bringen. Er erfordert jedoch etwas Einrichtung.

  1. Erstelle im Azure-Portal eine neue Ressource vom Typ Flexify.IO - Amazon S3 API for Azure Blob Storage.
  2. Für leichte Nutzung scheint die minimale VM-Konfiguration gut zu funktionieren. Du kannst die meisten Standardeinstellungen akzeptieren. Denk daran, die PEM-Schlüsseldatei zu speichern, wenn du die VM erstellst.
  3. Gehe zum Link der Flexify.IO-VM und melde dich im System an. Folge den Anweisungen, indem du den Azure Blob Storage Data Provider und den generierten S3-Endpunkt einrichtest. Stelle sicher, dass die Endpunktkonfigurationseinstellung Public read access to all objects in virtual buckets auf true gesetzt ist. Kopiere die S3-Endpunkt-URL und die Schlüssel.
  4. Drücke Neuer virtueller Bucket und erstelle einen virtuellen Bucket. Er kann denselben Namen wie dein Azure Blob Storage-Container haben oder einen anderen Namen. Verknüpfe beliebige Container, die in diesen virtuellen Bucket verschmolzen werden sollen. Dieser virtuelle Bucket wird verwendet, um einen öffentlich lesbaren Bucket über S3 freizulegen.
  5. Standardmäßig installiert Flexify.IO ein selbstsigniertes SSL-Zertifikat, während ein S3-Endpunkt HTTPS erfordert. SSH dich in die VM mit der Schlüsseldatei ein (der Benutzername ist standardmäßig azureuser) und ersetze die folgenden Dateien durch die korrekten Dateien:
  • /etc/flexify/ssl/cert.pem – ersetze durch Zertifikatsdatei (PEM-Codierung)

  • /etc/flexify/ssl/key.pem – ersetze durch privaten Schlüsseldatei (PKCS#8 PEM-Codierung, das ist diejenige, die mit BEGIN PRIVATE KEY und nicht BEGIN RSA PRIVATE KEY beginnt, was PKCS#1 ist)

    Diese Dateien gehören root, also musst du sudo verwenden, um sie zu ersetzen. Es ist am besten, sicherzustellen, dass die Ersatzdateien dieselben Eigentums- und Berechtigungseinstellungen wie die Originaldateien haben, also root:root und 600-Berechtigungen.

  1. Standardmäßig erstellt Flexify.IO einen S3-Dienst auf Root-Ebene mit mehreren Buckets. Discourse erfordert Subdomain-Unterstützung für Buckets. Gehe zu: <deine Flexify.IO VM IP>/flexify-io/manage/admin/engines/configs/1, was eine versteckte Konfigurationsseite öffnet!
  2. Gib die S3-Basis-Domain (sagen wir s3.mydomain.com) im Feld Endpoint hostname an, das standardmäßig leer sein sollte. Drücke Speichern, um die Einstellung zu speichern.
  3. Starte die Flexify.IO-VM im Azure-Portal neu.
  4. Mappe in deinem DNS s3.mydomain.com und *.s3.mydomain.com auf die Flexify.IO-VM-IP.
  5. Setze in Discourse Folgendes auf der Admin-Seite (ja, es ist nicht erforderlich, dass die Einstellungen in app.yml stehen):
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>  (jeder Container wird ausreichen, da er keinen öffentlichen Lesezugriff erfordert und Flexify.IO sie automatisch freilegt)
backup location: s3

Die Verwendung desselben Buckets für Produktion und Staging wird nicht empfohlen. Wenn du es trotzdem tust, ergreife Maßnahmen, um sicherzustellen, dass deine Staging-Site deine Produktions-Assets nicht löscht (setze mindestens s3 disable cleanup und achte darauf, dass sie keine Produktions-Backups löscht).

Wasabi

@pfaffman hat Wasabi für Backups ausprobiert, aber es schien intermittierend und stillschweigend zu fehlschlagen, ließ Backups auf der Festplatte und füllte diese schließlich auf. Weder Wasabi noch meta hatten irgendwelche Hinweise, daher empfehle ich es nicht, obwohl deine Ergebnisse variieren können. @pfaffman ist jetzt ziemlich sicher, dass dieses Problem dadurch verursacht wurde, dass Backups und automatische Neustarts irgendwie zur gleichen Zeit geplant waren; es wurde nur für Backups verwendet, schien aber gut zu funktionieren. Wenn jemand es ausprobieren und hier berichten möchte, sollte es funktionieren, zumindest für Backups.

Oracle Cloud

Oracle Cloud unterstützt keinen Virtual-Host-Style-Zugriff auf Buckets und wird nicht funktionieren

Cloudflare R2

Cloudflare R2 ist mit S3-Object-Storage kompatibel, wenn man Cloudflare CDN verwendet. Cloudflares kostenloser Plan bietet 10 GB Speicherplatz, was für die Bedürfnisse der meisten Foren mehr als ausreichend sein sollte.

Um Cloudflare R2 zu konfigurieren, musst du die relevanten Einstellungen im Cloudflare-Dashboard unter R2 Object Storage konfigurieren.

Je nach deinen Anforderungen (Uploads oder Backups oder beides) sind dies die relevanten Einstellungen, die du in deine app.yml-Datei oder in deine Admin-All site settings (suche nach S3) einfügen musst:

  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

Wenn du deine app.yml nicht bearbeiten möchtest, kannst du dies in der Admin-UI tun:

„Admin → Alle Site-Einstellungen“ (suche nach S3):

  • S3-Uploads aktivieren = true
  • Direkte S3-Uploads aktivieren = true
  • S3-Zugriffsschlüssel-ID = "xxx"
  • S3-geheimer Zugriffsschlüssel = "xxx"
  • S3-Region = any
  • S3-Upload-Bucket = dein Upload-Bucket-Name
  • S3-Endpunkt = https://<your-account-id>.r2.cloudflarestorage.com
  • S3-CDN-URL = https://uploads.yourdomain.com
  • S3 ACLs verwenden = false (deaktiviere dies!)
  • S3-Backup-Bucket = dein Backup-Bucket-Name
  • Backup-Standort = S3

Wichtige Hinweise zur Konfiguration von Cloudflare R2:

  1. Wenn du deine app.yml oder web_only.yml für Cloudflare R2 konfigurierst, setze nur die DISCOURSE_S3_CDN_URL. Setze NICHT DISCOURSE_CDN_URL. Wenn du deine Hauptdomain über Cloudflare proxyt, werden deine App-Assets bereits automatisch zwischengespeichert und ausgeliefert. Wenn du versuchst, eine separate DISCOURSE_CDN_URL über Cloudflare DNS zu konfigurieren, wird Discourses strikte NGINX-Host-Routing die Anfragen ablehnen, was zu endlosen 301-Umleitungs-Schleifen, CORS-Richtlinien-Blockierungen und einer defekten Site führt.
  • Lass DISCOURSE_CDN_URL auskommentiert.
  • Setze DISCOURSE_S3_CDN_URL: https://your-r2-custom-domain.com
  1. API-Token-Berechtigungen: Da Discourse nur einen Satz von Anmeldeinformationsfeldern hat, muss das API-Token, das du in Cloudflare generierst, Berechtigungen zum Zugriff auf deinen Upload-Bucket und deinen Backup-Bucket haben. Wähle beim Erstellen deines Tokens entweder „Auf alle Buckets anwenden“ oder „Auf bestimmte Buckets anwenden“ und stelle sicher, dass beide ausgewählt sind. Stelle außerdem sicher, dass du Object Read & Write beim Erstellen des API-Schlüssels auswählst (standardmäßig ist nur Object Read only ausgewählt).

  2. Wenn du die Endpunkt-URL von Cloudflare kopierst, kann der Bucket-Name an die URL angehängt werden – du solltest den Bucket-Namen vom Ende der Zeichenfolge in deiner .yml-Datei (oder Admin-Einstellungen) löschen, wenn er kopiert wird.

  3. Kommentiere # DISCOURSE_S3_USE_CDN_URL_FOR_ALL_UPLOADS: true aus, wenn du deinen R2-Upload-Bucket für alle Uploads, einschließlich PDF- und ZIP-Dateien, verwenden möchtest. (Beachte, dass dies alle hochgeladenen Dateien über direkten Link öffentlich verfügbar macht)

  4. Wenn du DISCOURSE_ENABLE_DIRECT_S3_UPLOADS (true) aktivierst, solltest du DISCOURSE_S3_USE_ACLS (false) deaktivieren. Dies liegt daran, dass Cloudflare R2 Bucket-Ebenen-Berechtigungen verwendet; dein Upload-Bucket sollte öffentlich und der Backup-Bucket privat sein. Für Cloudflare R2-Uploads musst du NICHT die CORS-Regeln-Rake-Tasks konfigurieren oder IAM-JSON schreiben, da du es im Cloudflare-Dashboard konfigurierst, wenn du deine Bucket-Berechtigungen einrichtest. Cloudflares „Object Read & Write“-Token gewährt automatisch Multipart-Upload-Berechtigungen, und das Einfügen der folgenden CORS-Regel direkt in die Cloudflare-Dashboard-R2-Upload-Bucket-Einstellungen unter CORS Policy ersetzt die Notwendigkeit für die Rake-Task.

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

Siehe auch dieses Thema für weitere Informationen zur Einrichtung von Cloudflare: Using Discourse with Cloudflare: Best Practices

Contabo

@tuxed hat versucht, Contabo Object Storage für S3-kompatible Uploads zum Laufen zu bringen. Es scheint, dass beim Hochladen der Repository-Name in der URL vorangestellt wird, und er konnte es nicht zum Laufen bringen.

Sichere Uploads

Sichere Uploads werden nur für AWS S3 unterstützt. Wenn dein rake uploads:migrate_to_s3 fehlschlägt, solltest du diese Befehle eingeben, um zuerst zu zählen und dann diese Uploads als unsicher zu markieren, vorausgesetzt, du weißt, dass sie nicht sicher sein müssen; in diesem Fall musst du AWS S3 verwenden.

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

  1. Oracle Cloud unterstützt keinen Virtual-Host-Style-Zugriff auf Buckets und wird nicht funktionieren ↩︎

69 „Gefällt mir“
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