Inhaltsverzeichnis
Für ein Nebenprojekt, an dem ich arbeitete, musste ich eine große Menge an GeoJSON-Dateien speichern und bereitstellen (etwa 300.000).
Während ich nach einer Lösung suchte, stieß ich auf 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 lag, was ich benötigte. Die Summe aller GeoJSON-Dateien betrug etwa 11,5 GB unkomprimiert, aber nur etwa 1,5 GB nach der Komprimierung mit gzip -9.
Nach einiger Recherche erfuhr ich, dass R2 das Empfangen komprimierter Dateien unterstützt. Aber die Dokumentation war bestenfalls unzureichend, mit nur einigen Forenbeiträgen, die dies erwähnten.
Vorbereitung der Dateien
Zuerst müssen die Dateien als gzip komprimiert werden, während ihr ursprünglicher Dateiname beibehalten wird. Ich habe das folgende Skript verwendet, um dies zu tun:
#!/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
Ich habe die folgende rclone-Konfiguration verwendet:
[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.
Das Projekt, für das ich dies benötigte, ist https://inat-map.birdi.ng, das es Menschen ermöglicht, Heatmaps von Beobachtungen von iNaturalist zu sehen und die 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.


