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:
- HTTPS automático — Certificados SSL sin configuración alguna
- Configuración simple — El Caddyfile es legible para humanos
- HTTP/2 y HTTP/3 — Habilitados por defecto
- Binario único — Sin dependencias
- Basado en API — Cambia la configuración sin reinicios
Caddy vs Nginx vs Traefik
| Característica | Caddy | Nginx | Traefik |
|---|---|---|---|
| HTTPS automático | Por defecto | Requiere Certbot | Integrado |
| Sintaxis de config | Simple | Moderada | Compleja |
| Integración Docker | Buena | Manual | Nativa |
| Rendimiento | Excelente | Excelente | Excelente |
| Plugins | Módulos Go | Módulos C | Middleware |
| Recarga de config | Sin tiempo de inactividad | Requiere señal | Recarga en caliente |
| Curva de aprendizaje | Baja | Moderada | Alta |
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:
- 1 vCPU
- 256MB RAM (para Caddy en sí)
- Puertos 80, 443
- Un nombre de dominio apuntando a tu VPS
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:
- Escuchar en los puertos 80 y 443
- Obtener un certificado SSL de Let’s Encrypt
- Redirigir HTTP a HTTPS
- Enviar el tráfico a tu aplicación en el puerto 3000
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
- Verifica que el DNS apunta a tu VPS:
dig +short domain.com
- Asegúrate de que los puertos 80 y 443 estén abiertos:
sudo ufw allow 80,443/tcp
- Revisa los registros de Caddy:
journalctl -u caddy --no-pager -n 50
# O para Docker:
docker logs caddy
502 Bad Gateway
- Verifica que el backend esté en ejecución:
curl localhost:3000
-
Comprueba la dirección del upstream en el Caddyfile
-
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
- Habilita la compresión:
encode gzip zstd
-
Verifica los tiempos de respuesta del backend
-
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
- Registros DNS apuntando al VPS
- Firewall permite los puertos 80, 443
- Caddyfile validado (
caddy validate) - Registros de acceso habilitados
- Encabezados de seguridad configurados
- Verificaciones de salud del backend configuradas
- Compresión habilitada
- Respaldo del directorio
/data(certificados)
Mejor VPS para Caddy
Caddy funciona en cualquier lugar. Elige tu VPS según las necesidades de tu backend:
| Proveedor | Plan | Precio | Ideal Para |
|---|---|---|---|
| Hostinger | KVM1 | $4.99 | Mejor relación calidad-precio para empezar |
| Hetzner | CX22 | €5.49 | Proyectos basados en Europa |
| DigitalOcean | Basic | $6 | Amigable para desarrolladores |
| Vultr | VC2 | $6 | Ubicaciones 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:
| Tarea | Nginx | Caddy |
|---|---|---|
| Obtener SSL | Instalar certbot, configurar | Automático |
| Agregar servicio | Editar config, probar, recargar | Agregar 3 líneas, recargar |
| Redirigir HTTP→HTTPS | Agregar bloque de servidor | Automático |
| Habilitar HTTP/2 | Configurar | Automático |
| Sintaxis de config | Compleja | Legible 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.
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
// related guides
$1 VPS Hosting 2026: Cheapest VPS Servers Starting at $1/Month
Looking for $1 VPS hosting? Compare the cheapest VPS providers starting from $1-3/month. Real specs, no hidden fees, honest reviews of budget VPS options.
tutorialCloudflare Tunnel VPS Guide 2026: Expose Services Without Opening Ports
Set up Cloudflare Tunnel on your VPS to expose web apps securely without opening ports or revealing your server IP. Complete guide with Docker and DNS config.
tutorialCoolify VPS Setup Guide 2026: Self-Hosted Vercel Alternative
Deploy Coolify on your VPS for a self-hosted Vercel/Netlify experience. Complete setup guide with Docker, SSL, and app deployments.
tutorialVPS with Crypto & No KYC — 7 Providers That Accept Bitcoin
Pay for VPS hosting with Bitcoin, Monero, or ETH — no ID required. We list 7 privacy-first providers with anonymous signup. Updated March 2026.
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.