Guía de Proxy Inverso con Caddy 2026: HTTPS Automático Simplificado
TUTORIAL 12 min read fordnox

Guía de Proxy Inverso con Caddy 2026: HTTPS Automático Simplificado

Configura Caddy como proxy inverso con HTTPS automático, SSL sin configuración y sintaxis simple de Caddyfile. Guía completa de despliegue en VPS.


Guía de Proxy Inverso con Caddy: HTTPS Automático Simplificado

Caddy es el servidor web que usa HTTPS por defecto. Sin certbot, sin tareas cron, sin scripts de renovación. Apunta un dominio a Caddy y obtiene un certificado automáticamente.

¿Qué es Caddy?

Caddy se sitúa entre internet y tus servicios:

Internet → Caddy → Servicio A (app.domain.com)
                 → Servicio B (api.domain.com)
                 → Servicio C (admin.domain.com)

Por qué los desarrolladores aman Caddy:

Caddy vs Nginx vs Traefik

CaracterísticaCaddyNginxTraefik
HTTPS automáticoPor defectoRequiere CertbotIntegrado
Sintaxis de configSimpleModeradaCompleja
Integración DockerBuenaManualNativa
RendimientoExcelenteExcelenteExcelente
PluginsMódulos GoMódulos CMiddleware
Recarga de configSin tiempo de inactividadRequiere señalRecarga en caliente
Curva de aprendizajeBajaModeradaAlta

Caddy gana en simplicidad. Si quieres la configuración de proxy inverso más fácil, esta es. Consulta nuestra guía de Traefik con Docker para enrutamiento nativo de contenedores.

Requisitos del VPS

Caddy es extremadamente ligero:

El dimensionamiento de tu VPS depende de tus servicios backend, no de Caddy. Consulta nuestra guía de mejor VPS para Docker para recomendaciones de dimensionamiento.

Instalar Caddy

Opción 1: Gestor de Paquetes (Debian/Ubuntu)

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
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

Opción 2: Docker

# docker-compose.yml
services:
  caddy:
    image: caddy:2-alpine
    container_name: caddy
    restart: unless-stopped
    ports:
      - 80:80
      - 443:443
      - 443:443/udp  # HTTP/3
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config

volumes:
  caddy_data:
  caddy_config:

Opción 3: Binario Único

curl -sS https://webi.sh/caddy | sh

Proxy Inverso Básico

El Caddyfile Más Simple

app.domain.com {
    reverse_proxy localhost:3000
}

Eso es todo. Caddy hará lo siguiente:

Múltiples Servicios

app.domain.com {
    reverse_proxy localhost:3000
}

api.domain.com {
    reverse_proxy localhost:8080
}

admin.domain.com {
    reverse_proxy localhost:9000
}

Cada dominio obtiene su propio certificado automáticamente.

Configuración de Proxy Inverso con Docker

Paso 1: Crear el Directorio del Proyecto

mkdir -p /opt/caddy
cd /opt/caddy

Paso 2: Docker Compose

# docker-compose.yml
services:
  caddy:
    image: caddy:2-alpine
    container_name: caddy
    restart: unless-stopped
    ports:
      - 80:80
      - 443:443
      - 443:443/udp
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config
    networks:
      - caddy

  whoami:
    image: traefik/whoami
    container_name: whoami
    networks:
      - caddy

networks:
  caddy:
    name: caddy

volumes:
  caddy_data:
  caddy_config:

Paso 3: Caddyfile

test.domain.com {
    reverse_proxy whoami:80
}

Paso 4: Lanzar

docker compose up -d

Visita https://test.domain.com — funciona con HTTPS completo.

Agregar Más Servicios Docker

Cualquier servicio en la red caddy puede ser proxificado:

# docker-compose.yml separado
services:
  myapp:
    image: myapp:latest
    container_name: myapp
    networks:
      - caddy

networks:
  caddy:
    external: true

Luego agrega a tu Caddyfile:

myapp.domain.com {
    reverse_proxy myapp:8080
}

Recarga Caddy:

docker exec caddy caddy reload --config /etc/caddy/Caddyfile

Enrutamiento Basado en Rutas

Enrutar por Ruta

