Certbot com o plugin certbot-dns-cloudflare para emissão e renovação automatizada de certificados TLS Let's Encrypt via desafio DNS-01. Permite gerar certificados wildcard e para domínios sem expor a porta 80, ideal para serviços internos com DNS gerenciado na Cloudflare.
| Item | Valor |
|---|---|
| Imagem | lzocateli/certbot-dns-cloudflare:5.7.0 |
| Imagem base | certbot/dns-cloudflare:v5.7.0 |
| Plataformas | linux/amd64 |
| Usuário padrão | root (exigido pelo certbot para gravação dos certificados) |
| Entry point | certbot (herdado da imagem base) |
| Diretório de trabalho | / |
| Código-fonte | https://github.com/lzocateli/containers/tree/main/certbot |
| Documentação | https://github.com/lzocateli/containers/tree/main/certbot |
certbot-dns-cloudflare para desafio DNS-01;lzocateli/certbot-dns-cloudflare.docker pull lzocateli/certbot-dns-cloudflare:5.7.0
docker run --rm lzocateli/certbot-dns-cloudflare:5.7.0 --version
Crie o arquivo de credenciais da Cloudflare (não versione este arquivo):
# /caminho/local/.secrets/certbot/cloudflare.ini
dns_cloudflare_api_token = SEU_TOKEN_AQUI
Execute a emissão com desafio DNS-01:
docker run --rm \
--name certbot \
-v /userapps/certs:/etc/letsencrypt:z \
-v /userapps/certs/_logs:/var/log/letsencrypt:z \
-v /caminho/local/.secrets/certbot/cloudflare.ini:/root/.secrets/certbot/cloudflare.ini:ro,z \
lzocateli/certbot-dns-cloudflare:5.7.0 \
certonly \
--noninteractive \
--dns-cloudflare \
--dns-cloudflare-credentials /root/.secrets/certbot/cloudflare.ini \
--force-renewal \
--max-log-backups 5 \
-d exemplo.com.br \
-d "*.exemplo.com.br" \
--email [email protected] \
--agree-tos
Após a execução, copie o certificado para o seu web server:
cp /userapps/certs/live/exemplo.com.br/fullchain.pem /userapps/ssl/exemplo.com.br.pem
cp /userapps/certs/live/exemplo.com.br/privkey.pem /userapps/ssl/exemplo.com.br.key
Exemplo de execução pontual integrada a um stack Compose:
services:
certbot:
image: lzocateli/certbot-dns-cloudflare:5.7.0
volumes:
- /userapps/certs:/etc/letsencrypt:z
- /userapps/certs/_logs:/var/log/letsencrypt:z
- /caminho/local/.secrets/certbot/cloudflare.ini:/root/.secrets/certbot/cloudflare.ini:ro,z
command: >
certonly
--noninteractive
--dns-cloudflare
--dns-cloudflare-credentials /root/.secrets/certbot/cloudflare.ini
--force-renewal
--max-log-backups 5
-d exemplo.com.br
--email [email protected]
--agree-tos
Esta imagem não define variáveis de ambiente adicionais. Todas as configurações são passadas como argumentos CLI ao certbot.
| Caminho no contêiner | Modo | Conteúdo | Backup necessário |
|---|---|---|---|
/etc/letsencrypt | rw | Certificados, chaves e metadados de renovação | Sim |
/var/log/letsencrypt | rw | Logs de emissão e renovação | Não |
/root/.secrets/certbot/cloudflare.ini | ro | Token de API da Cloudflare | Não (gerenciado externamente) |
O arquivo cloudflare.ini deve conter somente:
dns_cloudflare_api_token = SEU_TOKEN_AQUI
Permissões recomendadas no host: chmod 600 cloudflare.ini. Nunca versione este arquivo; use .gitignore para bloqueá-lo.
O token de API da Cloudflare precisa das seguintes permissões:

