Configura un fornitore di storage di oggetti compatibile con S3 per gli upload

Ho dovuto mettere da parte questo per ora, poiché sembrava che stesse per funzionare, ma poi c’è qualcosa di strano che succede con R2 in termini di codifica dei contenuti con gli asset, sia durante il caricamento e non impostando l’header, sia qualcos’altro. Si blocca con un ‘Token non valido o imprevisto’ dato l’asset gz di qualcosa come browser-detect-7af298cd000a967d2bdc01b04807eda2924a388584ea38ad84919b726283c2ed.gz.js. Il comando rake s3:upload_assets sembra funzionare, ma i file non vengono letti correttamente dal lato browser.

Non capisco davvero perché con AWS S3 vada bene usare l’URL del server locale per gli asset (non esistono nel nostro bucket S3 esistente per i caricamenti), ma per R2 richieda l’uso di DISCOURSE_S3_CDN_URL solo per gli asset. Se potessi forzare gli asset a provenire dall’URL del server, probabilmente tutto funzionerebbe.

EDIT: Parlando su CF, questo sembra essere il problema, e da oggi il motivo per cui R2 non può essere utilizzato con Discourse senza alcune modifiche. Potrei creare uno script nel passaggio post-hook per rimuovere gli asset gz, ma sento di essere già abbastanza “fuori strada” per oggi:

I file che comprimi in gzip non vengono attualmente gestiti correttamente da R2. Devi caricare file non compressi. Cloudflare ha la compressione trasparente, sceglie identity, gzip o Brotli in base a ciò che il client può gestire. Questa è una differenza rispetto a S3.

2 Mi Piace

Bel lavoro! E questo è un messaggio chiaro da parte di Cloudflare sul perché non funzionerà. Grazie mille. Lo copierò presto nell’OP.

2 Mi Piace

Grazie ancora! Ho aggiornato l’OP:

3 Mi Piace

Grazie per aver messo insieme questa guida! Ho avuto un certo successo con Minio.

Per chiunque altro stia cercando di configurarlo localmente con Docker Compose, è possibile indicare a Docker di aggiungere un alias host in modo che funzioni come sottodominio, in questo modo:

  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 questo caso, dovresti impostare DISCOURSE_S3_ENDPOINT=http://minio.mydomain.com:9000, DISCOURSE_S3_CDN_URL=//assets.minio.mydomain.com:9000 e impostare il tuo file locale /etc/hosts/ per puntare il sottodominio a localhost.

Questo funziona per lo più bene, ma ho notato che Discourse non è in grado di scaricare file da un indirizzo che non ha la porta 80 o 443, quindi l’upload di un’immagine funzionerà, ma poi quando tenterà di scaricarla per ridimensionarla, fallirà.

Pensavo che sarebbe stato utile menzionare questo nella sezione Minio o nel riepilogo, ovvero che DISCOURSE_S3_CDN_URL deve essere sulla porta 80 o 443.

4 Mi Piace

Ciao @Falco - Ti riferisci al modo in cui l’header Content-Encoding: gzip funziona con la loro CDN Spaces? Questo suona simile a Cloudflare R2, nel senso che la posizione dell’asset viene resa uguale alla CDN di upload, quindi il gzip si interrompe? Ecco cosa succede oggi con R2.

Potrebbe valere la pena considerare un’opzione per quel comportamento, ad esempio servire gli asset dall’origine piuttosto che sempre da DISCOURSE_S3_CDN_URL? Sarò felice di cercare come fare, se venisse considerato come una potenziale modifica di configurazione.

3 Mi Piace

Questo è ciò che dovrebbe accadere se ometti la configurazione di DISCOURSE_S3_CDN_URL ma poiché è un caso limite strano e un potenziale errore costoso, non è una configurazione comune.

3 Mi Piace

Sì, capisco. Una nuova voce booleana GlobalSetting S3_ORIGIN_ASSETS (o S3_BROKEN_PROXY_FUDGE :slight_smile:) più o meno qui, un po’ come per come gli script di test non sono compressi permetterebbero a Digital Ocean Spaces e Cloudflare R2 di funzionare con Discourse fin da subito, il che è una bella aggiunta di funzionalità con poco sforzo? Magari da considerare in futuro comunque. :heart_eyes_cat:

4 Mi Piace

Oh, ho visto nelle note di rilascio della 3.0.beta che è stato aggiunto qualcosa. Ci proverò, a meno che non abbia capito male a cosa serve? Potrebbe consentire l’uso di Cloudflare R2 e Digital Ocean Spaces con le loro CDN che fanno cose strane con gzip.

1 Mi Piace

No, questo non è pertinente.

3 Mi Piace

L’impostazione mi ha permesso di specificare il sito locale come origine, per aggirare la necessità che gli asset js fossero sul sito S3 (in questo caso Cloudflare o Digital Ocean Spaces con CDN abilitato). Grazie a @david per la modifica, anche se non era l’intenzione.

4 Mi Piace

Inserisci l’URL del sito per la CDN delle risorse? Intelligente!

1 Mi Piace

Ciao a tutti, qualcuno sa se potrebbe essere correlato a Discourse?

Questo è l’XML dei file che abbiamo provato a caricare nel nostro storage S3 precedentemente ‘funzionante con Discourse’:

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

Stai usando AWS? Qualcos’altro?

Quel bucket è configurato con la crittografia lato server?

Potrebbe essere che una libreria sia stata aggiornata e si comporti in modo diverso.

2 Mi Piace

Grazie, ho ricontrollato e sembra funzionare con la configurazione automatica ma non gestendo le mie chiavi dalla gestione S3.

Sai se è possibile all’interno di Discourse?

1 Mi Piace

3 post sono stati divisi in un nuovo argomento: Perché eseguire UpdatePostUploadsSecureStatus anche quando il caricamento sicuro è disabilitato?

sembra che sia stato risolto di recente.
Nel changelog del 16/03/2023 è elencata una correzione di bug per la gestione dei file gzip.

Stiamo eseguendo il nostro forum discourse su discourse.aosus.org con R2 in questo momento (non abbiamo ancora eseguito migrate_to_s3), e sembra che vada tutto bene! Nessun problema evidente finora.

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: "us-east-1" #alias to auto
  #DISCOURSE_S3_INSTALL_CORS_RULE: true #dovrebbe essere supportato
  DISCOURSE_S3_ENDPOINT: S3_API_URL
  DISCOURSE_S3_ACCESS_KEY_ID: xxx
  DISCOURSE_S3_SECRET_ACCESS_KEY: xxxx
  DISCOURSE_S3_CDN_URL: il tuo url cdn
  DISCOURSE_S3_BUCKET: NOME_BUCKET

c’è un modo per specificare un host separato per i backup? Sarebbe fantastico se fosse possibile lasciare R2 solo per le cose CDN.

2 Mi Piace

Non c’è. Mi sembra improbabile che ciò cambi.

1 Mi Piace

23 post sono stati spostati in un nuovo argomento: Problemi nella configurazione dell’Object Storage

È strano che le impostazioni in ENV non vengano riflesse nell’interfaccia utente di amministrazione. Si verifica una sovrascrittura? Le nuove impostazioni di S3 nell’interfaccia utente di amministrazione sovrascriveranno quelle nell’ambiente?

1 Mi Piace

Sì. Le variabili d’ambiente sovrascrivono i valori nel database e sono nascoste dall’UX.

4 Mi Piace