Konfigurieren Sie einen S3-kompatiblen Objektspeicheranbieter für Uploads

Musste das vorerst parken, da es so aussah, als würde es funktionieren, aber dann gibt es etwas Seltsames mit R2 in Bezug auf die Inhaltskodierung mit den Assets, entweder beim Hochladen und Nichtsetzen des Headers oder etwas anderem. Es stürzt mit einem ‘Ungültiges oder unerwartetes Token’ ab, wenn das gz-Asset etwas wie browser-detect-7af298cd000a967d2bdc01b04807eda2924a388584ea38ad84919b726283c2ed.gz.js ist. Der rake s3:upload_assets scheint zu funktionieren, aber die Dateien werden auf der Browserseite nicht richtig gelesen.

Ich verstehe nicht wirklich, warum bei AWS S3 die lokale Server-URL für Assets in Ordnung ist (sie existieren nicht in unserem vorhandenen S3-Bucket für Uploads), aber für R2 die DISCOURSE_S3_CDN_URL nur für Assets verwendet werden soll. Wenn ich die Assets von der Server-URL erzwingen könnte, würde das wahrscheinlich alles funktionieren.

EDIT: Im Chat mit CF scheint dies das Problem zu sein, und ab heute, warum R2 ohne einige Änderungen nicht mit Discourse verwendet werden kann. Ich könnte im Post-Hook-Schritt etwas skripten, um die gz-Assets zu entfernen, aber ich fühle mich für einen Tag schon “weit vom Weg abgekommen”:

Dateien, die Sie zippen, werden derzeit von R2 nicht korrekt behandelt. Sie müssen unkomprimierte Dateien hochladen. Cloudflare hat transparente Komprimierung, sie wählen Identität, Gzip oder Brotli basierend darauf, was der Client verarbeiten kann. Dies ist ein Unterschied zu S3.

2 „Gefällt mir“

Gute Arbeit! Und das ist eine klare Botschaft von Cloudflare, warum es nicht funktionieren wird. Vielen Dank. Ich werde das bald in die OP kopieren.

2 „Gefällt mir“

Vielen Dank nochmals! Ich habe die OP aktualisiert:

3 „Gefällt mir“

Vielen Dank für die Erstellung dieser Anleitung! Ich hatte einige Erfolge mit Minio.

Für alle anderen, die versuchen, es lokal mit Docker Compose einzurichten, können Sie Docker anweisen, einen Hostnamen-Alias hinzuzufügen, damit es als Subdomain funktioniert, wie hier:

  minio:
    image: minio/minio
    command: server --console-address :9001 /data
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - ./data/minio:/data
    environment:
      MINIO_DOMAIN: minio.mydomain.com
    networks:
      default:
        aliases:
          - assets.minio.mydomain.com

In diesem Fall würden Sie DISCOURSE_S3_ENDPOINT=http://minio.mydomain.com:9000, DISCOURSE_S3_CDN_URL=//assets.minio.mydomain.com:9000 festlegen und Ihre lokale /etc/hosts/-Datei so konfigurieren, dass die Subdomain auf localhost verweist.

Dies funktioniert größtenteils gut, aber ich habe bemerkt, dass Discourse keine Dateien von einer Adresse herunterladen kann, die nicht über Port 80 oder 443 verfügt. Das Hochladen eines Bildes funktioniert also, aber wenn es dann versucht, es herunterzuladen, um es zu verkleinern, schlägt es fehl.

Ich dachte, es wäre gut, dies im Minio-Abschnitt oder in der Zusammenfassung zu erwähnen, dass die DISCOURSE_S3_CDN_URL Port 80 oder 443 haben muss.

4 „Gefällt mir“

Hallo @Falco – Bezieht sich das auf die Art und Weise, wie der Header Content-Encoding: gzip mit ihrem Spaces CDN funktioniert? Das klingt ähnlich wie bei Cloudflare R2, da der Asset-Standort dem Upload-CDN entspricht, sodass gzip kaputt geht? Hier ist was heute mit R2 passiert.

Es könnte sich lohnen, einen Schalter für dieses Verhalten in Betracht zu ziehen, d. h. Assets vom Ursprung zu servieren, anstatt immer DISCOURSE_S3_CDN_URL? Ich werde gerne nachsehen, wie das geht, wenn dies als mögliche Konfigurationsänderung in Betracht gezogen würde.

3 „Gefällt mir“

Das ist es, was passieren sollte, wenn Sie DISCOURSE_S3_CDN_URL weglassen, aber da es sich um einen seltsamen Grenzfall und einen potenziell teuren Fehler handelt, ist es keine gängige Konfiguration.

3 „Gefällt mir“

