Errore nella ricostruzione utilizzando minio come object store

Ricostruisci la visualizzazione quando si utilizza minio come archivio di oggetti

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: Si è verificato un errore durante l'analisi della richiesta HTTP PUT a '/'

Ho configurato più domini per minio

minio.example.com (come console di accesso minio)
s3.example.com (come API di minio)

Ho anche aggiunto il nome del bucket
bucket.s3.example.com (come API di minio)

Tutti i domini sono correttamente autenticati e sto cercando di connettermi all’account utilizzando Cyberduck con s3.example.com o bucket.s3.example.com è disponibile per il caricamento e il download di file.

Le mie impostazioni s3 di app.yml

  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

Ho cercato problemi correlati e non ho risolto. Funziona bene se si utilizza lo storage di oggetti vultr. Quindi, è che minio e discourse non funzionano bene insieme, ma ho visto persone usare minio con successo. Chiedo a tutti, credo che questo problema verrà risolto presto.

1 Mi Piace

Hai seguito Utilizzo dello storage di oggetti per i caricamenti (S3 e cloni)?

2 Mi Piace

Sì, l’ho visto molte volte e ho anche guardato Guida di base per l’utilizzo del server di archiviazione MinIO gestito da te per la tua istanza Discourse

Il problema non è stato risolto, quello che mi preoccupa è che la connessione all’account minio utilizzando il protocollo di trasporto amazon s3 di Cyberduck è disponibile e penso che le mie impostazioni minio sembrino funzionare bene

1 Mi Piace

Hai verificato che la tua configurazione MinIO funzioni in generale con altri meccanismi come il client MinIO o il? E che stai utilizzando gli URL e la configurazione corretti contro MinIO?

Il mio suggerimento è di assicurarti prima che tutto sia conforme ai client da riga di comando MinIO e s3cmd: non ho mai sentito parlare di questo client “Cyberduck” (per una buona ragione: è per Windows e Mac, io sono un tipo da Linux), e non posso confermare che sia conforme a MinIO e ad altre cose poiché dice “AWS S3” sulla sua cosa e probabilmente è progettato per l’intera API S3 di Amazon, non per elementi conformi/compatibili con S3. Configura il client MinIO (mcli) da riga di comando sulla macchina o vicino alla macchina con cui stai cercando di lavorare e poi prova a caricare un file manualmente nei tuoi bucket.

Inoltre, tieni presente che DISCOURSE_S3_BACKUP_BUCKET con MinIO è progettato per essere un bucket separato, non un sottopercorso all’interno di un bucket esistente (per quanto ne so). È possibile che ciò possa causare problemi anche nella configurazione attuale, è per questo che l’esempio che ho scritto e il link al mio “Come fare” che hai fornito lo indicano come un bucket separato.

Quello che non ho qui sono informazioni sulla richiesta specifica che è stata effettivamente effettuata: l’URL, ecc. che è stato utilizzato dal sistema quando ha effettuato quella richiesta con BadRequest. Sembra che sia perché è solo un log di livello INFO. Non c’è modo di ottenere un livello di debug di logging durante il processo rake @pfaffman (o altri più familiari con il lato Discourse delle cose)?

INOLTRE, assicurati di passare anche DISCOURSE_S3_INSTALL_CORS_RULE: false per la tua configurazione Discourse: se il ricostruttore/fornaio dell’app tenta di caricare regole CORS, ciò comporterà un messaggio di errore.

2 Mi Piace

Ho creato un nuovo bucket usando mcli e ho inviato manualmente un file al bucket

Vedo il file inviato nel bucket, questo significa che ho installato minio con i passaggi corretti, ho installato minio usando docker compose e il mio file docker-compose.yml


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:

Quindi vai alla console web, crea due nuovi bucket e imposta la policy di accesso per l’object store su pubblica

Uso Nginx proxy manager per inoltrare minio.example.com alla porta 9001 e s3.example.com e bucket-name.example.com alla porta 9000

DISCOURSE_S3_BACKUP_BUCKET: Ho provato a usare un bucket separato e ho configurato l’inoltro del nome di dominio alla porta 9000 per il bucket, ma non funziona

Inoltri quali porte? 80/443 in modo che http/https funzioni? Questo è tutto ciò di cui ha bisogno, non dovresti MAI dover configurare la porta 9000 su una porta separata. Il bucket separato avrà lo stesso endpoint di s3.example.com, non è qualcosa di separato, quindi stai configurando QUELLO in modo errato. Non dimenticare inoltre che nel linguaggio MinIO, se stai usando l’autenticazione per percorso, finirai con s3.example.com/NOMEBUCKET o con l’autenticazione DNS come dovresti usare NOMEBUCKET.s3.example.com per gli endpoint URL che devi accettare sul lato nginx e inoltrare alla porta interna 9000. Non devi configurarlo da parte tua, questo deve essere configurato dal lato MinIO.

