Logby

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.