alexi.sh
Todos os artigosSegurança do navegadorPrivacidade de redeFerramentas de privacidadeModelagem de ameaçasProgramação com IAFerramentas de dev

alexi.shInvestigação

cloudflare-dev

Usar R2 para armazenar e servir conteúdo comprimido

PrivSec LabAtualizado em 10 de junho de 20263 min de leitura
Um disco rígido aberto mostrando a sua placa de circuito

Como maximizar o seu nível gratuito do Cloudflare R2 armazenando e servindo ficheiros comprimidos com gzip — com configuração do rclone e as flags exatas de upload necessárias.

Índice

Para um projeto paralelo em que estava a trabalhar, precisei de armazenar e servir uma quantidade massiva de ficheiros GeoJSON (cerca de 300.000).

Enquanto procurava uma solução, deparei-me com o produto R2 da Cloudflare, que pretende ser uma alternativa ao S3 da Amazon. O nível gratuito do R2 permite armazenar até 10 GB de dados, o que estava muito próximo do que eu precisava. A soma de todos os ficheiros GeoJSON era cerca de 11,5 GB descomprimidos, mas apenas cerca de 1,5 GB após compressão com gzip -9.

Depois de alguma pesquisa, descobri que o R2 suporta receber ficheiros comprimidos. Mas a documentação era, no melhor dos casos, escassa, com apenas alguns posts no fórum a mencioná-lo.

Preparar os ficheiros

Linhas de código fonte num ecrã escuro

Primeiro, os ficheiros precisam de ser comprimidos como gzip, mantendo o seu nome de ficheiro original. Usei o seguinte script para o fazer:

#!/bin/bash

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

Configurar o rclone

O segundo passo é configurar o rclone para usar o R2 como um remoto. Pode criar um token em R2 > Overview > Manage R2 API Tokens no seu Dashboard da Cloudflare.

O seguinte comando pode ser usado para encontrar o caminho do seu ficheiro de configuração do rclone:

$ rclone config file

Usei a seguinte configuração do rclone:

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

Carregar os ficheiros

Agora pode usar o rclone para carregar os ficheiros para o R2. Mas algumas alterações precisam de ser feitas no comando para que funcione.

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

As opções --header-upload são necessárias para informar o R2 de que os ficheiros estão comprimidos, mas também para indicar o tipo de conteúdo dos ficheiros originais.

Descobrir esta parte foi o que levou mais tempo da minha parte. Usar --header em vez de --header-upload não funciona e impedirá a transferência de quaisquer ficheiros.

A partir de agora, eles podem ser simplesmente acedidos a partir do seu bucket R2 enquanto são armazenados comprimidos. Os ficheiros também respeitarão o cabeçalho Accept-Encoding dos clientes, para que o ficheiro possa ser transferido como gzip, brotli ou simplesmente texto simples, dependendo do que o cliente suporta.

Também vale a pena notar que pode usar compressão brotli para isto, mas os seus ficheiros serão servidos apenas como brotli, independentemente do cabeçalho Accept-Encoding do cliente, mas pelo menos o cabeçalho Content-Encoding será definido como brotli.

O projeto para o qual precisei disto é https://inat-map.birdi.ng, que permite às pessoas ver mapas de calor de observações do iNaturalist e usa os ficheiros GeoJSON para exibir as observações num mapa.


Este artigo foi originalmente publicado a 28 de março de 2023. Os limites do nível gratuito do R2 e o comportamento da API descritos aqui são precisos a partir dessa data; verifique a documentação do Cloudflare R2 para os limites e funcionalidades mais recentes. Para discussões mais amplas relacionadas com ferramentas da Cloudflare, veja a visão geral das implementações de DNS-over-HTTPS e email auto-hospedado vs ProtonMail/Fastmail.

Photo: Taylor Vick — Unsplash (source)

Também disponível em

FAQ

O Cloudflare R2 pode armazenar e servir ficheiros comprimidos com gzip?
Sim. O R2 suporta o armazenamento de ficheiros comprimidos com gzip (ou brotli) e servindo-os de forma transparente. Deve definir os cabeçalhos Content-Type e Content-Encoding no momento do upload — a flag --header-upload do rclone é a forma fiável de o fazer.
Qual é o limite de armazenamento do nível gratuito do Cloudflare R2?
O nível gratuito do R2 permite armazenar até 10 GB de dados por mês. Armazenar ficheiros pré-comprimidos com gzip pode permitir que armazene significativamente mais dados — o exemplo do artigo reduz 11,5 GB de GeoJSON para ~1,5 GB.
Por que usar --header-upload em vez de --header no rclone para R2?
A flag --header do rclone aplica-se a todas as solicitações, incluindo leituras de metadados, o que causa falhas de transferência com o R2. A flag --header-upload restringe os cabeçalhos personalizados apenas às operações de upload, que é o que o R2 espera.