Il client MinIO supporta sia la configurazione in stile path che dns. Per quanto ne so, Discourse utilizza un meccanismo basato su URL per l’identificazione dei bucket, non configurazioni in stile percorso (sentiti libero di correggermi, sviluppatori di Discourse). Pertanto, il comportamento ‘predefinito’ che stai configurando è errato.

Ora, il mio MinIO non è in docker, ma per essere conforme qui con Discourse, devi usare il percorso in stile DNS, cioè devi aggiungere nella variabile d’ambiente MINIO_DOMAIN=BASEDOMAINHERE in modo che il percorso in stile DNS che Discourse vuole usare funzioni. Nel tuo esempio sarebbe MINIO_DOMAIN=s3.example.com e poi il tuo NGINX dovrebbe essere configurato per passare l’header Host al backend sulla porta 9000 o ovunque vengano eseguiti i componenti del server base non console. Devi quindi assicurarti che NGINX accetti per *.s3.example.com e lo inoltri correttamente al container MinIO. Questa è parte della configurazione di MinIO Federation, ma per istanze a nodo singolo con nomi di bucket multipli su un URL di base devi assicurarti che sia configurato correttamente comunque se vuoi che funzioni con Discourse.

Sfortunatamente, però, è qui che devi iniziare ad approfondire le configurazioni di MinIO. E uno dei requisiti che specifico nel documento è che hai un’istanza MinIO completamente funzionante e correttamente configurata che va oltre lo scopo del sito di Discourse. Credo che il tuo MinIO non sia configurato correttamente per la risoluzione dei bucket in stile DNS come fa AWS S3 (bucket.s3.example.com per esempio) e quindi non funzioni.

Nota che gestisco l’istanza Discourse per il Lubuntu Project (lubuntu.me) (una variante di Ubuntu che usa LXQt) utilizzando un MinIO con risoluzione URL dei bucket in stile DNS per farlo funzionare correttamente con Discourse, altrimenti una richiesta per BUCKET.basedomain.example.com fallirebbe.

Curiosità, affermo anche che è necessario che MinIO sia configurato correttamente per i percorsi in stile DNS, se non hai incluso MINIO_DOMAIN durante la configurazione di MinIO, non farà percorsi in stile DNS. Di cui ha bisogno qui per Discourse, come da punto 3 nella sezione delle mie avvertenze che ho scritto:

2 Mi Piace

Ciao amico, impostare MINIO_DOMAIN fa scomparire gli errori precedenti, ma ne compaiono di nuovi

Aws::S3::Errors::MalformedXML: L'XML fornito non era ben formato o non è stato convalidato rispetto al nostro schema pubblicato.

Sento che sto per riuscire, perché discourse può accedere correttamente al mio minio, provo a eliminare tutti i bucket minio, ricostruisco discourse, mi verrà richiesto che il bucket specificato non esiste

Tramite questo articolo Discover AWS Official Knowledge Center Articles | AWS re:Post Penso che questo errore sia causato dalle autorizzazioni del bucket? Attraverso il tutorial Configurazione dei caricamenti di file e immagini su S3 ho visto che sembra che io debba aggiungere una Bucket Policy


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

Ma minio non supporta Acl, segnala l’azione non supportata ‘s3:PutObjectAcl’.

Forse, potrei aver bisogno di usare una versione precedente di minio, il che potrebbe rendere le cose più facili :sweat_smile:

1 Mi Piace

Il problema è risolto non aggiungendo variabili di object storage tramite app.yml. Altrimenti si verificherà un errore MalformedXML, basta aggiungere il parametro s3 alle impostazioni. La variabile MINIO_DOMAIN deve essere aggiunta durante l’installazione di minio (sto usando un’installazione su singolo nodo).

Grazie @teward per il tuo aiuto

ora posso caricare file e fare backup usando minio

1 Mi Piace

No, MinIO non supporta PutObjectAcl. Supporta le autorizzazioni a livello di bucket ma non le ACL a livello di oggetto in quella forma dell’API.

MinIO NON supporta l’API AWS completa. Vedere AIStor Object Store Documentation per l’insieme completo di API supportate.

MINIO_DOMAIN deve essere aggiunto affinché avvengano i bucket in stile DNS, motivo per cui si verifica il PUT non valido. Una volta che andremo più avanti, vedremo i fallimenti nell’XML rispetto a ciò che è consentito negli schemi. Assicurati di NON inserire MAI alcuna policy che abbia variabili non supportate nell’insieme supportato che MinIO supporta effettivamente.

Ricorda: S3-compatible NON significa che sia una corrispondenza al 100% per tutte le variabili/endpoint/valori dell’API AWS S3 supportati.

1 Mi Piace

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