alexi.sh
cloudflare-dev

Usar R2 para almacenar y servir contenido comprimido

PrivSec Lab··Actualizado el 10 de junio de 2026·3 min de lectura
Racks de servidores de centro de datos con iluminación azul

Cómo maximizar el tier gratuito de Cloudflare R2 almacenando y sirviendo archivos comprimidos con gzip — configuración de rclone y los flags de subida exactos necesarios.

Tabla de contenidos

Para un proyecto paralelo en el que estaba trabajando, necesitaba almacenar y servir una cantidad masiva de archivos GeoJSON (alrededor de 300 000).

Mientras buscaba una solución, me encontré con el producto R2 de Cloudflare, que pretende ser una alternativa a Amazon S3. El tier gratuito de R2 permite almacenar hasta 10 GB de datos, lo que era muy cercano a lo que necesitaba. La suma de todos los archivos GeoJSON era de unos 11,5 GB sin comprimir, pero solo alrededor de 1,5 GB después de comprimir con gzip -9.

Tras investigar un poco, aprendí que R2 soporta recibir archivos comprimidos. Pero la documentación era escasa, con solo algunos posts en el foro mencionándolo.

Preparar los archivos

Primero, los archivos deben comprimirse con gzip manteniendo su nombre de archivo original. Usé el siguiente script para hacerlo:

#!/bin/bash

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

Configurar rclone

El segundo paso es configurar rclone para usar R2 como remoto. Puedes crear un token en R2 > Overview > Manage R2 API Tokens desde tu Dashboard de Cloudflare.

El siguiente comando sirve para encontrar la ruta de tu archivo de configuración de rclone:

$ rclone config file

Usé la siguiente configuración de rclone:

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

Subir los archivos

Ahora puedes usar rclone para subir los archivos a R2. Pero hay que añadir algunos ajustes al comando para que funcione.

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

Las opciones --header-upload son necesarias para indicarle a R2 que los archivos están comprimidos, pero también para indicar el tipo de contenido de los archivos originales.

Descubrir esta parte fue lo que más tiempo me llevó. Usar --header en lugar de --header-upload no funciona y evita que se transfiera cualquier archivo.

A partir de ahora, los archivos pueden accederse simplemente desde tu bucket de R2 mientras se almacenan comprimidos. Los archivos también respetan el encabezado Accept-Encoding de los clientes, por lo que el archivo puede transferirse como gzip, brotli o simplemente texto plano según lo que soporte el cliente.

También vale la pena señalar que puedes usar compresión brotli para esto, pero tus archivos solo se servirán como brotli, independientemente del encabezado Accept-Encoding del cliente — al menos el encabezado Content-Encoding se establecerá como brotli.

El proyecto para el que necesitaba esto es https://inat-map.birdi.ng, que permite a las personas ver mapas de calor de observaciones de iNaturalist y usa los archivos GeoJSON para mostrar las observaciones en un mapa.


Este artículo fue publicado originalmente el 28 de marzo de 2023. Los límites del tier gratuito de R2 y el comportamiento de la API descritos aquí son exactos a esa fecha; consulta la documentación de Cloudflare R2 para los últimos límites y funcionalidades. Para otras discusiones sobre herramientas de Cloudflare, ver DNS-over-HTTPS: estado de las implementaciones 2026 y email auto-alojado vs ProtonMail/Fastmail.

Photo: Taylor Vick — Unsplash (source)

Also available in