domain.com {
    handle /api/* {
        reverse_proxy localhost:8080
    }

    handle /admin/* {
        reverse_proxy localhost:9000
    }

    handle {
        reverse_proxy localhost:3000
    }
}

Eliminar Prefijo de Ruta

domain.com {
    handle_path /api/* {
        reverse_proxy localhost:8080
    }
}

handle_path elimina el prefijo coincidente. /api/users se convierte en /users para el backend.

Balanceo de Carga

Round Robin (Por Defecto)

app.domain.com {
    reverse_proxy app1:3000 app2:3000 app3:3000
}

Con Verificaciones de Salud

app.domain.com {
    reverse_proxy app1:3000 app2:3000 {
        health_uri /health
        health_interval 10s
        health_timeout 5s
    }
}

Sesiones Persistentes

app.domain.com {
    reverse_proxy app1:3000 app2:3000 {
        lb_policy cookie
    }
}

Menor Número de Conexiones

app.domain.com {
    reverse_proxy app1:3000 app2:3000 {
        lb_policy least_conn
    }
}

Seguridad

Autenticación Básica

# Generar hash de contraseña
caddy hash-password --plaintext 'your-secure-password'
admin.domain.com {
    basicauth {
        admin $2a$14$Zkx19...hashed...password
    }
    reverse_proxy localhost:9000
}

Lista Blanca de IP

admin.domain.com {
    @blocked not remote_ip 192.168.1.0/24 10.0.0.0/8
    respond @blocked 403

    reverse_proxy localhost:9000
}

Limitación de Tasa

api.domain.com {
    rate_limit {
        zone dynamic {
            key {remote_host}
            events 100
            window 1m
        }
    }
    reverse_proxy localhost:8080
}

Encabezados de Seguridad

domain.com {
    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"
        -Server
    }
    reverse_proxy localhost:3000
}

La directiva -Server elimina el encabezado Server de las respuestas.

Certificados Wildcard

Para *.domain.com, usa el desafío DNS:

*.domain.com {
    tls {
        dns cloudflare {env.CF_API_TOKEN}
    }

    @app host app.domain.com
    handle @app {
        reverse_proxy localhost:3000
    }

    @api host api.domain.com
    handle @api {
        reverse_proxy localhost:8080
    }
}

Compila Caddy con el módulo DNS de Cloudflare:

xcaddy build --with github.com/caddy-dns/cloudflare

O usa la imagen Docker con módulos:

services:
  caddy:
    image: caddy:2-builder AS builder
    # Usa multi-stage o imagen personalizada pre-compilada

Archivos Estáticos + API

SPA con Backend de API

domain.com {
    handle /api/* {
        reverse_proxy localhost:8080
    }

    handle {
        root * /srv/frontend
        try_files {path} /index.html
        file_server
    }
}

Servir Estáticos + Proxy

domain.com {
    root * /var/www/html
    file_server

    handle /app/* {
        reverse_proxy localhost:3000
    }
}

Soporte para WebSocket

Caddy proxifica conexiones WebSocket automáticamente:

ws.domain.com {
    reverse_proxy localhost:8080
}

No se necesita configuración adicional. Caddy detecta el encabezado Upgrade y lo gestiona.

Registros

Registros de Acceso

domain.com {
    log {
        output file /var/log/caddy/access.log {
            roll_size 100mb
            roll_keep 5
        }
        format json
    }
    reverse_proxy localhost:3000
}

Registros por Sitio

app.domain.com {
    log {
        output file /var/log/caddy/app.log
    }
    reverse_proxy localhost:3000
}

api.domain.com {
    log {
        output file /var/log/caddy/api.log
    }
    reverse_proxy localhost:8080
}

Compresión

domain.com {
    encode gzip zstd
    reverse_proxy localhost:3000
}

Caddy soporta compresión tanto gzip como Zstandard de forma nativa.

Encabezados CORS

api.domain.com {
    header Access-Control-Allow-Origin "https://app.domain.com"
    header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
    header Access-Control-Allow-Headers "Content-Type, Authorization"

    @options method OPTIONS
    respond @options 204

    reverse_proxy localhost:8080
}

Redirecciones

WWW a Dominio Raíz

www.domain.com {
    redir https://domain.com{uri} permanent
}

domain.com {
    reverse_proxy localhost:3000
}

HTTP a HTTPS

Caddy hace esto automáticamente. No se necesita configuración.

Redirecciones Personalizadas

domain.com {
    redir /old-page /new-page permanent
    redir /blog/* /articles/{re.1} permanent
    reverse_proxy localhost:3000
}

Caché

domain.com {
    header /static/* Cache-Control "public, max-age=31536000, immutable"
    header /api/* Cache-Control "no-cache"
    reverse_proxy localhost:3000
}

Configuración vía API

Caddy tiene una API REST completa para cambios de configuración:

# Obtener configuración actual
curl localhost:2019/config/

# Actualizar una ruta
curl localhost:2019/config/apps/http/servers/srv0/routes/0 \
  -X PUT \
  -H "Content-Type: application/json" \
  -d '{"handle": [{"handler": "reverse_proxy", "upstreams": [{"dial": "localhost:3001"}]}]}'

# Recargar desde Caddyfile
caddy reload --config /etc/caddy/Caddyfile

Solución de Problemas

Certificado No Emitido

  1. Verifica que el DNS apunta a tu VPS:
dig +short domain.com
  1. Asegúrate de que los puertos 80 y 443 estén abiertos:
sudo ufw allow 80,443/tcp
  1. Revisa los registros de Caddy:
journalctl -u caddy --no-pager -n 50
# O para Docker:
docker logs caddy

502 Bad Gateway

  1. Verifica que el backend esté en ejecución:
curl localhost:3000
  1. Comprueba la dirección del upstream en el Caddyfile

  2. Para Docker: asegúrate de que ambos contenedores estén en la misma red

Error de Sintaxis en la Configuración

caddy validate --config /etc/caddy/Caddyfile

Rendimiento Lento

  1. Habilita la compresión:
encode gzip zstd
  1. Verifica los tiempos de respuesta del backend

  2. Agrega tiempos de espera de conexión:

reverse_proxy localhost:3000 {
    transport http {
        dial_timeout 5s
        response_header_timeout 10s
    }
}

Lista de Verificación para Producción

Mejor VPS para Caddy

Caddy funciona en cualquier lugar. Elige tu VPS según las necesidades de tu backend:

ProveedorPlanPrecioIdeal Para
HostingerKVM1$4.99Mejor relación calidad-precio para empezar
HetznerCX22€5.49Proyectos basados en Europa
DigitalOceanBasic$6Amigable para desarrolladores
VultrVC2$6Ubicaciones globales en el borde

Hostinger ofrece la mejor relación calidad-precio si estás empezando. Su plan KVM1 maneja Caddy más varios servicios backend cómodamente.

Preguntas Frecuentes

¿Está Caddy listo para producción?

Absolutamente. Caddy v2 impulsa miles de sitios en producción. Es utilizado por empresas de todos los tamaños.

¿Caddy vs Nginx para proxy inverso?

Caddy por simplicidad y HTTPS automático. Nginx para máximo control y configuraciones heredadas. Para la mayoría de los nuevos despliegues, Caddy ahorra horas de tiempo de configuración.

¿Cómo funciona el HTTPS automático?

Caddy usa el protocolo ACME para obtener certificados de Let’s Encrypt (o ZeroSSL). Gestiona la emisión, renovación y grapado OCSP automáticamente.

¿Puede Caddy reemplazar a Apache?

Sí. Caddy maneja todo lo que Apache hace para despliegues web modernos, con una fracción de la configuración.

¿Caddy soporta HTTP/3?

Sí, HTTP/3 (QUIC) está habilitado por defecto en el puerto HTTPS.

¿Cómo actualizo Caddy?

Gestor de paquetes: apt upgrade caddy. Docker: descarga la nueva imagen. Binario: descarga y reemplaza.

Resumen

Caddy simplifica el proxy inverso:

TareaNginxCaddy
Obtener SSLInstalar certbot, configurarAutomático
Agregar servicioEditar config, probar, recargarAgregar 3 líneas, recargar
Redirigir HTTP→HTTPSAgregar bloque de servidorAutomático
Habilitar HTTP/2ConfigurarAutomático
Sintaxis de configComplejaLegible para humanos

Tres líneas en un Caddyfile reemplazan docenas en la configuración de Nginx. Para proyectos nuevos, Caddy es el camino más rápido hacia un proxy inverso seguro y listo para producción. Combínalo con Docker Compose para un flujo de trabajo de despliegue completo, o consulta nuestra guía de endurecimiento de VPS para asegurar el resto de tu servidor.

~/caddy-reverse-proxy-guide/get-started

Ready to get started?

Get the best VPS hosting deal today. Hostinger offers 4GB RAM VPS starting at just $4.99/mo.

Get Hostinger VPS — $4.99/mo

// up to 75% off + free domain included

// related topics

caddy proxy inverso configuración servidor caddy caddy ssl caddy docker caddy vs nginx

// related guides

Andrius Putna

Andrius Putna

I am Andrius Putna. Geek. Since early 2000 in love tinkering with web technologies. Now AI. Bridging business and technology to drive meaningful impact. Combining expertise in customer experience, technology, and business strategy to deliver valuable insights. Father, open-source contributor, investor, 2xIronman, MBA graduate.

// last updated: March 11, 2026. Disclosure: This article may contain affiliate links.