O contêiner executa certbot como processo único, grava os certificados no mount /etc/letsencrypt e encerra. Não é um serviço de longa duração.
Para renovação automática, configure um cron job ou systemd timer no host que execute o contêiner periodicamente (ex.: duas vezes por semana). Certbot renova apenas certificados que expiram em menos de 30 dias quando usado com renew.
Exemplo de cron para renovação:
0 3 * * 1,4 docker run --rm -v /userapps/certs:/etc/letsencrypt:z -v /userapps/certs/_logs:/var/log/letsencrypt:z -v /caminho/.secrets/certbot/cloudflare.ini:/root/.secrets/certbot/cloudflare.ini:ro,z lzocateli/certbot-dns-cloudflare:5.7.0 renew --quiet
root — necessário para gravação dos certificados nas pastas gerenciadas pelo certbot;cloudflare.ini deve ser montado como somente leitura (:ro);docker inspect;600 no arquivo de credenciais no host;/etc/letsencrypt com permissão de escrita para outros contêineres além do certbot e do web server que lê os certificados;Para validar o fluxo sem consumir os limites de rate da Let's Encrypt, acrescente os argumentos abaixo. Os certificados gerados serão inválidos para produção:
--test-cert \
--server https://acme-staging-v02.api.letsencrypt.org/directory
docker build --pull --tag lzocateli/certbot-dns-cloudflare:5.7.0 certbot
| Tag | Mutabilidade | Compatibilidade | Uso recomendado |
|---|---|---|---|
5.7.0 | Imutável | Certbot 5.7.0 + plugin dns-cloudflare | Produção |
Não há política para latest. Atualize a tag na composição e valide a renovação antes do rollout.
Antes da publicação, confirme:
.gitignore e .dockerignore presentes e bloqueando .secrets/ e *.ini;docker run --rm lzocateli/certbot-dns-cloudflare:5.7.0 --version;docker inspect lzocateli/certbot-dns-cloudflare:5.7.0 --format '{{json .Config.Labels}}';--test-cert) com domínio de teste antes da publicação.docker buildx build --check --file certbot/Dockerfile certbot
docker build --pull --tag lzocateli/certbot-dns-cloudflare:5.7.0 certbot
docker run --rm lzocateli/certbot-dns-cloudflare:5.7.0 --version
docker inspect lzocateli/certbot-dns-cloudflare:5.7.0 --format '{{json .Config.Labels}}'
Use Actions > Publicar imagem de container > Run workflow com:
context_path: certbot;image_name: certbot-dns-cloudflare;image_tag: 5.7.0;dockerfile: Dockerfile;platforms: linux/amd64.O workflow publica no Docker Hub com SBOM e proveniência e pode sincronizar este README. A publicação não ocorre durante o build local.
Mantenha backup do diretório /etc/letsencrypt do host — ele contém as chaves privadas e metadados de renovação. Para atualizar a imagem, reconstrua com a nova tag, valide com staging e ajuste o cron/systemd timer.
| Sintoma | Causa provável | Verificação | Correção |
|---|---|---|---|
Error: certbot.errors.PluginError | Token de API inválido ou sem permissão DNS | Verifique permissões do token na Cloudflare | Crie token com Zone → DNS → Edit e Zone → Zone → Read |
Permission denied ao ler .ini | Permissão incorreta no arquivo de credenciais | ls -la /caminho/.secrets/certbot/cloudflare.ini | chmod 600 cloudflare.ini |
| Certificado não renovado | Expira em mais de 30 dias | certbot certificates | Use --force-renewal para forçar |
Too Many Requests (rate limit) | Muitas emissões no mesmo domínio | Verifique o histórico em https://crt.sh | Use --test-cert para testes; aguarde o reset do limite |
| DNS propagation timeout | Cloudflare demorou para propagar a entrada TXT | Adicione --dns-cloudflare-propagation-seconds 60 | Aumente o timeout de propagação |
dns-cloudflare; outros provedores DNS exigem imagens diferentes.linux/amd64 apenas.| Componente | Versão | Licença | Fonte |
|---|---|---|---|
| Conteúdo original deste repositório | Atual | MIT | https://github.com/lzocateli/containers |
| certbot | 5.7.0 | Apache-2.0 | https://github.com/certbot/certbot |
| certbot-dns-cloudflare | incluído | Apache-2.0 | https://github.com/certbot/certbot |
O badge MIT descreve somente o conteúdo original deste repositório. A imagem inclui componentes de terceiros que permanecem sujeitos aos termos e avisos de suas fontes. Consulte a política de licenciamento, preserve as atribuições upstream e verifique também os avisos distribuídos dentro da imagem.
| Tag | Alteração |
|---|---|
5.7.0 | Atualização da base para certbot/dns-cloudflare:v5.7.0; adição de labels OCI, .gitignore e .dockerignore |
Content type
Image
Digest
sha256:e58c1a4b2…
Size
89.4 MB
Last updated
28 days ago
docker pull lzocateli/certbot-dns-cloudflare:5.7.0