Inhaltsverzeichnis
Ein Projekt, das eine große Menge an GeoJSON-Dateien speichern und bereitstellen muss (etwa 300.000), stößt schnell auf ein Speicherproblem.
Eine mögliche Lösung ist Cloudflares R2-Produkt, das eine Alternative zu Amazons S3 sein soll. Das Free-Tier von R2 erlaubt das Speichern von bis zu 10 GB Daten, was sehr nah an dem liegt, was ein solches Projekt benötigt. Die Summe aller GeoJSON-Dateien beträgt etwa 11,5 GB unkomprimiert, aber nur etwa 1,5 GB nach der Komprimierung mit gzip -9.
R2 unterstützt das Empfangen komprimierter Dateien. Aber die Dokumentation ist bestenfalls unzureichend, mit nur einigen Forenbeiträgen, die dies erwähnen.
Vorbereitung der Dateien
Zuerst müssen die Dateien als gzip komprimiert werden, während ihr ursprünglicher Dateiname beibehalten wird. Das folgende Skript erledigt dies:
#!/bin/bash
for file in some-folder/*.geojson; do
gzip -9 "$file"
mv "$file.gz" "$file"
done
Einrichtung von rclone
Der zweite Schritt besteht darin, rclone zu konfigurieren, um R2 als Remote zu verwenden. Sie können ein Token unter R2 > Übersicht > R2-API-Tokens verwalten von Ihrem Cloudflare-Dashboard erstellen.
Der folgende Befehl kann verwendet werden, um den Pfad Ihrer rclone-Konfigurationsdatei zu finden:
$ rclone config file
Die folgende rclone-Konfiguration funktioniert:
[some-bucket]
type = s3
provider = Cloudflare
access_key_id = <key>
secret_access_key = <secret>
endpoint = https://<bucket-id>.r2.cloudflarestorage.com
acl = private
Hochladen der Dateien
Sie können nun rclone verwenden, um die Dateien auf R2 hochzuladen. Aber einige Anpassungen müssen dem Befehl hinzugefügt werden, damit er funktioniert.
$ rclone copy --progress --header-upload "Content-Type: application/json" --header-upload "Content-Encoding: gzip" some-folder some-bucket:bucket-path/
Die --header-upload Optionen sind erforderlich, um R2 mitzuteilen, dass die Dateien komprimiert sind, aber auch, um den Typ des Inhalts der Originaldateien anzugeben.
Das Herausfinden dieses Teils hat am meisten Zeit in Anspruch genommen. Die Verwendung von --header anstelle von --header-upload funktioniert nicht und verhindert, dass Sie Dateien übertragen können.
Von nun an können sie einfach aus Ihrem R2-Bucket abgerufen werden, während sie komprimiert gespeichert sind. Die Dateien werden auch den Accept-Encoding Header von Clients respektieren, sodass die Datei als gzip, brotli oder einfach als Klartext übertragen werden kann, je nachdem, was der Client unterstützt.
Es ist auch erwähnenswert, dass Sie auch brotli-Komprimierung dafür verwenden können, aber Ihre Dateien werden nur als brotli bereitgestellt, unabhängig vom Accept-Encoding Header des Clients, aber zumindest wird der Content-Encoding Header auf brotli gesetzt.
Ein Projekt, das diesen Ansatz verwendet, ist https://inat-map.birdi.ng, das es Menschen ermöglicht, Heatmaps von Beobachtungen von iNaturalist zu sehen und GeoJSON-Dateien verwendet, um die Beobachtungen auf einer Karte anzuzeigen.
Dieser Artikel wurde ursprünglich am 28. März 2023 veröffentlicht. Die hier beschriebenen Free-Tier-Grenzen und das API-Verhalten von R2 sind zu diesem Datum korrekt; überprüfen Sie die Cloudflare R2-Dokumentation für die neuesten Grenzen und Funktionen. Für umfassendere Diskussionen zu Cloudflare-bezogenen Tools siehe die DNS-over-HTTPS Implementierungsübersicht und selbstgehostete E-Mail vs ProtonMail/Fastmail.


