← Volver al Generador Principal

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

  1. 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.
  2. 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.
  3. 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

Checklist de Seguridad antes de desplegar