Konfigurieren Sie einen S3-kompatiblen Objektspeicheranbieter für Uploads

:information_source: Dieses Thema behandelt die Konfiguration einiger gängiger S3-kompatibler Object Storage-Anbieter (S3-Klone). Weitere Einzelheiten zur Konfiguration von Amazon AWS S3, die offiziell unterstützt wird und von Discourse intern für unsere Hosting-Dienste verwendet wird, finden Sie 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*
Self-hosted 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

Wenn Sie einen anderen Dienst zum Laufen gebracht haben, fügen Sie ihn bitte diesem Wiki hinzu.

Konfiguration

Um statische Discourse-Assets in Ihrem Object Storage zu speichern, fügen Sie diese Konfiguration in Ihrer 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 Verwendung von Object Storage benötigen Sie zudem ein CDN, um die im Bucket gespeicherten Inhalte auszuliefern. Ich habe bei meinen Tests StackPath CDN verwendet; abgesehen davon, dass ich in deren Konfiguration Dynamic Caching By Header: Accept-Encoding einstellen musste, funktioniert es einwandfrei.

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

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

Wir empfehlen, dass diese unterschiedlich sind, und dass Administratoren beide einstellen.

Die Nichtverwendung eines CDNs (oder die Eingabe 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.

Es wird empfohlen, diese Einstellungen als Umgebungsvariablen in Ihrer app.yml zu konfigurieren, da dies die Methode ist, die CDCK in ihrer Infrastruktur verwendet, und daher gut getestet ist. Außerdem erfolgt die Aufgabe zum Hochladen von Assets nach der Kompilierung der Assets, was bei einem Rebuild geschieht. Wenn Sie ein Discourse-System starten möchten, das von Anfang an ordnungsgemäß mit Object Storage funktioniert, müssen Sie die Umgebungsvariablen so setzen, dass die Assets vor dem Start der Site hochgeladen werden.

Wählen Sie Ihren Anbieter aus der folgenden Liste aus und fügen Sie diese Einstellungen dem Abschnitt env Ihrer app.yml-Datei hinzu, wobei Sie die Werte entsprechend anpassen:

AWS S3

Das, was wir offiziell unterstützen und intern verwenden. Ihr CDN-Angebot Cloudfront funktioniert ebenfalls, um die Bucket-Dateien zu fronten. Siehe Set up file and image uploads to S3, wie Sie die Berechtigungen korrekt konfigurieren.

  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 DO-Angebot ist gut und funktioniert out-of-the-box. Es ist in Ordnung, die Einschränkung der Dateiauflistung zu aktivieren. Das einzige Problem ist, dass ihr CDN-Angebot schrecklich fehlerhaft ist, sodass Sie ein anderes CDN für die Dateien verwenden müssen. Außerdem müssen Sie die CORS-Regel nicht installieren, da sie bei jedem Rebuild erneut 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

Die Auflistung von Dateien ist fehlerhaft, sodass Sie eine zusätzliche ENV benötigen, um dies zu überspringen, damit Assets funktionieren können. Überspringen Sie auch CORS und konfigurieren Sie es manuell.

:warning: Da Sie keine Dateien auflisten können, können Sie auch keine Backups auflisten, und automatische Backups werden fehlschlagen. Wir empfehlen daher nicht, sie für Backups zu verwenden. Einige schlagen jedoch vor, dass Backups korrekt funktionieren, wenn Sie die Rolle von „Storage Legacy Object Owner“ in „Storage Legacy Bucket Owner“ ändern. Siehe dieses Thema für eine Google Cloud-spezifische Diskussion.

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

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 Scaleway-Angebot ist ebenfalls sehr gut, und alles funktioniert größtenteils einwandfrei.

:warning: Scaleway-Multipart-Uploads unterstützen nur ein Maximum von 1.000 Teilen. Dies entspricht nicht Amazon S3, das ein Maximum von 10.000 Teilen unterstützt. Bei größeren Instanzen führt dies dazu, dass Discourse Backups fehlschlagen, und der unvollständige Upload muss möglicherweise manuell gelöscht werden, bevor weitere Versuche unternommen werden. Für kleine Instanzen ist dies jedoch kein Problem. Scaleway scheint sehr offen für Feedback zu sein, also wenn Sie diese Grenze geändert haben möchten, sollten Sie sie kontaktieren.

Beachten Sie, dass Discourse für den Parameter DISCOURSE_S3_ENDPOINT den Endpunkt der gesamten Region verwendet: https://s3.{region}.scw.cloud. Der im Scaleway-Dashboard gefundene „Bucket-Endpunkt“ hat das Format https://{bucketName}.s3.{region}.scw.cloud. Lassen Sie das Bucket-Name-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

Sie müssen CORS überspringen und es manuell konfigurieren.

Es gibt Berichte, dass „clean up orphan uploads“ bei BackBlaze nicht korrekt funktioniert. Sie müssen die Lebenszyklusregeln für Ihren Bucket ändern, damit die Bereinigung von Waisen 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 initialen Migration zu B2 können Sie auf das Limit von 2.500 kostenlosen täglichen Class-C-Transaktionen stoßen. Sie müssen eine Zahlungsmethode hinzufügen, um die Limits zu entfernen.

MinIO Storage Server

Es gibt einige Fallstricke und Anforderungen, die erfüllt sein müssen, bevor Sie den MinIO-Storage-Server als Alternative zu S3 verwenden können:

  1. Sie verfügen über eine vollständig konfigurierte MinIO-Serverinstanz.
  2. Die Domain-Unterstützung ist in der MinIO-Konfiguration für domainspezifische Bucket-URLs aktiviert. Dies ist eine zwingende Einrichtungsvoraussetzung für MinIO und Discourse, da MinIO immer noch die veralteten S3-„Path“-Stile unterstützt, die in Discourse nicht mehr unterstützt werden.
  3. Sie haben die DNS-Konfiguration ordnungsgemäß für MinIO eingerichtet, sodass Bucket-Subdomains ordnungsgemäß auf den MinIO-Server aufgelöst werden und der MinIO-Server mit einer Basisdomain konfiguriert ist (in diesem Fall minio.example.com).
  4. Der Bucket discourse-data existiert auf dem MinIO-Server und hat eine „public“-Richtlinie darauf gesetzt.
  5. Ihre S3-CDN-URL zeigt auf ein ordnungsgemäß konfiguriertes CDN, das auf den Bucket zeigt und Anfragen zwischenspeichert, wie zuvor in diesem Dokument angegeben.
  6. Ihre 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 dies zu CORB-Problemen führen.

Unter der Annahme, dass die oben genannten Fallstricke und Voraussetzungen erfüllt sind, würde eine Beispielkonfiguration wie folgt 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 ist auf MinIO weiterhin aktiviert, 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 daher kein BucketCORS (S3-API).

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 bereitzustellen, besteht darin, einen Flexify.IO-Server hinzuzufügen, der das Azure Storage-Protokoll in S3 übersetzt.

Zum Zeitpunkt dieses Schreibens ist der Dienst auf Azure kostenlos, und Sie benötigen nur eine sehr grundlegende (günstige) VM-Tier, um ihn zu starten. Es erfordert jedoch etwas Einrichtung.

  1. Erstellen Sie im Azure-Portal eine neue Ressource von Flexify.IO - Amazon S3 API for Azure Blob Storage.
  2. Für eine leichte Nutzung scheint die minimale VM-Konfiguration gut zu funktionieren. Sie können die meisten Standardkonfigurationen akzeptieren. Vergessen Sie nicht, die PEM-Schlüsseldatei zu speichern, wenn Sie die VM erstellen.
  3. Navigieren Sie zum Flexify.IO-VM-Link und betreten Sie das System. Folgen Sie den Anweisungen, um den Azure Blob Storage-Datenanbieter und den generierten S3-Endpunkt einzurichten. Stellen Sie sicher, dass die Endpunkt-Konfigurationseinstellung „Öffentlicher Lesezugriff auf alle Objekte in virtuellen Buckets“ auf true gesetzt ist. Kopieren Sie die S3-Endpunkt-URL und die Schlüssel.
  4. Drücken Sie New Virtual Bucket und erstellen Sie einen virtuellen Bucket. Er kann denselben Namen wie Ihr Azure Blob Storage-Container haben oder ein anderer Name sein. Verknüpfen Sie beliebige Container, um sie in diesen virtuellen Bucket zu mergen. Dieser virtuelle Bucket wird verwendet, um einen öffentlich lesbaren Bucket über S3 bereitzustellen.
  5. Standardmäßig installiert Flexify.IO ein selbstsigniertes SSL-Zertifikat, während ein S3-Endpunkt HTTPS erfordert. Verbinden Sie sich per SSH mit der VM unter Verwendung der Schlüsseldatei (der Benutzername ist standardmäßig azureuser) und ersetzen Sie die folgenden Dateien durch die korrekten Dateien:
  • /etc/flexify/ssl/cert.pem – ersetzen Sie durch die Zertifikatsdatei (PEM-Kodierung)

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

    Diese Dateien gehören root, sodass Sie sudo verwenden müssen, um sie zu ersetzen. Am besten stellen Sie sicher, dass die Ersatzdateien denselben Besitz und dieselben Berechtigungen wie die Originaldateien haben, was root:root und 600 bedeutet.

  1. Standardmäßig erstellt Flexify.IO einen S3-Dienst auf Root-Ebene mit mehreren Buckets. Discourse erfordert die Unterstützung von Subdomains für Buckets. Gehen Sie zu: Ihre Flexify.IO-VM-IP/flexify-io/manage/admin/engines/configs/1, was eine versteckte Konfigurationsseite öffnet!
  2. Geben Sie die S3-Basisdomain (sagen wir s3.mydomain.com) im Feld „Endpoint hostname“ ein, das standardmäßig leer sein sollte. Drücken Sie Save, um die Einstellung zu speichern.
  3. Starten Sie die Flexify.IO-VM im Azure-Portal neu.
  4. Ordnen Sie in Ihrem DNS s3.mydomain.com und *.s3.mydomain.com der Flexify.IO-VM-IP zu.
  5. Setzen Sie in Discourse Folgendes auf der Admin-Seite (ja, die Einstellungen müssen nicht in app.yml sein):
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>  (beliebiger Container ist in Ordnung, da er keinen öffentlichen Lesezugriff erfordert und Flexify.IO sie automatisch bereitstellt)
backup location: s3

Die Verwendung desselben Buckets für Produktion und Staging wird nicht empfohlen. Wenn Sie es trotzdem tun, treffen Sie Maßnahmen, um sicherzustellen, dass Ihre Staging-Site Ihre Produktions-Assets nicht löscht (setzen Sie mindestens s3 disable cleanup und achten Sie darauf, dass sie nicht die Backups der Produktion löscht).

Wasabi

@pfaffman hat Wasabi für Backups ausprobiert, aber es schien intermittierend und stillschweigend zu fehlschlagen, wodurch Backups auf der Festplatte verblieben und schließlich die Festplatte voll liefen. Weder Wasabi noch Meta hatten Hinweise, daher empfehle ich es nicht, obwohl Ihre Erfahrungen abweichen können. @pfaffman ist sich nun ziemlich sicher, dass dieses Problem darauf zurückzuführen war, dass Backups und automatische Neustarts irgendwie gleichzeitig 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 virtuellen Host-Zugriff auf Buckets und funktioniert nicht.

Cloudflare R2

Um Cloudflare R2 zu konfigurieren, müssen Sie die relevanten Einstellungen im Cloudflare-Dashboard unter R2 Object Storage konfigurieren.

Je nach Ihren Anforderungen (Uploads oder Backups oder beides) sind dies die relevanten Einstellungen, die Sie in Ihre app.yml-Datei einfügen oder in Ihren Admin-All site settings nach S3 suchen können:

  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 Sie Ihre app.yml nicht bearbeiten möchten, können Sie dies in der Admin-UI tun:

„Admin → All site settings“ (nach S3 suchen):

  • Enable S3 uploads = true
  • Enable direct S3 uploads = true
  • S3 access key ID = "xxx"
  • S3 secret access key = "xxx"
  • S3 region = any
  • S3 upload bucket = your upload bucket name
  • S3 endpoint = https://<your-account-id>.r2.cloudflarestorage.com
  • S3 CDN URL = https://uploads.yourdomain.com
  • S3 use ACLs = false (dies deaktivieren!)
  • S3 backup bucket = your backup bucket name
  • Backup location = S3

Hinweise:

  1. API-Token-Berechtigungen: Da Discourse nur ein Satz von Anmeldeinformationsfeldern hat, muss das API-Token, das Sie in Cloudflare generieren, Berechtigungen haben, um sowohl auf Ihren Upload-Bucket als auch auf Ihren Backup-Bucket zuzugreifen. Wenn Sie Ihr Token erstellen, wählen Sie entweder „Auf alle Buckets anwenden“ oder verwenden Sie „Auf bestimmte Buckets anwenden“ und stellen Sie sicher, dass beide angehakt sind. Stellen Sie außerdem sicher, dass Sie beim Erstellen des API-Schlüssels Object Read & Write auswählen (standardmäßig ist nur Object Read only aktiviert).

  2. Beim Kopieren der Endpunkt-URL von Cloudflare kann der Bucket-Name an die URL angehängt werden – Sie sollten den Bucket-Namen am Ende der Zeichenfolge in Ihrer .yml-Datei löschen, wenn er eingefügt wird.

  3. Kommentieren Sie # DISCOURSE_S3_USE_CDN_URL_FOR_ALL_UPLOADS: true aus, wenn Sie Ihren R2-Upload-Bucket für alle Uploads verwenden möchten, einschließlich PDF- und ZIP-Dateien. (Beachten Sie, dass dies alle hochgeladenen Dateien über einen direkten Link öffentlich verfügbar macht.)

  4. Wenn Sie DISCOURSE_ENABLE_DIRECT_S3_UPLOADS (true) aktivieren, sollten Sie DISCOURSE_S3_USE_ACLS (false) deaktivieren. Dies liegt daran, dass Cloudflare R2 Bucketebene-Berechtigungen verwendet; Ihr Upload-Bucket sollte öffentlich und Ihr Backup-Bucket privat sein. Für Cloudflare R2-Uploads müssen Sie die CORS-Regel-Rake-Aufgaben nicht konfigurieren oder IAM-JSON schreiben, da Sie dies im Cloudflare-Dashboard konfigurieren, wenn Sie Ihre Bucket-Berechtigungen einrichten. Das Cloudflare-„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 der Rake-Aufgabe.

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

Contabo

@tuxed hat versucht, Contabo Object Storage für S3-kompatible Uploads zu verwenden. 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 Ihr rake uploads:migrate_to_s3 fehlschlägt, sollten Sie diese Befehle eingeben, um zuerst zu zählen und dann als nicht-sicher zu markieren, welche Uploads dies sind, vorausgesetzt, Sie wissen, dass sie nicht sicher sein müssen, in welchem Fall Sie AWS S3 verwenden müssen.

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

  1. Oracle Cloud unterstützt keinen virtuellen Host-Zugriff auf Buckets und funktioniert nicht. ↩︎

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

Hallo zusammen,

ich verwende S3-Speicher seit mehreren Jahren ohne CDN.

Nach dem Rat, den ich in einem anderen Thread erhalten habe, habe ich heute CloudFront CDN eingerichtet.

Bevor ich die CDN-URL zu meinem Kontrollpanel hinzufüge und über 230.000 Beiträge neu rendern lasse, nur um festzustellen, dass ich eine CloudFront-Einstellung falsch gemacht habe und alles kaputt mache, kann mir jemand bitte bestätigen, dass dieses Verhalten für mich zu erwarten ist? :bowing_man:t2:

Derzeit ist dies eine Beispiel-URL für ein von einem Benutzer hochgeladenes Bild:

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

Das wird so angezeigt:

Mein CloudFront-„Domain Name“ lautet: d1q8cepst0v8xp.cloudfront.net

Wenn ich meine obige Beispiel-URL manuell bearbeite und den vorhandenen S3-Teil des Domainnamens durch den Domainnamen meines CloudFront-Domains ersetze, erhalte ich:

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

Und tatsächlich wird das Bild weiterhin korrekt geladen:

Denke ich also richtig, dass ich einfach eine S3-CDN-URL von d1q8cepst0v8xp.cloudfront.net zu meinem Discourse-Kontrollpanel hinzufügen, alle Beiträge neu rendern und mich dann einfach zurücklehnen und auf die Magie warten muss?

Vielen Dank im Voraus, CDN ist für mich alles neu, und ich habe keine Entwicklungsumgebung, in der ich dies sicher testen könnte :grimacing:

4 „Gefällt mir“

Ich habe auch die Einstellung s3 configure tombstone policy aktiviert:

Screen Shot 2021-02-14 at 21.08.39

Wird das ein Problem sein? Da ich jetzt stattdessen ein CDN verwende? Oder prüfen Dinge im Hintergrund immer noch den ursprünglichen S3-Bucket und nicht eine CDN-URL?

Ich gehe natürlich vom Letzteren aus, aber ich kann es mir wirklich nicht leisten, die Foto-Uploads von Hunderttausenden meiner Benutzer zu zerstören :scream:

:blush:

2 „Gefällt mir“

Die Antwort lautet ja.

Um diese Theorie zu testen, habe ich vor dem Neu-Rendering von Hunderttausenden von Beiträgen folgende Plausibilitätsprüfungen durchgeführt:

  • Ein Bild hochgeladen
  • Die S3-CDN-URL-Einstellung geändert
  • Den HTML-Code meines Testbeitrags neu aufgebaut (über die Benutzeroberfläche)
  • Die Seite im Browser aktualisiert
  • Den Netzwerk-Tab der Browserkonsole überprüft, um zu bestätigen, dass das Bild über Cloudfront geladen wird
  • Ein neues Testbild in einem neuen Beitrag hochgeladen
  • Den Netzwerk-Tab der Browserkonsole erneut überprüft, um zu bestätigen, dass das Bild über Cloudfront geladen wird

Ich bin gerade dabei, alle Beiträge neu zu rendern :+1:t2:

14 „Gefällt mir“

Danke für den Bericht, Richie. Ich habe ebenfalls seit mehreren Jahren AWS S3 für die Bildspeicherung im Einsatz und bin über die Konsolenmeldung auf diesen Beitrag gestoßen. Die Beschreibung oben erwähnt jedoch nichts über den Fall, dass man bereits S3 nutzt und lediglich ein CDN benötigt.

Hier ist zur Information, was ich getan habe:

  1. Ich bin in die AWS-Konsole gegangen und habe unter Network and Content Delivery CloudFront ausgewählt.
  2. Ich habe auf den Button „Create distribution
18 „Gefällt mir“

Bist du dir da sicher? Diese Seite hier nutzt Assets von einem CDN, und wir mussten den Cache nicht leeren. Es ist zudem eine EmberCli-Änderung, die die Produktion nicht beeinflussen sollte :thinking:

5 „Gefällt mir“

Oh, diese verdammten Optimierer. Ich würde dir raten, diese zu deaktivieren, falls möglich, da Discourse bereits optimale Konfigurationen für jede Ressource mitbringt. Diese Optimierer sind großartig, wenn du eine Blackbox-Websoftware aus den 2000er-Jahren hostest, aber sie versagen kläglich bei modernen Anwendungen. Selbst der bekannte Optimierer von Cloudflare bringt Discourse oft zum Absturz, also habe ich keine Hoffnungen für andere. Sie funktionieren vielleicht einen Tag und brechen am nächsten, und alle deine Besucher sehen nur eine leere Seite. Alles für null Vorteile.

6 „Gefällt mir“

Haben Sie secure_uploads in den Site-Einstellungen aktiviert?

Außerdem scheint dies heute aufgrund der Discourse-Kompatibilität gemeldet und behoben worden zu sein:

6 „Gefällt mir“

Gibt es eine Möglichkeit, diese Warnung auf meinem Admin-Dashboard zu deaktivieren?

Der Server ist so konfiguriert, dass Dateien an S3 hochgeladen werden, aber es ist kein S3-CDN konfiguriert.

Ich hatte Probleme beim Einrichten eines S3-CDNs, aber da die Kosten nicht ins Gewicht fallen, bin ich damit einverstanden, einfach direkt S3 zu nutzen. Was ich mir jedoch wünschen würde, ist, dass diese Benachrichtigung verschwindet, da mir die Konsequenzen voll bewusst sind.

2 „Gefällt mir“

Hallo.

Ich möchte nur ein Update geben. Wir können jetzt Backups mit GCS einrichten. Ich habe dies auch in einem anderen Thread gepostet. Ich hoffe, das hilft anderen, die verzweifelt nach dieser Lösung suchen.

Wie geht das?
Aktivieren Sie die Standardkonfiguration für Backups (oder Sie können dies über das Admin-Dashboard einstellen).

DISCOURSE_S3_BACKUP_BUCKET: falcoland-files/backup
DISCOURSE_BACKUP_LOCATION: s3

Stellen Sie dann die Bucket-Berechtigungen auf Storage Legacy Object Owner ein:

  1. Gehen Sie in der Google Cloud Console zu Ihrem Projekt.
  2. Wählen Sie „Storage“.
  3. Wählen Sie Ihren Bucket aus.
  4. Wechseln Sie zum Tab „Berechtigungen“.
  5. Fügen Sie eine neue Berechtigung hinzu, geben Sie Ihre Service-Account-E-Mail-Adresse ein und wählen Sie für die Rollen Storage Legacy Object Owner aus.
  6. Speichern Sie die Änderungen – fertig.

Entschuldigen Sie den doppelten Beitrag, ich wollte nur dieses gute Update teilen.
Vielen Dank.

5 „Gefällt mir“

Es wäre toll, wenn du auch Wasabi hinzufügen könntest…

1 „Gefällt mir“

Ich habe eine Weile Wasabi für Backups verwendet. Was die Konfiguration angeht, hat es einfach funktioniert, also könntest du es gerne ausprobieren.

Allerdings sind die Backups mit einiger Häufigkeit stillschweigend fehlgeschlagen und blieben auf dem lokalen Rechner, wodurch die Festplatte vollgelaufen ist. Ich habe die Wasabi- und Discourse-Protokolle untersucht, aber nie eine Erklärung gefunden, die es irgendeiner Seite ermöglicht hätte, etwas zu „reparieren".

Ich kann es nicht empfehlen, da ich nicht sicher bin, ob es wirklich „großartig" ist.

2 „Gefällt mir“

Danke!
Ich werde prüfen, wie es diesmal läuft.
Die Standard-Häufigkeit für Backups beträgt 7 Tage zwischen den Backups, mit maximal 5 Backups.
Ich teile mit, wie es läuft.

1 „Gefällt mir“

Ich habe tägliche Backups erstellt; ich erinnere mich nicht mehr genau, wie viele ich behalten wollte, aber die lokale Festplatte bot Platz für nur ein paar.

2 „Gefällt mir“

Welchen Speicher würdest du persönlich empfehlen?
Ich glaube nicht, dass AWS und Azure für private Projekte erschwinglich sind.
Bei Azure bin ich mir nicht sicher, aber AWS wirkt verwirrend und unvorhersehbar.

1 „Gefällt mir“

Ich hatte gehofft, dass Wasahi zumindest für Backups gut sein würde. Backblaze S3 ist erschwinglich. Ich glaube nicht, dass ich es für Uploads verwendet habe, aber für Backups funktioniert es (glaube ich). Das einzige Problem mit Backblaze ist meiner Meinung nach, dass man (bei meinem letzten Test) einen globalen Schlüssel verwenden musste (also konnte ich ihn nicht für Clients nutzen, die den Schlüssel einsehen konnten). Ich glaube, jemand hat kürzlich eine Lösung dafür gepostet (etwas mit „Legacy“ irgendwo). Für ein persönliches Projekt wäre das das, was ich als Nächstes versuchen würde. (Und wenn du bei Digital Ocean bist, sind Spaces in Ordnung, glaube ich.)

3 „Gefällt mir“

Ich nutze DO, aber Blackblaze/Wasabi ist preislich günstiger.
Was hast du für Uploads verwendet?

1 „Gefällt mir“

Entschuldigung, ich habe es nicht verstanden.
Warum müssen wir Einstellungen in app.yml angeben, wenn wir diese Informationen über Discourse → Einstellungen eingeben können?

1 „Gefällt mir“

Ich denke, das liegt an der Art und Weise, wie beim Erstellen des Containers die Build-Artefakte verarbeitet werden. Es ist zwar verwirrend, dass sich das Verhalten unterscheidet, je nachdem, ob die Einstellungen in Umgebungsvariablen oder in der Datenbank liegen, aber so funktioniert es. Es ist jedoch auch eine bessere Methode, da Sie damit eine neue Site über die Befehlszeile erstellen und wiederherstellen können.

4 „Gefällt mir“

Wo soll ich diesen einstellen? Ich kann ihn in den Discourse-Admin-Einstellungen nicht finden?

1 „Gefällt mir“