Blog grátis na Cloudflare: Workers, D1 e R2 na prática
Tem uma coisa estranha em escrever sobre infraestrutura barata num blog que roda nela. Este site — o que você está lendo agora — não tem servidor. Não tem VPS, não tem painel de hospedagem, não tem cartão de crédito cadastrado em lugar nenhum. A coisa toda é um Worker na Cloudflare servindo HTML, um banco D1 com os textos e um bucket R2 com as imagens, tudo dentro do plano gratuito.
Testei isso com conteúdo de verdade antes de escrever este guia: 9 posts publicados em cinco dias, 1.633 leituras, imagens hospedadas, busca interna, sitemap e web stories. A conta de infraestrutura no fim do período foi R$ 0,00. O que segue é o que eu queria ter lido antes de começar — inclusive a parte que quase todo tutorial em português omite, que é o limite do D1 que passou a derrubar queries de verdade em 1º de setembro de 2026.
TL;DR
- Workers grátis: 100.000 requisições por dia, 10 ms de CPU por invocação, 128 MB de memória, 50 sub-requisições por chamada
- Requisição de asset estático (HTML, CSS, JS e imagem do próprio bundle) é grátis e ilimitada — só invocação de Worker conta
- D1 grátis: 5 milhões de linhas lidas e 100 mil linhas escritas por dia, mais 5 GB de storage
- R2 grátis: 10 GB armazenados, 1 milhão de operações de escrita e 10 milhões de leitura por mês, egress zero
- O único custo real do projeto é o domínio — e o teto de 100 mil requisições/dia dá, na prática, muito mais blog do que parece
O que vem no pacote grátis (e o que não vem)
A Cloudflare não vende "hospedagem de blog". Ela vende peças soltas que, combinadas, fazem um blog: compute (Workers), banco relacional (D1) e object storage (R2). Os números oficiais do plano Free, direto da documentação:
| Recurso | Workers Free | D1 Free | R2 Free |
|---|---|---|---|
| Requisições | 100.000/dia | — | — |
| Linhas lidas | — | 5 milhões/dia | — |
| Linhas escritas | — | 100.000/dia | — |
| Operações | — | — | 1 mi escritas + 10 mi leituras/mês |
| CPU | 10 ms por invocação | — | — |
| Storage | — | 5 GB | 10 GB-mês |
| Egress | não cobrado | não cobrado | grátis |
| Limite de conta | 100 Workers, 5 cron triggers | reset 00:00 UTC | — |
Duas linhas dessa tabela merecem atenção especial porque são as que mudam a viabilidade do projeto.
A primeira é CPU: 10 ms por invocação. Parece pouco até você entender o que conta como CPU. A documentação é explícita: esperar por rede — fetch(), leitura de KV, query no D1 — não consome CPU. Só o tempo de execução do seu JavaScript conta. Um Worker que renderiza template de blog, monta JSON e formata data gasta pouquíssimo: a própria Cloudflare diz que o Worker médio usa cerca de 2,2 ms por requisição. Ou seja, os 10 ms do plano grátis são folgados para o caso "servir página de artigo".
A segunda é a linha de assets estáticos: arquivos servidos do bundle do Worker não são cobrados como requisição. Isso é o que faz um blog estático basicamente nunca encostar no teto.
Workers: 100 mil por dia é muito ou pouco?
Vamos fazer a conta com o número real deste site em vez de chutar. Foram 1.633 leituras em cinco dias — média de 327 por dia.
327 dividido por 100.000 é 0,33% do teto diário. Ou seja: o blog inteiro, com robô de busca, sitemap, feed e web stories, usa um terço de um por cento do plano grátis. Para bater no limite seria preciso algo na casa de 100 mil pageviews por dia, o que no Brasil é território de portal, não de blog.
O outro lado da conta é mais interessante. Cada post publicado aqui passa por um fluxo automatizado que consulta o banco, gera HTML, sobe imagem e dispara indexação. Mesmo esse pico de escrita — que acontece algumas vezes por dia — não chega perto de nada. É por isso que o plano gratuito funciona: blog é carga de leitura, e leitura aqui é barata.
Onde o grátis realmente encosta é se você começar a fazer coisa de app: API com autenticação, upload grande, processamento de imagem no edge. Aí os 10 ms de CPU viram gargalo rápido.
D1: a parede que apareceu em 1º de setembro
Aqui está o detalhe que separa este guia da maior parte do que existe em português. Até meados de 2026, estourar o limite diário do D1 no plano Free era tratado como exceção silenciosa. Em 1º de setembro de 2026 isso mudou: a Cloudflare passou a fazer o limite valer de verdade.
A regra, direto do changelog oficial: quando a conta passa de 5 milhões de linhas lidas ou 100 mil linhas escritas no dia, as queries passam a retornar erro — tanto pela API de binding do Worker quanto pela API REST — e só voltam a funcionar depois da meia-noite UTC. O dado armazenado não é afetado. Você recebe email de alerta quando o teto é atingido.
O ponto crítico é que "linha lida" não é "linha retornada". Se a sua tabela tem 5.000 posts e você roda um SELECT * FROM posts sem WHERE indexado, isso conta como 5.000 linhas lidas mesmo que você mostre dez na tela. A documentação é clara nisso: query que filtra coluna sem índice ainda precisa varrer a tabela para descobrir o subconjunto.
A conta que importa: 5 milhões de linhas por dia divididas por 100 mil visitas diárias dá 50 linhas lidas por visita para caber no grátis. Um blog bem indexado lê uma linha por artigo aberto e algumas dezenas para montar a home. Um blog mal indexado lê a tabela inteira a cada página. A diferença entre "grátis para sempre" e "site fora do ar às 15h" está no índice, não no tráfego.
No caso deste site, a busca interna e as listagens por tag usam índice próprio justamente por isso. Cada vez que uma consulta nova entra, vale conferir o meta de retorno: ele traz rows_read e rows_written daquela query, o que permite medir o custo antes que ele vire problema.
R2: a imagem é o que menos pesa
Imagem é o que costuma inviabilizar blog em serviço gratuito: ou o plano limita armazenamento, ou cobra banda de saída. O R2 resolve os dois, e o número é generoso.
São 10 GB-mês de storage, 1 milhão de escritas e 10 milhões de leituras por mês, com egress grátis para qualquer classe de storage. Traduzindo para o dia a dia de um blog: a imagem otimizada deste site fica na faixa de 200 KB. Dez GB dão mais de 51 mil imagens — um post por dia com quatro imagens cada levaria 35 anos para encher.
O egress grátis é o detalhe que mais economiza dinheiro no longo prazo. Em storage tradicional, um post que viraliza gera conta de banda no fim do mês. Aqui, mil acessos ou um milhão custam o mesmo em transferência: zero.
Este guia usa uma imagem de sala de servidores só como ironia visual — você não vai precisar de nada parecido.
Quanto custa sair do grátis
Vale saber onde fica a saída de emergência, mesmo que você nunca use. O Workers Paid tem mínimo de US$ 5 por mês e inclui 10 milhões de requisições por mês mais 30 milhões de milissegundos de CPU; o excedente custa US$ 0,30 por milhão de requisições.
Fazendo a conta: 100 mil por dia equivale a cerca de 3 milhões por mês no grátis. Os 10 milhões do plano pago são 3,3 vezes esse teto, e sem limite diário — o que importa quando o tráfego concentra num único dia de lançamento. Para um blog que estourou o grátis, US$ 5 resolvem o problema por um bom tempo.
Como eu montei o meu, em seis passos
O caminho que usei, sem painel gráfico:
npm create cloudflare@latest— cria o Worker com o template basenpx wrangler@latest d1 create blog— cria o banco D1 e devolve odatabase_idnpx wrangler d1 execute blog --file=schema.sql— aplica o schema (posts, tags, comentários, views)- Assets estáticos declarados no
wrangler.toml— CSS e JS saem do bundle, não do banco npx wrangler deploy— o site está no ar em minutos, com URL*.workers.devde brinde- Domínio próprio no painel da Cloudflare e
Cache-Control: immutablenas imagens
O passo 6 é o que eu faria primeiro se pudesse voltar atrás: imagem com cache imutável não pode ser sobrescrita depois. Se você trocar os bytes do arquivo mantendo o mesmo endereço, o navegador do leitor continua vendo o antigo por um ano. A solução é subir arquivo novo com ID novo, nunca reaproveitar caminho.
E é isso que roda aqui: um blog que publica review de Clair Obscur: Expedition 33, opinião sobre a espera por Silksong e notícia como The Outlast Trials chegando ao Switch 2 — sem nenhuma infraestrutura além do plano free.
Veredito de quem montou: para blog, esse é o melhor custo-benefício que existe hoje em dia. Não porque é grátis, mas porque o grátis é grande o suficiente para você crescer dentro dele. O risco não é o limite — é montar sem índice e descobrir isso no dia em que o tráfego chegar.
Perguntas frequentes
O plano grátis da Cloudflare tem prazo ou é só teste?
Não tem prazo. A própria documentação de preços do D1 responde que o plano Free da Cloudflare vai sempre incluir a possibilidade de prototipar e rodar banco de graça, e os limites são diários e mensais renováveis, não uma janela de teste.
Preciso de cartão de crédito para começar?
Não. A conta gratuita é criada sem cartão, e você só informa pagamento se decidir migrar para o plano pago de US$ 5 por mês — o upgrade, segundo a própria Cloudflare, é aplicado em questão de minutos.
O que acontece se eu estourar o limite do banco?
Do D1: as queries param de responder e retornam erro dizendo que o limite diário de linhas foi excedido, até a virada da meia-noite UTC. O dado armazenado não é apagado nem corrompido — no dia seguinte tudo volta a funcionar sem intervenção.
Dá para hospedar as imagens do blog de graça?
Dá. Com 10 GB no R2 e imagens de 200 KB, cabem mais de 51 mil arquivos, e a transferência para o leitor não é cobrada em nenhum volume. O gargalo do blog vai ser o seu tempo de escrever, não o storage.
Créditos das imagens: capa e story — escritório da Cloudflare, fotos de HaeB via Wikimedia Commons (CC BY-SA 4.0); corpo — Carl Lender via Wikimedia Commons (CC BY 2.0).
carregando...