Configuración de Docker Compose para Caddy 2 Reverse Proxy + Static Web Server
Cuándo usar esta combinación
Esta arquitectura es ideal para desplegar aplicaciones web estáticas modernas (SPA con React, Vue, Svelte o generadores como Astro/Hugo) que requieren aprovisionamiento automático de certificados SSL/TLS, soporte nativo para HTTP/3 y un consumo mínimo de recursos. Caddy 2 actúa simultáneamente como servidor web estático ultrarrápido y reverse proxy, eliminando la sobrecarga operativa de gestionar demonios separados como Nginx y Certbot.
Configuración de Referencia
docker-compose.yml
services:
caddy:
image: caddy:2-alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp" # Soporte HTTP/3 (QUIC)
environment:
- DOMAIN_NAME=${DOMAIN_NAME}
- TLS_EMAIL=${TLS_EMAIL}
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./dist:/srv:ro
- caddy_data:/data
- caddy_config:/config
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /tmp
volumes:
caddy_data:
caddy_config:
Caddyfile
{
email {$TLS_EMAIL}
}
{$DOMAIN_NAME} {
root * /srv
encode zstd gzip
file_server
# Soporte SPA: redirige 404 a index.html
try_files {path} /index.html
# Security Headers
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
Referrer-Policy "strict-origin-when-cross-origin"
}
}
Variables de Entorno Críticas para Producción
DOMAIN_NAME(ej.app.tudominio.com): FQDN público hacia el que apuntan los registros DNS A/AAAA. Indispensable para que el desafío ACME funcione.TLS_EMAIL(ej.[email protected]): Dirección requerida por Let’s Encrypt / ZeroSSL para emitir certificados y enviar alertas críticas de expiración o revocación.CADDY_TLS_CA(opcional/staging): Cambiar a la CA de staging de Let’s Encrypt (https://acme-staging-v02.api.letsencrypt.org/directory) durante pruebas previas para evitar bloqueos por Rate Limiting en los límites de emisión en producción.
Consejo Senior de Rendimiento y Seguridad
- Persistencia de Certificados: Es crítico montar el volumen persistente en
/data. Caddy almacena allí las claves privadas y los certificados emitidos. Si este volumen se destruye o es efímero, cada reinicio del contenedor solicitará nuevos certificados, alcanzando rápidamente los límites semanales de Let’s Encrypt (Rate Limit 429), dejando el servicio fuera de línea. - Hardening: Monta los archivos estáticos (
/srv) y elCaddyfileen modo solo lectura (:ro) y ejecuta el contenedor conread_only: truepara mitigar vectores de inyección en tiempo de ejecución.
Checklist de Seguridad antes de desplegar
- Cambiar las contraseñas por defecto en el archivo .env
- Mapear volúmenes persistentes en el VPS
- Configurar las reglas de firewall para los puertos requeridos