Ja, das verstehe ich. Ein neuer GlobalSetting-Boolescher Wert S3_ORIGIN_ASSETS (oder S3_BROKEN_PROXY_FUDGE :slight_smile:) ungefähr hier, so ähnlich wie die Testskripte nicht komprimiert sind würde es Digital Ocean Spaces und Cloudflare R2 Speicher und CDN ermöglichen, mit Discourse sofort zu funktionieren, was eine nette Funktionserweiterung für wenig Aufwand ist? Vielleicht für zukünftige Überlegungen. :heart_eyes_cat:

4 „Gefällt mir“

Oh, ich habe in den Release Notes für 3.0.beta gesehen, dass etwas hinzugefügt wurde. Ich werde es ausprobieren, es sei denn, ich missverstehe, wofür es ist? Es könnte Cloudflare R2 und Digital Ocean Spaces ermöglichen, mit ihren CDNs verwendet zu werden, die diese seltsamen Dinge mit gzip machen.

1 „Gefällt mir“

Nein, das ist nicht relevant.

3 „Gefällt mir“

Die Einstellung ermöglichte es mir, den lokalen Standort als Ursprung anzugeben, um die Notwendigkeit zu umgehen, dass die JS-Assets auf der S3-Site liegen (in diesem Fall Cloudflare oder Digital Ocean Spaces mit aktiviertem CDN). Danke an @david für die Änderung, auch wenn das nicht die Absicht war.

4 „Gefällt mir“

Geben Sie die Website-URL für das Asset-CDN ein? Clever!

1 „Gefällt mir“

Hallo Leute, weiß jemand, ob das mit Discourse zusammenhängen könnte?

Das ist der XML-Code der Dateien, die wir versucht haben, in unseren zuvor „mit Discourse funktionierenden“ S3-Speicher hochzuladen:

<Error>
<Code>InvalidArgument</Code>
<Message>
Requests specifying Server Side Encryption with AWS KMS managed keys require AWS Signature Version 4.
</Message>
<ArgumentName>Authorization</ArgumentName>
<ArgumentValue>null</ArgumentValue>
<RequestId>ID</RequestId>
<HostId>
ID
</HostId>
</Error>
1 „Gefällt mir“

Verwenden Sie AWS? Etwas anderes?

Ist dieser Bucket mit serverseitiger Verschlüsselung konfiguriert?

Es könnte sein, dass eine Bibliothek aktualisiert wurde und sich anders verhält.

2 „Gefällt mir“

Danke, ich habe noch einmal nachgeprüft und es scheint mit der automatischen Konfiguration zu funktionieren, aber nicht mit der Verwaltung meiner eigenen Schlüssel aus der S3-Verwaltung.

Wissen Sie, ob dies innerhalb von Discourse möglich ist?

1 „Gefällt mir“

3 Beiträge wurden in ein neues Thema aufgeteilt: Why run UpdatePostUploadsSecureStatus even when secure uploads is disabled?

Dies scheint kürzlich behoben worden zu sein.
In der Änderungsprotokoll vom 16.03.2023 wird eine Fehlerbehebung für die Handhabung von Gzip-Dateien aufgeführt.

Wir betreiben unser Discourse-Forum unter discourse.aosus.org mit R2 (haben migrate_to_s3 noch nicht ausgeführt), und es scheint in Ordnung zu sein! Bisher sind keine nennenswerten Probleme aufgetreten.

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: "us-east-1" #Alias zu Auto
  #DISCOURSE_S3_INSTALL_CORS_RULE: true #Es sollte unterstützt werden
  DISCOURSE_S3_ENDPOINT: S3_API_URL
  DISCOURSE_S3_ACCESS_KEY_ID: xxx
  DISCOURSE_S3_SECRET_ACCESS_KEY: xxxx
  DISCOURSE_S3_CDN_URL: Ihre CDN-URL
  DISCOURSE_S3_BUCKET: BUCKET_NAME

Gibt es eine Möglichkeit, einen separaten Host für Backups anzugeben? Es wäre großartig, wenn es möglich wäre, R2 nur für CDN-Zwecke zu verwenden.

2 „Gefällt mir“

Nein, das gibt es nicht. Es erscheint mir unwahrscheinlich, dass sich das ändern wird.

1 „Gefällt mir“

23 Beiträge wurden in ein neues Thema aufgeteilt: Probleme bei der Konfiguration des Objektspeichers

Es ist seltsam, dass die Einstellungen in ENV nicht in der Admin-Benutzeroberfläche angezeigt werden. Findet eine Überschreibung statt? Überschreiben neue Einstellungen von S3 in der Admin-Benutzeroberfläche diejenigen in der Umgebung?

1 „Gefällt mir“

Ja. Umgebungsvariablen überschreiben Werte in der Datenbank und werden in der Benutzeroberfläche ausgeblendet.

4 „Gefällt mir“