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
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.


