Hospedando um site estático de graça no Cloudflare Pages com deploy via Azure DevOps
Por Tiago Spana
Depois de gerar o site como arquivos estáticos, falta a última etapa: colocar no ar. O Cloudflare Pages tem um plano gratuito generoso — CDN global, HTTPS automático, domínio *.pages.dev e builds/deploys sem custo. Para um blog, é difícil justificar outra coisa.
Deploy direto, sem integração Git
O Pages tem integração nativa com GitHub e GitLab, mas não com Azure DevOps. A saída é o modo Direct Upload: o pipeline gera a pasta dist/ e envia com o Wrangler, a CLI da Cloudflare:
npx wrangler pages deploy ./dist --project-name=meu-blog
O comando precisa de duas variáveis de ambiente: CLOUDFLARE_ACCOUNT_ID e CLOUDFLARE_API_TOKEN (crie o token com a permissão Cloudflare Pages — Edit e guarde como variável secreta do pipeline).
O esqueleto do pipeline
No Azure DevOps, o fluxo tem três passos: gerar o site, instalar o Node (para o Wrangler) e publicar:
steps:
- task: UseDotNet@2
inputs:
packageType: sdk
version: 9.x
- script: dotnet run --project src/MeuSite -- ssg
displayName: Generate static site
- task: NodeTool@0
inputs:
versionSpec: 22.x
- script: npx wrangler pages deploy ./dist --project-name=meu-blog
displayName: Deploy to Cloudflare Pages
env:
CLOUDFLARE_ACCOUNT_ID: $(CLOUDFLARE_ACCOUNT_ID)
CLOUDFLARE_API_TOKEN: $(CLOUDFLARE_API_TOKEN)
URLs limpas
Uma conveniência do Pages: se o site tem posts/meu-post/index.html, a URL pública é simplesmente /posts/meu-post/ — sem extensão, sem configuração de rewrite. Por isso vale gerar cada página como pasta/index.html em vez de pagina.html; os links do site ficam idênticos aos da versão dinâmica.
Custo final
Zero. O domínio próprio é opcional (e é o único custo real do setup); o restante — hospedagem, certificado, CDN e pipeline (com os 1.800 minutos/mês gratuitos do Azure DevOps para projetos privados) — cabe inteiro no plano free.