Como diagnostiquei e corrigi o erro "cloudflare: failed to find zone... zone could not be found" ao emitir certificados Let's Encrypt via desafio DNS-01 com Traefik.
Depois de migrar o deploy deste portfólio pra uma VPS com Coolify, o primeiro deploy terminou sem erros — mas o site não carregava. O navegador bloqueava a conexão com um aviso de certificado inválido. Esse foi o ponto de partida pra um troubleshooting que ensinou mais sobre como o Let's Encrypt funciona na prática do que qualquer documentação.
O primeiro passo foi inspecionar o certificado real sendo servido: `openssl s_client -connect dominio:443 -servername dominio | openssl x509 -noout -issuer`. O resultado veio como `issuer=CN = TRAEFIK DEFAULT CERT` — ou seja, o Traefik (o proxy reverso que o Coolify usa por baixo) nunca tinha conseguido emitir um certificado válido, e estava caindo de volta pro certificado autoassinado padrão dele.
Minha primeira hipótese foi um problema clássico de desafio HTTP-01: testei bater diretamente em `http://dominio/.well-known/acme-challenge/teste` e recebi um redirect pra HTTPS. Isso pareceria o culpado óbvio — o Let's Encrypt precisa de uma resposta HTTP direta nesse caminho pra validar o domínio, e um redirect forçado pra HTTPS quebraria essa validação. Só que essa pista era falsa.
A causa real só apareceu no log do próprio Traefik (aba Proxy → Logs, no Coolify): esse setup estava configurado pra usar desafio **DNS-01** via API da Cloudflare, não HTTP-01. E o erro específico era: `cloudflare: failed to find zone dominio.: zone could not be found`.
Com DNS-01, o mecanismo é diferente: em vez de responder uma requisição HTTP, o Traefik usa um token de API pra criar um registro TXT temporário no DNS do domínio, provando que você controla a zona. Antes mesmo de criar esse registro, ele precisa localizar o ID da zona na API da Cloudflare — e é exatamente nessa busca que o erro acontecia.
A causa raiz era permissão insuficiente no token: ele tinha `Zone:DNS:Edit` (permissão pra escrever registros), mas não tinha `Zone:Zone:Read` (permissão pra listar/localizar a zona). Sem o Read, a chamada de busca da zona retorna vazia, e o Traefik reporta "zone could not be found" mesmo com o domínio existindo e configurado corretamente na mesma conta.
A correção foi recriar o token usando o template pronto "Edit zone DNS" da própria Cloudflare — que já vem com as duas permissões corretas combinadas — escopado especificamente pra aquela zona, atualizar a variável `CF_DNS_API_TOKEN` na configuração do proxy no Coolify e reiniciar o Traefik. Na tentativa seguinte, o certificado foi emitido sem erro.
Uma lição paralela: como o valor do token antigo tinha sido colado num lugar que não deveria (uma conversa, um log compartilhado), a prática correta é revogá-lo e gerar um novo assim que o problema for resolvido — mesmo que o ambiente pareça privado, token exposto é token comprometido.
E uma lição sobre leitura de log: o arquivo de log do proxy tinha outro erro repetido e não relacionado (`invalid value for HostSNI matcher`), sobra de configuração de outro domínio no mesmo servidor. Era fácil fixar atenção nesse erro por estar repetido com mais frequência — mas o problema real estava numa linha mais rara, específica e com um carimbo de horário batendo exatamente com a tentativa de deploy. Isolar o sintoma certo, não só o mais visível, foi o que resolveu.