1. Por que Caddy
Caddy obtém e renova certificados Let's Encrypt automaticamente. A configuração (Caddyfile) é legível e curta. Ideal para homelab, MVPs e serviços internos que precisam de HTTPS sem gerenciar certbot.
2. Instalação
# Ubuntu (pacote oficial)
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
# siga a doc oficial para o repositório
sudo apt update && sudo apt install caddy
# ou Docker
docker run -d --name caddy \
-p 80:80 -p 443:443 \
-v $PWD/Caddyfile:/etc/caddy/Caddyfile \
-v caddy_data:/data \
caddy:2
3. Caddyfile básico
# /etc/caddy/Caddyfile
exemplo.com {
root * /var/www/html
file_server
}
app.exemplo.com {
reverse_proxy localhost:3000
}
sudo systemctl reload caddy
# ou: caddy reload --config /etc/caddy/Caddyfile
DICA · O domínio precisa apontar (A/AAAA) para o servidor e as portas 80/443 precisam estar abertas.
4. Proxy para app e Docker
api.exemplo.com {
reverse_proxy 127.0.0.1:8080
}
# múltiplos backends (load balance simples)
app.exemplo.com {
reverse_proxy app1:3000 app2:3000
}
# path específico
exemplo.com {
handle /api/* {
reverse_proxy localhost:8080
}
handle {
root * /var/www
file_server
}
}
5. Headers e compressão
exemplo.com {
encode gzip zstd
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options nosniff
X-Frame-Options DENY
-Server
}
reverse_proxy localhost:3000
}
6. Checklist
- DNS apontando corretamente
- Portas 80 e 443 liberadas
- Volume de dados do Caddy persistente (certificados)
- Reload após mudanças no Caddyfile
- Teste de HTTPS e redirecionamento HTTP→HTTPS
7. Erros comuns
| Sintoma | Causa | Solução |
|---|---|---|
| Certificado não emite | DNS ou porta 80 bloqueada | Confirme A record e firewall |
| 502 Bad Gateway | Backend offline ou endereço errado | Teste o upstream localmente |
| Config não aplica | Reload não feito | caddy reload ou systemctl |
| Conflito de porta | Nginx ou outro serviço na 80/443 | Pare o outro serviço ou mude portas |