Í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
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.


