Skip to content

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/null
shell
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/Caddyfile

Ejemplo 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

reload aplica los cambios sin cortar las conexiones activas. restart sí 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

Potenciado con café ☕ y VitePress 📘 | Hosteado con Cloudflare Pages ⚡