alexi.sh
Alle ArtikelBrowser-SicherheitNetzwerk-PrivatsphäreDatenschutz-ToolsBedrohungsmodellierungKI-ProgrammierungDev-Tools

alexi.shForschung

cloudflare-dev

Verwendung von R2 zum Speichern und Bereitstellen komprimierter Inhalte

PrivSec LabAktualisiert am 10. Juni 20262 Min. Lesezeit
Eine geöffnete Festplatte, die ihre Platine zeigt

Wie Sie Ihr Cloudflare R2-Free-Tier maximieren, indem Sie gzip-komprimierte Dateien speichern und bereitstellen — mit rclone-Konfiguration und den genauen erforderlichen Upload-Flags.

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

Zeilen von Quellcode auf einem dunklen Bildschirm

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.

Photo: Taylor Vick — Unsplash (source)

Auch verfügbar in

FAQ

Kann Cloudflare R2 gzip-komprimierte Dateien speichern und bereitstellen?
Ja. R2 unterstützt das Speichern von Dateien, die mit gzip (oder brotli) komprimiert sind, und deren transparente Bereitstellung. Sie müssen sowohl die Content-Type als auch die Content-Encoding Header beim Hochladen festlegen — rclone's --header-upload Flag ist der zuverlässige Weg, dies zu tun.
Was ist das Speicherlimit des Cloudflare R2-Free-Tiers?
Das R2-Free-Tier erlaubt das Speichern von bis zu 10 GB Daten pro Monat. Das Speichern von Dateien, die mit gzip vorkomprimiert sind, kann Ihnen ermöglichen, deutlich mehr Daten unterzubringen — das Beispiel im Artikel reduziert 11,5 GB GeoJSON auf ~1,5 GB.
Warum --header-upload anstelle von --header in rclone für R2 verwenden?
rclone's --header Flag gilt für alle Anfragen, einschließlich Metadatenlesungen, was zu Übertragungsfehlern mit R2 führt. Das --header-upload Flag beschränkt die benutzerdefinierten Header nur auf Upload-Operationen, was R2 erwartet.