Indice
Un progetto che deve memorizzare e servire una quantità massiccia di file GeoJSON (circa 300.000) si scontra rapidamente con un problema di archiviazione.
Una soluzione possibile è il 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 è molto vicino a ciò di cui un progetto simile ha bisogno. La somma di tutti i file GeoJSON è di circa 11,5 GB non compressi, ma solo circa 1,5 GB dopo la compressione con gzip -9.
R2 supporta la ricezione di file compressi. Ma la documentazione è al meglio carente, con solo alcuni post sul forum che lo menzionano.
Preparazione dei file
Innanzitutto, i file devono essere compressi come gzip, mantenendo il loro nome originale. Il seguente script fa questo:
#!/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
La seguente configurazione rclone funziona:
[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 in questa procedura. 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.
Un progetto che utilizza questo approccio è https://inat-map.birdi.ng, che consente alle persone di vedere mappe di calore delle osservazioni da iNaturalist e utilizza 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.


