Dieses Thema beschreibt, wie einige gängige S3-kompatible Object Storage-Anbieter (S3-Klone) konfiguriert werden. Weitere Details 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* |
| Selbst gehostet | MinIO | Ja |
| Azure Blob Storage | Flexify.IO | Ja |
| Oracle Cloud | Object Storage | Nein [1] |
| Wasabi | Object Storage | Vielleicht |
| Cloudflare | R2 | Nein |
| Contabo | Object Storage | Nein |
Wenn Sie einen anderen Dienst erfolgreich eingerichtet 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 auch ein CDN, um die im Bucket gespeicherten Inhalte auszuliefern. Ich habe bei meinen Tests StackPath CDN verwendet. Abgesehen von der Einstellung Dynamic Caching By Header: Accept-Encoding in deren Konfiguration funktioniert es einwandfrei.
DISCOURSE_CDN_URL ist ein CDN, das auf Ihren Discourse-Hostnamen verweist 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 verweist 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 in 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 der Task zum Hochladen von Assets nach der Kompilierung der Assets, was bei einem Neuaufbau geschieht. Wenn Sie ein Discourse starten möchten, das von Anfang an ordnungsgemäß mit Object Storage funktioniert, müssen Sie die Umgebungsvariablen so setzen, dass die Assets hochgeladen werden, bevor der Start erfolgt.
Wählen Sie Ihren Anbieter aus der folgenden Liste und fügen Sie diese Einstellungen zum 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 eignet sich ebenfalls, um die Bucket-Dateien zu fronten. Informationen zur korrekten Konfiguration der Berechtigungen finden Sie unter Set up file and image uploads to S3.
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 sofort. Es ist in Ordnung, die Einschränkung der Dateilistung zu aktivieren. Das einzige Problem ist, dass ihr CDN-Angebot schrecklich defekt ist, sodass Sie ein anderes CDN für die Dateien verwenden müssen. Außerdem dürfen Sie die CORS-Regel nicht installieren, da sie bei jedem Neuaufbau 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
Das Auflisten von Dateien ist defekt, sodass Sie eine zusätzliche ENV benötigen, um dies zu überspringen, damit Assets funktionieren. Überspringen Sie auch CORS und konfigurieren Sie es manuell.
Da Sie keine Dateien auflisten können, können Sie auch keine Backups auflisten, und automatische Backups werden fehlschlagen. Wir empfehlen daher nicht, es 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. Weitere Informationen zur Google Cloud-spezifischen Diskussion finden Sie in diesem Thema.
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 im Großen und Ganzen funktioniert alles einwandfrei.
Scaleway-Multipart-Uploads unterstützen nur maximal 1.000 Teile. Dies entspricht nicht Amazon S3, das maximal 10.000 Teile 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; wenn Sie diese Grenze ändern möchten, sollten Sie sich an sie wenden.
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 die 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 ordnungsgemäß 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 anfänglichen 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 Beschränkungen zu entfernen.
MinIO Storage Server
Es gibt einige Einschränkungen und Anforderungen, die erfüllt sein müssen, bevor Sie den MinIO-Storage-Server als Alternative zu S3 verwenden können:
- Sie haben eine vollständig konfigurierte MinIO-Server-Instanz.
- Sie haben die Domain-Unterstützung in der MinIO-Konfiguration für domainbasierte Bucket-URLs aktiviert. Dies ist eine zwingende Voraussetzung für MinIO und Discourse, da MinIO immer noch die veralteten S3-„Path“-Stile unterstützt, die in Discourse nicht mehr unterstützt werden.
- Sie haben die DNS-Konfiguration für MinIO ordnungsgemäß eingerichtet, sodass Bucket-Subdomains ordnungsgemäß auf den MinIO-Server aufgelöst werden, und der MinIO-Server ist mit einer Basisdomain konfiguriert (in diesem Fall
minio.example.com). - Der Bucket
discourse-dataexistiert auf dem MinIO-Server und hat eine „public“-Richtlinie darauf festgelegt. - Ihre S3-CDN-URL verweist auf ein ordnungsgemäß konfiguriertes CDN, das auf den Bucket zeigt und Anfragen zwischenspeichert, wie weiter oben in diesem Dokument erwähnt.
- Ihre CDNs sind so konfiguriert, dass sie tatsächlich einen „Host“-Header der Kern-S3-URL verwenden – beispielsweise
discourse-data.minio.example.com, wenn Daten abgerufen werden – andernfalls kann dies zu CORB-Problemen führen.
Unter der Annahme, dass die oben genannten Einschränkungen und Voraussetzungen erfüllt sind, könnte 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 bleibt auf MinIO aktiviert, auch wenn die Regel nicht vom App-Rebuilder installiert wird – standardmäßig scheint CORS bei 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 defekt.
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.
- Erstellen Sie im Azure-Portal eine neue Ressource von
Flexify.IO - Amazon S3 API for Azure Blob Storage. - 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 beim Erstellen der VM zu speichern.
- Navigieren Sie zum Flexify.IO-VM-Link und geben Sie das System ein. Folgen Sie den Anweisungen, indem Sie den Azure Blob Storage-Datenanbieter und den generierten S3-Endpunkt einrichten. Stellen Sie sicher, dass die Endpunktkonfigurationseinstellung
Public read access to all objects in virtual bucketsauf true gesetzt ist. Kopieren Sie die S3-Endpunkt-URL und die Schlüssel. - 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 integrieren. Dieser virtuelle Bucket wird verwendet, um einen öffentlich lesbaren Bucket über S3 bereitzustellen.
- Standardmäßig installiert Flexify.IO ein selbstsigniertes SSL-Zertifikat, während ein S3-Endpunkt HTTPS erfordert. SSHen Sie sich mit der Schlüsseldatei in die VM ein (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 mitBEGIN PRIVATE KEYbeginnt und nicht mitBEGIN RSA PRIVATE KEY, was PKCS#1 ist)Diese Dateien gehören root, sodass Sie
sudoverwenden müssen, um sie zu ersetzen. Am besten stellen Sie sicher, dass die Ersatzdateien denselben Besitz und dieselben Berechtigungen wie die Originaldateien haben, alsoroot:rootund600.
- 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, wodurch eine versteckte Konfigurationsseite geöffnet wird! - Geben Sie die S3-Basisdomain (sagen wir
s3.mydomain.com) im FeldEndpoint hostnameein, das standardmäßig leer sein sollte. Drücken Sie Save, um die Einstellung zu speichern. - Starten Sie die Flexify.IO-VM im Azure-Portal neu.
- Ordnen Sie in Ihrem DNS
s3.mydomain.comund*.s3.mydomain.comder Flexify.IO-VM-IP zu. - Setzen Sie in Discourse Folgendes auf der Admin-Seite (ja, es ist nicht erforderlich, dass die Einstellungen in
app.ymlstehen):
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 funktioniert, da kein öffentlicher Lesezugriff erforderlich ist und Flexify.IO sie automatisch bereitstellt)
backup location: s3
Die Verwendung desselben Buckets für Produktion und Staging wird nicht empfohlen. Wenn Sie es dennoch tun, ergreifen 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 versagen, wodurch Backups auf der Festplatte blieben und schließlich die Festplatte füllten. Weder Wasabi noch Meta hatten irgendwelche Hinweise, daher empfehle ich es nicht, obwohl Ihre Ergebnisse variieren können. @pfaffman ist sich jetzt 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
Das Angebot von Cloudflare ist inkompatibel. Bei Tests reichte @fearlessfrog ein Ticket bei Cloudflare ein, und im Dezember 2022 hieß es:
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.
Secure Uploads
Secure 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, 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)
Oracle Cloud unterstützt keinen virtuellen Host-Zugriff auf Buckets und funktioniert nicht. ↩︎

