Introdução
Se você usa o Backblaze B2 pra servir imagens estáticas, provavelmente começou do jeito mais simples possível: bucket público e links diretos.
(Eu ensinei como configurar isso do zero, nesse post => configurando um bucket b2 para servir imagens estáticas )
Funciona. Até não funcionar mais.
O problema aparece quando alguém começa a acessar esses links direto. Pode ser bot, hotlink em outro site, scraping… e de repente você está pagando download direto do B2 sem nem perceber.
A solução não é só esconder o bucket. É forçar todo o tráfego a passar por um proxy controlado com cache. Foi exatamente isso que implementei usando Cloudflare Workers.
O problema real
Quando seu bucket é público, qualquer um pode acessar:
https://seu-bucket.s3.us-east-005.backblazeb2.com/imagem.png
Mesmo que você use um CDN na frente, esse endpoint continua aberto.
Isso significa:
- bypass do cache
- custo direto no B2
- perda total de controle
A arquitetura correta:
Depois da configuração, o fluxo fica assim:
Usuário → media.seudominio.com → Cloudflare Worker → Backblaze (privado)
O usuário nunca fala direto com o B2.
O que vamos fazer
- Criar um Worker como proxy
- Assinar requests para um bucket privado
- Servir tudo via domínio próprio
- Cachear no edge da Cloudflare
- Bloquear acesso direto ao B2
Pré requisitos
- Conta + Bucket configurado no https://www.backblaze.com/
- Conta + Domínio na https://www.cloudflare.com/pt-br/
- Node.js instalado
- Git instalado
Instalando o Wrangler
npm install -g wrangler
Login:
wrangler login
Usando o template oficial
O Backblaze já fornece um template pronto:
git clone https://github.com/backblaze-b2-samples/cloudflare-b2 b2-proxy
cd b2-proxy
npm i
Abra essa pasta com code . ou navegue até ela pelo vscode, vamos precisar editar alguns códigos.
Criando a Application Key
No B2 :
“Add a new application key”:
- acesso: Read Only
- escolha sem bucket
- sem prefixo (deixe vazio)
Anote no seu bloco de notas:
- Key ID
- Application Key (só aparece uma vez depois some, anote!)
Configurando o Worker
No vscode, na pasta que você clonou do github, encontre o wrangler.toml.
você vai ver que existem algumas variáveis para serem preenchidas. Insira os dados correspondentes à sua conta.
[vars]
B2_APPLICATION_KEY_ID = "SEU_KEY_ID"
B2_ENDPOINT = "s3.us-east-005.backblazeb2.com"
BUCKET_NAME = "seu-bucket"
ALLOW_LIST_BUCKET = "false"
Agora, no cmd:
wrangler secret put B2_APPLICATION_KEY
Vai lhe perguntar o valor. Cole a sua Application Key (lembra que eu mandei anotar no bloco de notas?!)
Vamos fazer um teste
Antes de mandar isso pra Cloudflare e derrubarmos nosso site (panic) vamos fazer um teste para saber se está tudo nos conformes:
Provavelmente existe um arquivo .dev.vars.
Se não existir, crie-a;
edite a var:
B2_APPLICATION_KEY = "sua key aqui"
Essa é a mesma application key que você colou no terminal antes. Vamos usar ela um momento aqui apenas para testar localmente.
Rode:
wrangler dev
Isso vai expor algum localhost da sua máquina, não sei qual, mas vai aparecer nos logs, basta clicar segurando ctrl encima do url.
Teste no browser:
http://localhost:8787/imagem.png (exemplo! use o localhost que foi aberto e apareceu no log do terminal, e claro, substitua “imagem.png” por alguma imagem que esteja no seu bucket).
Se funcionar aqui, pode respirar fundo, metade do caminho! Se não funcionou… provavelmente você configurou algo errado ou pulou etapas.
Deploy (atenção aqui)
wrangler deploy
Calma calma lá - última configuração
Já tá funcionando, mas ainda falta a configuração final:
Vai no seu bucket B2 > Balde de configurações (ou bucket settings):
marque arquivos de segmento como privado;
Defina “Balde de informações” ou “Bucket infos” como {"cache-control":"public, max-age=31536000"};
Clique em salvar;
Agora, o teste definitivo;
Se tudo foi configurado certo, deve ter o seguinte comportamento:
Coloque na raiz do seu bucket uma imagem de teste, hello-world.png; Copia o link que o B2 vai fornecer dela, abra uma guia anônima e tente acessar;
deve aparecer algo como:
{
"code": "unauthorized",
"message": "",
"status": 401
}
ok, isso é definitivamente bom; Agora acesse pelo seu subdomínio:
media.seusite.com/hello-world.png;
deve aparecer uma linda imagem de hello world;
Resumo
Você aprendeu nesse post, a como deixar seu bucket backblaze B2 privado, deixando-o mais seguro contra ataques, e principalmente, preservando sua carteira de gastos desnecessários;
A partir de agora, seus arquivos só poderão ser acessados com segurança pelo seu próprio subdomínio configurado na cloudflare, com cache ativo, e com custo de banda praticamente 0!
De nada!