Fehler beim Wiederaufbau mit Minio als Objektspeicher

Neuerstellung der Anzeige bei Verwendung von Minio als Objektspeicher

I, [2022-09-01T00:37:48.192311 #1]  INFO -- : cd /var/www/discourse && sudo -E -u discourse bundle exec rake s3:upload_assets
rake aborted!
Aws::S3::Errors::BadRequest: Ein Fehler ist beim Parsen der HTTP-Anfrage PUT unter '/' aufgetreten.

Ich habe mehrere Domains für Minio konfiguriert

minio.example.com (als Minio-Zugriffskonsole)
s3.example.com (als Minio-API)

Auch der Bucket-Name wurde hinzugefügt
bucket.s3.example.com (als Minio-API)

Alle Domains sind ordnungsgemäß authentifiziert und versuchen, sich mit Cyberduck über s3.example.com oder bucket.s3.example.com mit dem Konto zu verbinden. Dies ist für den Upload und Download von Dateien verfügbar.

Meine app.yml S3-Einstellungen

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: anything
  discourse_s3_endpoint: https://s3.example.com
  DISCOURSE_S3_ACCESS_KEY_ID: *****
  DISCOURSE_S3_SECRET_ACCESS_KEY: ********
  #Discourse_s3_cdn_url: 
  DISCOURSE_S3_BUCKET: bucket
  DISCOURSE_S3_BACKUP_BUCKET: bucket/backups
  DISCOURSE_BACKUP_LOCATION: S3

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets

Ich habe verwandte Probleme durchsucht und sie nicht gelöst. Es funktioniert einwandfrei, wenn Vultr Object Storage verwendet wird. Funktioniert Minio also nicht gut mit Discourse zusammen, obwohl ich gesehen habe, dass Leute Minio erfolgreich einsetzen. Ich bitte alle um Hilfe, ich glaube, dieses Problem wird bald gelöst sein.

1 „Gefällt mir“

Haben Sie Object Storage für Uploads verwenden (S3 & Klone) befolgt?

2 „Gefällt mir“

Ja, ich habe es mir mehrmals angesehen und auch Grundlegende Anleitung zur Verwendung des MinIO-Speicherservers für Ihre Discourse-Instanz angesehen.

Das Problem wurde nicht gelöst. Was mich stört, ist, dass die Verbindung zum MinIO-Konto über das Amazon S3-Transportprotokoll von Cyberduck verfügbar ist und ich denke, dass meine MinIO-Einstellungen gut zu funktionieren scheinen.

1 „Gefällt mir“

Haben Sie bestätigt, dass Ihre MinIO-Konfiguration generell mit anderen Mechanismen wie dem MinIO-Client oder dem ? funktioniert. Und dass Sie die richtigen URLs und Konfigurationen gegen MinIO verwenden?

Mein Vorschlag ist, stellen Sie zuerst sicher, dass alles mit den MinIO- und s3cmd-Befehlszeilenclients kompatibel ist – ich habe noch nie von diesem „Cyberduck“-Client gehört (aus gutem Grund: er ist für Windows und Mac, ich bin ein Linux-Typ), und ich kann nicht bestätigen, dass er mit MinIO und anderen Dingen kompatibel ist, da er auf seinem Ding „AWS S3“ angibt und wahrscheinlich für die vollständige S3-API bei Amazon entwickelt wurde, nicht für S3-kompatible/kompatible Elemente. Richten Sie den Minio-Client (mcli) auf der Befehlszeile auf oder in der Nähe der Box ein, mit der Sie arbeiten möchten, und versuchen Sie dann, eine Datei manuell in Ihre Buckets zu pushen.

Beachten Sie außerdem, dass DISCOURSE_S3_BACKUP_BUCKET mit MinIO als eigener Bucket konzipiert ist, nicht als Unterpfad innerhalb eines vorhandenen Buckets (soweit ich weiß). Es ist möglich, dass dies auch die aktuelle Einrichtung beeinträchtigt. Deshalb ist es in dem Beispiel, das ich geschrieben habe, und in dem Link zu meinem „How to“, den Sie bereitgestellt haben, als separater Bucket aufgeführt.

Was ich hier nicht habe, sind Informationen über die spezifische Anfrage, die tatsächlich gestellt wurde – den URL-Pfad usw., der vom System verwendet wurde, als es diese Anfrage mit dem BadRequest stellte. Es sieht so aus, als ob das daran liegt, dass es nur Protokollierung auf INFO-Ebene ist. Gibt es keine Möglichkeit, während des rake-Prozesses eine Debug-Protokollierung zu erhalten, @pfaffman (oder andere, die mit der Discourse-Seite besser vertraut sind)?

STELLEN SIE AUCH SICHER, dass Sie DISCOURSE_S3_INSTALL_CORS_RULE: false für Ihre Discourse-Konfiguration übergeben – wenn der App-Rebuilder/Baker versucht, CORS-Regeln zu pushen, führt dies zu einer Fehlermeldung.

2 „Gefällt mir“

Ich habe mit mcli einen neuen Bucket erstellt und manuell eine Datei in den Bucket gesendet

Ich sehe die gesendete Datei im Bucket. Bedeutet das, dass ich Minio korrekt installiert habe? Ich habe Minio mit Docker Compose und meiner docker-compose.yml-Datei installiert


version: '3'

services:
  minio:
    image: minio/minio:latest
    container_name: minio
    restart: always
    ports:
      - "9000:9000"
      - "9001:9001"
    
    volumes:
      - ./:/data

    environment:
      MINIO_ROOT_USER: ***** 
      MINIO_ROOT_PASSWORD: *****
      MINIO_SERVER_URL: https://s3.example.com
      MINIO_BROWSER_REDIRECT_URL: https://minio.example.com/

    command: server --console-address ":9001" /data

volumes:
  minio:

Dann gehe ich zur Webkonsole, erstelle zwei neue Buckets und setze die Zugriffsberechtigung für den Objektspeicher auf öffentlich

Ich verwende Nginx Proxy Manager, um minio.example.com an Port 9001 und s3.example.com und bucket-name.example.com an Port 9000 weiterzuleiten

DISCOURSE_S3_BACKUP_BUCKET: Ich habe versucht, einen separaten Bucket zu verwenden und die Domainnamen-Weiterleitung an Port 9000 für den Bucket konfiguriert, aber es funktioniert nicht

Welche Ports werden weitergeleitet? 80/443, damit HTTP/HTTPS funktioniert? Das ist alles, was benötigt wird. Sie sollten NIEMALS Port 9000 auf einem separaten Port konfigurieren müssen. Der separate Bucket hat denselben Endpunkt wie s3.example.com – es ist nichts Separates, also machen Sie diese Konfiguration falsch. Vergessen Sie auch nicht, dass Sie im MinIO-Jargon bei Verwendung der Pfadauthentifizierung s3.example.com/BUCKETNAME erhalten würden oder bei DNS-Authentifizierung, wie Sie sie verwenden sollten, BUCKET.s3.example.com für die URL-Endpunkte, die Sie auf der Nginx-Seite akzeptieren und an den internen Port 9000 weiterleiten müssen. Sie müssen dies nicht auf Ihrer Seite konfigurieren, das muss auf der MinIO-Seite konfiguriert werden.

Der MinIO-Client unterstützt sowohl die Einrichtung im path- als auch im dns-Stil. Soweit ich weiß, verwendet Discourse einen URL-basierten Mechanismus zur Bucket-Identifizierung, keine Pfad-basierten Setups (fühlen Sie sich frei, mich zu korrigieren, Discourse-Entwickler). Daher ist das von Ihnen konfigurierte Standardverhalten falsch.

Nun, mein MinIO ist nicht Docker-basiert, aber um hier mit Discourse konform zu sein, müssen Sie DNS-basiertes Pathing verwenden, d.h. Sie müssen in der Umgebungsvariable MINIO_DOMAIN=BASEDOMAINHERE angeben, damit das DNS-basierte Pathing, das DIscourse verwenden möchte, funktioniert. In Ihrem Beispiel wäre das MINIO_DOMAIN=s3.example.com, und dann müsste Ihr NGINX so konfiguriert werden, dass es den Host-Header an das Backend an Port 9000 oder wo auch immer die Basis-Nicht-Konsolen-Serverkomponenten laufen, weiterleitet. Sie müssen dann sicherstellen, dass NGINX für *.s3.example.com akzeptiert und es ordnungsgemäß an den MinIO-Container weiterleitet. Dies ist Teil der MinIO-Federationseinrichtung, aber für Single-Node-Instanzen mit mehreren Bucket-Namen unter einer Basis-URL müssen Sie sicherstellen, dass es trotzdem richtig konfiguriert ist, wenn Sie möchten, dass es mit Discourse funktioniert.

Leider müssen Sie hier in die MinIO-Konfigurationen eintauchen. Und eine der Voraussetzungen, die ich im Dokument angebe, ist, dass Sie eine voll funktionsfähige, richtig konfigurierte MinIO-Instanz haben, die über den Umfang der Discourse-Website hinausgeht. Ich glaube, dass Ihre MinIO-Instanz nicht richtig für die DNS-basierte Bucket-Auflösung konfiguriert ist, wie es AWS S3 tut (bucket.s3.example.com zum Beispiel) und daher nicht funktioniert.

Beachten Sie, dass ich die Discourse-Instanz für das Lubuntu-Projekt (lubuntu.me) (eine Variante von Ubuntu, die LXQt verwendet) mit einem MinIO mit DNS-basierter Bucket-URL-Auflösung betreibe, um sie richtig mit Discourse zum Laufen zu bringen, da sonst eine Anfrage für BUCKET.basedomain.example.com fehlschlagen würde.

Fakt ist, ich gebe sogar an, dass Sie Ihre MinIO-Instanz richtig für DNS-basierte Pfade konfigurieren müssen. Wenn Sie MINIO_DOMAIN während der Einrichtung von MinIO nicht angegeben haben, wird es keine DNS-basierten Pfade verwenden. Was hier für Discourse benötigt wird, gemäß Punkt 3 in meinem Haftungsausschluss-Abschnitt:

2 „Gefällt mir“

Hallo Bro, wenn ich MINIO_DOMAIN setze, verschwinden die obigen Fehler, aber neue treten auf

Aws::S3::Errors::MalformedXML: Das von Ihnen bereitgestellte XML war nicht wohlgeformt oder entsprach nicht unserem veröffentlichten Schema.

Ich habe das Gefühl, dass ich kurz vor dem Erfolg stehe, denn Discourse kann auf meinen Minio zugreifen. Ich versuche, alle Minio-Buckets zu löschen und Discourse neu zu erstellen. Es wird darauf hingewiesen, dass der angegebene Bucket nicht existiert.

Über diesen Artikel Discover AWS Official Knowledge Center Articles | AWS re:Post glaube, dieser Fehler wird durch Bucket-Berechtigungen verursacht? Durch das Tutorial Einrichtung von Datei- und Bild-Uploads nach S3 habe ich gesehen, dass ich anscheinend eine Bucket-Richtlinie hinzufügen muss


               "s3:PutObject",
               "s3:PutObjectAcl",
               "s3:PutObjectVersionAcl",
               ....

Aber Minio unterstützt ACLs nicht und meldet die nicht unterstützte Aktion “s3:PutObjectAcl”.

Vielleicht muss ich eine ältere Version von Minio verwenden, was die Sache einfacher machen könnte :sweat_smile:

1 „Gefällt mir“

Das Problem wird gelöst, indem keine Objektspeicher-Variablen über app.yml hinzugefügt werden. Andernfalls tritt ein MalformedXML-Fehler auf. Fügen Sie den s3-Parameter einfach zu den Einstellungen hinzu. Die Variable MINIO_DOMAIN muss bei der Installation von Minio hinzugefügt werden (ich verwende eine Single-Node-Bereitstellung).

Danke @teward für deine Hilfe

Jetzt kann ich Dateien hochladen und Backups mit Minio erstellen.

1 „Gefällt mir“

Nein, MinIO unterstützt PutObjectAcl nicht. Es unterstützt Berechtigungen auf Bucket-Ebene, aber keine Objekt-ACLs in dieser Form der API.

MinIO unterstützt NICHT die vollständige AWS-API. Weitere Informationen zu den vollständig unterstützten APIs finden Sie unter AIStor Object Store Documentation.

MINIO_DOMAIN muss hinzugefügt werden, damit DNS-Style-Buckets funktionieren, weshalb das ungültige PUT passiert. Sobald wir weiter fortgeschritten sind, sehen wir die Fehler im XML im Vergleich zu dem, was in den Schemata zulässig ist. Stellen Sie sicher, dass Sie NIEMALS eine Richtlinie festlegen, die Variablen enthält, die nicht im unterstützten Satz enthalten sind, den MinIO tatsächlich unterstützt.

Denken Sie daran: S3-kompatibel bedeutet NICHT, dass es eine 100%ige Übereinstimmung für alle unterstützten AWS S3 API-Variablen/Endpunkte/Werte ist.

1 „Gefällt mir“

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.