alexi.sh
Tutti gli articoliSicurezza del browserPrivacy di reteStrumenti per la privacyModellazione delle minacceProgrammazione con IAStrumenti per sviluppatori

alexi.shRicerca

cloudflare-dev

Utilizzare R2 per memorizzare e servire contenuti compressi

PrivSec LabAggiornato il 10 giugno 20263 min di lettura
Un disco rigido aperto che mostra il suo circuito stampato

Come massimizzare il tuo livello gratuito di Cloudflare R2 memorizzando e servendo file compressi con gzip — con configurazione rclone e le esatte opzioni di caricamento richieste.

Indice

Per un progetto parallelo su cui stavo lavorando, avevo bisogno di memorizzare e servire una quantità massiccia di file GeoJSON (circa 300.000).

Cercando una soluzione, mi sono imbattuto nel prodotto R2 di Cloudflare, che mira a essere un'alternativa all'S3 di Amazon. Il livello gratuito di R2 consente di memorizzare fino a 10 GB di dati, che era molto vicino a ciò di cui avevo bisogno. La somma di tutti i file GeoJSON era di circa 11,5 GB non compressi, ma solo circa 1,5 GB dopo la compressione con gzip -9.

Dopo aver esplorato un po', ho scoperto che R2 supporta la ricezione di file compressi. Ma la documentazione era al meglio carente, con solo alcuni post sul forum che lo menzionavano.

Preparazione dei file

Linee di codice sorgente su uno schermo scuro

Innanzitutto, i file devono essere compressi come gzip, mantenendo il loro nome originale. Ho usato il seguente script per farlo:

#!/bin/bash

for file in some-folder/*.geojson; do
    gzip -9 "$file"
    mv "$file.gz" "$file"
done

Configurazione di rclone

Il secondo passo è configurare rclone per utilizzare R2 come remoto. Puoi creare un token sotto R2 > Overview > Manage R2 API Tokens dal tuo Dashboard Cloudflare.

Il seguente comando può essere utilizzato per trovare il percorso del tuo file di configurazione rclone:

$ rclone config file

Ho usato la seguente configurazione rclone:

[some-bucket]
type = s3
provider = Cloudflare
access_key_id = <key>
secret_access_key = <secret>
endpoint = https://<bucket-id>.r2.cloudflarestorage.com
acl = private

Caricamento dei file

Ora puoi usare rclone per caricare i file su R2. Ma è necessario aggiungere alcune modifiche al comando per farlo funzionare.

$ rclone copy --progress --header-upload "Content-Type: application/json" --header-upload "Content-Encoding: gzip" some-folder some-bucket:bucket-path/

Le opzioni --header-upload sono necessarie per dire a R2 che i file sono compressi, ma anche per indicare il tipo di contenuto dei file originali.

Capire questa parte è stato ciò che ha richiesto più tempo da parte mia. Usare --header invece di --header-upload non funziona e ti impedirà di trasferire qualsiasi file.

Da ora in poi, possono essere semplicemente accessibili dal tuo bucket R2 mentre vengono memorizzati compressi. I file rispetteranno anche l'intestazione Accept-Encoding dai client, quindi il file può essere trasferito come gzip, brotli o semplicemente testo semplice a seconda di ciò che il client supporta.

Vale anche la pena notare che puoi anche usare la compressione brotli per questo, ma i tuoi file saranno serviti solo come brotli, indipendentemente dall'intestazione Accept-Encoding del client, ma almeno l'intestazione Content-Encoding sarà impostata su brotli.

Il progetto per cui avevo bisogno di questo è https://inat-map.birdi.ng, che consente alle persone di vedere mappe di calore delle osservazioni da iNaturalist e utilizza i file GeoJSON per visualizzare le osservazioni su una mappa.


Questo articolo è stato pubblicato originariamente il 28 marzo 2023. I limiti del livello gratuito di R2 e il comportamento dell'API descritti qui sono accurati a quella data; controlla la documentazione di Cloudflare R2 per i limiti e le funzionalità più recenti. Per discussioni più ampie sugli strumenti correlati a Cloudflare, vedi la panoramica delle implementazioni DNS-over-HTTPS e email self-hosted vs ProtonMail/Fastmail.

Photo: Taylor Vick — Unsplash (source)

Disponibile anche in

FAQ

Cloudflare R2 può memorizzare e servire file compressi con gzip?
Sì. R2 supporta la memorizzazione di file compressi con gzip (o brotli) e il loro servizio trasparente. Devi impostare sia le intestazioni Content-Type che Content-Encoding al momento del caricamento — il flag --header-upload di rclone è il modo affidabile per farlo.
Qual è il limite di archiviazione del livello gratuito di Cloudflare R2?
Il livello gratuito di R2 consente di memorizzare fino a 10 GB di dati al mese. Memorizzare file precompressi con gzip può permetterti di adattare significativamente più dati — l'esempio dell'articolo riduce 11,5 GB di GeoJSON a ~1,5 GB.
Perché usare --header-upload invece di --header in rclone per R2?
Il flag --header di rclone si applica a tutte le richieste, inclusa la lettura dei metadati, il che causa fallimenti di trasferimento con R2. Il flag --header-upload limita le intestazioni personalizzate solo alle operazioni di caricamento, che è ciò che R2 si aspetta.