
Vitrine de mercearia com CTA no WhatsApp, no plano Free da Cloudflare
Vitrine para um negócio real, a Mercearia Ricardo Aragão: catálogo editável e conversa no WhatsApp, sem checkout nem estoque. O dono atualiza textos, fotos e prateleira pelo admin, sem depender de desenvolvedor a cada mudança. Roda em Astro SSR no Workers Free, com fotos no R2 e cache longo na borda invalidado no save. Auth e operação foram calibrados ao teto de CPU e às cotas do plano Free, priorizando custo zero e manutenção simples.
Contexto técnico
Modelei um monólito SSR em Astro no Cloudflare Workers: a vitrine é HTML na borda e o /admin é uma ilha React que edita o mesmo conteúdo. O negócio é editorial (textos da página e lista de produtos), não pedidos nem estoque. Guardei esse conteúdo num documento único no D1 e as fotos no R2: para esse modelo, schema relacional e fila de migrations seria excesso. O trade-off é explícito: operação simples e custo zero no Free, em troca de não escalar para multi-usuário ou PDV.
Priorizei CDN-first. Páginas públicas ficam cacheadas por muito tempo na borda e o Worker invalida de forma seletiva depois de cada save, para o site continuar rápido sem queimar a cota do Free em miss constante. Auth e recuperação de senha foram calibrados ao teto de CPU e às cotas do plano, com sessão que cai quando as credenciais mudam.
Desafios de engenharia (como e por quê)
-
Conteúdo num documento, sem migrations atrás da outra: o admin salva textos e catálogo no mesmo registro. Cabe porque só muda copy e prateleira. Evita schema de e-commerce para um fluxo que termina no WhatsApp.
-
Duas abas sem last-write-wins: o save só grava se a versão que o admin leu ainda for a do banco. Conflito vira aviso explícito, não sobrescrita silenciosa.
-
Cache longo sem página velha após edição: HTML público fica na borda com invalidação por tag após save, reset ou mudança de produto. Sem isso, o Free gasta request em miss o tempo todo.
-
Fotos leves e lixo limpo: compressão roda no browser antes do upload. No save e em trocas de rascunho, apago no R2 o que deixou de ser referenciado. Assets de seed ficam intactos.
-
Sessão amarrada à senha atual: trocar ou recuperar a senha invalida tokens antigos sem lista de revogação. Recover e setup usam chave mestra e rate limit, falhando fechado se o limitador não responder.
-
Cadastro rápido por código de barras: no admin, o dono consulta e registra produto com leitor no browser. Preço, estoque e validade ficam de fora de propósito: a vitrine empurra para o WhatsApp, não para checkout.
- Astro
- Cloudflare Workers
- D1
- R2
- React
- Tailwind CSS