Caddy Server
♻️ Actualizar lista de paquetes e instalar actualizaciones
shell
sudo apt update && sudo apt upgrade -y📦 Instalar dependencias previas
shell
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl✏️ Registrar repositorio de Caddy
shell
curl -fsSL https://dl.cloudsmith.io/public/caddy/stable/gpg.key | sudo tee /usr/share/keyrings/caddy-keyring.asc >/dev/nullshell
echo "deb [signed-by=/usr/share/keyrings/caddy-keyring.asc] https://dl.cloudsmith.io/public/caddy/stable/deb/debian any-version main" | sudo tee /etc/apt/sources.list.d/caddy.list💾 Instalar Caddy
shell
sudo apt update && sudo apt install caddy -y📋 Configurar Caddy
Abrir el archivo
shell
sudo nano /etc/caddy/CaddyfileEjemplo de archivo de configuracion
php
# Parámetros globales para Caddy
{
servers :443 {
name caddyHttps # darle nombre para los logs
protocols h1 h2 # soporte solo para HTTP1 y HTTP2
listener_wrappers {
http_redirect
tls
}
}
servers :80 {
name caddyHttp # darle nombre para los logs
protocols h1 h2 # soporte solo para HTTP1 y HTTP2
}
# para recibir correos de expiración del cert
email tucorreo@dominio.com
}
# Ejemplo de configuración subdominio como host de assets
filehost.proyecto.com {
encode gzip # optimizar las requests
file_server # mostrar UI para descargar recursos de esta carpeta
root * /ruta/elegida # carpeta de contenidos a servir
}
# Redirigir www hacia el dominio raíz
# (el redirect http -> https ya lo hace Caddy automáticamente, salvo que "auto_https" esté en "off")
www.proyecto.com {
redir https://proyecto.com{uri} permanent
}
# Si utilizas CloudFlare, capturar los headers para pasarlo a los proxys
(cloudflare_headers) {
header_up X-Forwarded-For {http.request.header.CF-Connecting-IP}
header_up CF-Connecting-IP {http.request.header.CF-Connecting-IP}
header_up CF-Ray {http.request.header.CF-Ray}
header_up CF-Country {http.request.header.CF-Country}
}
# Ejemplo de subdominio proxy
api.proyecto.com {
encode gzip # optimizar las requests
# Headers adicionales
header {
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-XSS-Protection "1; mode=block"
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Referrer-Policy strict-no-referrer
}
# Proxy directo al backend
# (WebSockets funcionan out-of-the-box, no requiere configuración adicional)
reverse_proxy localhost:3000 {
import cloudflare_headers
}
}
# Ejemplo de subdominio con autenticación básica
auth.proyecto.com {
encode gzip # optimizar las requests
# los usuarios que deseas, el hash puedes generar con
# caddy hash-password --plaintext 'tu-password'
basic_auth {
usuario $2a$14$laContraseñaHasheadaConBcrypt
}
reverse_proxy localhost:3005
}
# Ejemplo de subdominio sirviendo SPA (React, Vue, etc.)
spa.proyecto.com {
encode gzip # optimizar las requests
root * /var/www/spa/dist
file_server
try_files {path} /index.html
}✅ Validar la configuración
shell
sudo caddy validate --config /etc/caddy/Caddyfile🔁 Recargar sin downtime
shell
sudo systemctl reload caddy
reloadaplica los cambios sin cortar las conexiones activas.restartsí las corta.
⚙️ Servicio systemd
shell
sudo systemctl enable caddy # iniciar junto al sistema
sudo systemctl start caddy # iniciar el servicio
sudo systemctl status caddy # ver estado
sudo systemctl restart caddy # reiniciar (corta conexiones)📜 Ver logs
shell
sudo journalctl -u caddy -f🧱 Firewall (ufw)
shell
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload