alexi.sh
cloudflare-dev

Utiliser R2 pour stocker et servir du contenu compressé

PrivSec Lab··Mis à jour le 10 juin 2026·3 min de lecture
Baies de serveurs de datacenter avec éclairage bleu

Comment maximiser le tier gratuit de Cloudflare R2 en stockant et servant des fichiers compressés en gzip — configuration rclone et flags d'upload exacts.

Table des matières

Pour un projet parallèle sur lequel je travaillais, j'avais besoin de stocker et de servir une quantité massive de fichiers GeoJSON (environ 300 000).

En cherchant une solution, je suis tombé sur le produit R2 de Cloudflare, qui se veut une alternative à Amazon S3. Le tier gratuit de R2 permet de stocker jusqu'à 10 Go de données, ce qui était très proche de ce dont j'avais besoin. La somme de tous les fichiers GeoJSON représentait environ 11,5 Go non compressé, mais seulement environ 1,5 Go après compression avec gzip -9.

Après quelques recherches, j'ai appris que R2 supporte la réception de fichiers compressés. Mais la documentation était au mieux lacunaire, avec seulement quelques posts de forum en faisant mention.

Préparer les fichiers

D'abord, les fichiers doivent être compressés en gzip tout en conservant leur nom de fichier d'origine. J'ai utilisé le script suivant pour cela :

#!/bin/bash

for file in some-folder/*.geojson; do
    gzip -9 "$file"
    mv "$file.gz" "$file"
done

Configurer rclone

La deuxième étape est de configurer rclone pour utiliser R2 comme remote. Vous pouvez créer un token sous R2 > Overview > Manage R2 API Tokens depuis votre Dashboard Cloudflare.

La commande suivante permet de trouver le chemin de votre fichier de configuration rclone :

$ rclone config file

J'ai utilisé la configuration rclone suivante :

[some-bucket]
type = s3
provider = Cloudflare
access_key_id = <key>
secret_access_key = <secret>
endpoint = https://<bucket-id>.r2.cloudflarestorage.com
acl = private

Uploader les fichiers

Vous pouvez maintenant utiliser rclone pour uploader les fichiers vers R2. Mais quelques ajustements doivent être apportés à la commande pour que cela fonctionne.

$ rclone copy --progress --header-upload "Content-Type: application/json" --header-upload "Content-Encoding: gzip" some-folder some-bucket:bucket-path/

Les options --header-upload sont nécessaires pour indiquer à R2 que les fichiers sont compressés, mais aussi pour préciser le type de contenu des fichiers d'origine.

Comprendre cette partie est ce qui m'a pris le plus de temps. Utiliser --header à la place de --header-upload ne fonctionne pas et empêche tout transfert de fichiers.

Désormais, les fichiers sont simplement accessibles depuis votre bucket R2 tout en étant stockés compressés. Les fichiers respectent également l'en-tête Accept-Encoding des clients, donc le fichier peut être transféré en gzip, brotli ou simplement en texte brut selon ce que le client supporte.

Il vaut également la peine de noter que vous pouvez aussi utiliser la compression brotli pour cela, mais vos fichiers ne seront servis qu'en brotli, peu importe l'en-tête Accept-Encoding du client — au moins l'en-tête Content-Encoding sera positionné à brotli.

Le projet pour lequel j'avais besoin de cela est https://inat-map.birdi.ng, qui permet aux gens de voir des cartes de chaleur d'observations depuis iNaturalist et utilise les fichiers GeoJSON pour afficher les observations sur une carte.


Cet article a été publié initialement le 28 mars 2023. Les limites du tier gratuit de R2 et le comportement de l'API décrits ici sont exacts à cette date ; consultez la documentation Cloudflare R2 pour les dernières limites et fonctionnalités. Pour d'autres discussions sur les outils Cloudflare, voir DNS-over-HTTPS : état des implémentations 2026 et email auto-hébergé vs ProtonMail/Fastmail.

Photo: Taylor Vick — Unsplash (source)

Also available in