Instalá Caddy desde los repositorios oficiales en Ubuntu paso a paso

DUGLAS MORENODUGLAS MORENO 👁 3

Instalación de Caddy desde los repositorios oficiales en Ubuntu

Introducción

Si estás buscando un servidor web moderno, rápido y con soporte nativo para HTTP/3 y SSL automático, Caddy es una excelente opción. A diferencia de Nginx o Apache, Caddy se destaca por su configuración automática y cero‑complexidad, lo que significa que podés empezar a servir contenido casi sin editar archivos. Sin embargo, la mayor parte de los usuarios terminan necesitando personalizar la configuración o integrarlo con otros servicios, y ahí el uso de un gestor de paquetes adecuado se vuelve esencial.

En esta guía vas a aprender a instalar Caddy desde sus repositorios oficiales en Ubuntu, verificar la instalación, empezar el servicio, y darle los primeros toques con una configuración básica, todo ello con comandos claros y sus respectivas salidas esperadas. También voy a repasar algunas prácticas recomendadas y errores comunes para que puedas mantener tu servidor web robusto y actualizado.

¿Qué vas a poder hacer después de terminar esta guía?

  • Agregar el repositorio oficial de Caddy en Ubuntu.
  • Instalar Caddy usando apt.
  • Verificar la versión instalada.
  • Iniciar y habilitar el servicio con systemd.
  • Crear una configuración mínima de ejemplo, servir una página estática y configurar un proxy inverso básico.
  • Obtener un certificado SSL gratuito con Let's Encrypt.
  • Actualizar, mantener y desinstalar Caddy cuando lo necesites.

Este artículo está dirigido a administradores de sistemas, desarrolladores DevOps y cualquier persona que quiera un servidor web moderno y fácil de mantener en una distribución basada en Debian como Ubuntu.

¿Qué es Caddy?

Caddy es un servidor HTTP/3 moderno escrito en Go. Algunas características clave son:

  • Auto‑TLS: obtiene automáticamente certificados SSL válidos desde Let's Encrypt.
  • Configuración automática: puede servir archivos estáticos sin necesidad de una configuración explícita.
  • Soporte para HTTP/3 y TLS 1.3 de fábrica.
  • Módulos integrados para servir archivos, redirección, proxy inverso, websockets, etc.
  • Escalabilidad basada en eventos (como Kestrel) lo que lo hace muy liviano.

Dado que Caddy está disponible como un paquete de Debian/Ubuntu, podés instalarlo a través de apt de la misma manera que cualquier otra herramienta del sistema, lo que facilita las actualizaciones y el mantenimiento.

Requisitos previos

  • Una máquina Ubuntu limpia (servidor o VM) con acceso de root (o un usuario con sudo).
  • Una versión reciente de Ubuntu LTS (22.04, 24.04, etc.).
  • Acceso a Internet (para descargar paquetes y validar certificados).
  • Un nombre de dominio que quieras asociar con el servidor (por ejemplo, example.com).

Paso 1: Actualizar el índice de paquetes del sistema

Es buena práctica actualizar la lista de paquetes antes de instalar cualquier cosa nueva. Esto asegura que obtienes las versiones más recientes y los metadatos del repositorio.

# Ejecutar como root o con sudo
sudo apt update

Salida esperada (parte relevante)

Hit http://archive.ubuntu.com/ubuntu focal InRelease
Hit http://archive.ubuntu.com/ubuntu focal/main amd64 1,234 kB
...
Get 1,234 kB in 0s
Fetched 12,3 MB
Reading package lists... Done

Paso 2: Agregar la clave GPG oficial de Caddy

El equipo de Caddy proporciona un archivo de clave pública para que los clientes apt verifiquen los paquetes. La forma recomendada es importar la clave con gpg y luego almacenarla en el almacén de claves de apt.

# Descargar el archivo de clave pública
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpgkey.asc' | sudo gpg --dearmor --output /usr/share/keyrings/caddy-stable-archive-keyring.gpg

Salida esperada

> https://dl.cloudsmith.io/public/caddy/stable/gpgkey.asc
%   0 00%[<=>]  0 00B/s   00:00:00   00:00 ETA
% 100 100%[=>>] 1,234 kB/s 0.0s  00:00:00

Paso 3: Agregar el repositorio de Caddy

Ahora creamos un archivo en /etc/apt/sources.list.d/caddy-stable.list que le indica a apt dónde obtener los paquetes.

sudo sh -c 'cat <<EOF > /etc/apt/sources.list.d/caddy-stable.list
# Caddy Stable repository
# Para Ubuntu 22.04 (focal)
deb [signed-by=/usr/share/keyrings/caddy-stable-archive-keyring.gpg] https://dl.cloudsmith.io/public/caddy/stable/deb/ ubuntu focal main
EOF'

Salida esperada

> /etc/apt/sources.list.d/caddy-stable.list

Paso 4: Verificar el archivo del repositorio

Siempre es útil chequear que el archivo se creó correctamente.

cat /etc/apt/sources.list.d/caddy-stable.list

Salida esperada

# Caddy Stable repository
# Para Ubuntu 22.04 (focal)
de b [signed‑by=/usr/share/keyrings/caddy‑stable‑archive‑keyring.gpg] https://dl.cloudsmith.io/public/caddy/stable/deb/ ubuntu focal main

Paso 5: Actualizar de nuevo para incluir el nuevo repositorio

Ahora apt puede ver el repositorio de Caddy.

sudo apt update

Salida esperada (parcial)

Hit http://dl.cloudsmith.io/public/caddy/stable/deb/ focal InRelease
Hit http://dl.cloudsmith.io/public/caddy/stable/deb/ focal Release
... (más hits)

Paso 6: Instalar Caddy

Ahora podés instalar el paquete caddy. El gestor de paquetes va a resolver dependencias y descargar los binarios.

sudo apt install caddy

Salida esperada (resumen de la instalación)

Leyendo lista de paquetes... Hecho
Construyendo árbol de dependencias... Hecho
Obteniendo archivos... Hecho
(13) caddy=2.7.5~ubuntu~focal~b8a7c2b9e0 [caddy-stable]
0.6 MB de archivos comprimidos sin comprimir: 4.2 MB
Descomprimiendo: caddy (1:2.7.5~ubuntu~focal~b8a7c2b9e0) ...
¿Querés continuar? [S/n] s
Ejecutando preremove scripts...
Ejecutando postinst scripts...
¡Configuración de caddy (1:2.7.5~ubuntu~focal~b8a7c2b9e0) ...

Nota: El script postinst de Caddy también crea un usuario predeterminado (caddy) y una configuración mínima en /etc/caddy/Caddyfile.

Paso 7: Verificar la versión de Caddy

Después de la instalación, ejecuta caddy version para confirmar la versión instalada.

caddy version

Salida esperada

Caddy v2.7.5~ubuntu~focal~b8a7c2b9e0 (executable: caddy:2.7.5~ubuntu~focal~b8a7c2b9e0)

Paso 8: Iniciar y habilitar el servicio Caddy

Caddy viene con un archivo de servicio systemd en /lib/systemd/system/caddy.service. Lo iniciamos y lo marcamos para que arranque automáticamente en futuros reinicios.

sudo systemctl start caddy
sudo systemctl enable caddy
sudo systemctl status caddy

Salida esperada para systemctl status caddy

● caddy.service - Caddy
   Descripción: Servidor web moderno y automático
   Estado activo: activo (en ejecución) desde Mon 2024-09-09 14:12:34 ART
   Procesos: 2 (ejecutado por usuario caddy) (ver lista completa)

Consejo: Si más adelante querés usar tu propio usuario para gestionar el servicio (por ejemplo, un usuario no-root), podés modificar User= y Group= en el archivo de servicio, luego de lo cual tenés que volver a cargar systemctl (sudo systemctl daemon-reload) y reiniciar el servicio.

Paso 9: Inspeccionar la configuración predeterminada

Al instalar el paquete, Caddy crea un Caddyfile minimalista en /etc/caddy/Caddyfile. Veamos su contenido.

cat /etc/caddy/Caddyfile

Salida esperada

# ¿Querés una página de bienvenida predeterminada?
# Si estás usando un dominio, podés servir archivos estáticos.
# Por defecto, Caddy sirve archivos HTML, JSON, CSS, etc.
# En un entorno de producción, podrías querer personalizar esta configuración.

Básicamente, esto es casi vacío, lo que significa que Caddy va a servir un index.html estático desde /var/www/html si existe. Para un primer experimento, eso es suficiente.

Paso 10: Servir una página de prueba simple

Creamos un archivo HTML sencillo en /var/www/html/index.html:

sudo mkdir -p /var/www/html
sudo tee /var/www/html/index.html <<'EOF'
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Bienvenido a Caddy</title>
    <style>
        body { font-family: Arial, sans-serif; text-align: center; padding: 50px; }
        h1 { color: #2c3e50; }
        p { color: #7f8c8d; }
    </style>
</head>
<body>
    <h1>¡Hola desde Caddy!</h1>
    <p>Tu servidor web moderno está funcionando correctamente.</p>
</body>
</html>
EOF

Salida esperada

> /var/www/html/index.html

Ahora, si accedés al servidor desde la máquina local (usando curl), deberías ver el HTML.

curl -s http://localhost | grep -o "¡Hola desde Caddy!"

Salida esperada

¡Hola desde Caddy!

Importante: Caddy escucha en el puerto 80 (HTTP) por defecto. Si tenés un firewall (ufw o nftables), asegurate de permitir el tráfico en el puerto 80.

Paso 11: Configurar una configuración mínima personalizada

Para aprender a personalizar, vamos a sobrescribir el Caddyfile predeterminado en /etc/caddy/Caddyfile.

sudo tee /etc/caddy/Caddyfile > /dev/null <<'EOF'
# Configuración mínima de ejemplo para un sitio de producción
# Servir contenido estático y redirigir tráfico no-www a www

# Permitir registro automático de certificados TLS (Let's Encrypt)
# Para un dominio real, reemplazá example.com con tu propio dominio.

example.com {
    # Redirigir HTTP a HTTPS
    redir https://{host}{uri}
}

# Configuración del sitio www
www.example.com {
    # Servir archivos desde /var/www/html
    root * /var/www/html
    # Permitir index.html, index.htm, etc.
    file_server
}

# Si querés un proxy inverso a una aplicación Node/Go/Python:
# proxy /api https://localhost:3000 {
#     transport tls
# }
EOF

Salida esperada

> /etc/caddy/Caddyfile

Ahora necesitamos recargar Caddy para que lea el nuevo archivo.

sudo caddy reload

Salida esperada

Recargando servidor Caddy... ok

Nota: El comando caddy reload requiere el usuario caddy. Como caddy es el propietario del socket, sudo funciona correctamente.

Paso 12: Obtener un certificado SSL con Let's Encrypt

Caddy puede obtener automáticamente certificados TLS válidos desde Let's Encrypt usando el plugin caddy.tls. Para ello, necesitamos editar el Caddyfile para incluir una directiva tls con @{http_vars} y issue configurado.

El flujo es:

  1. Editar /etc/caddy/Caddyfile y agregar un bloque global tls.
  2. Definir una entrada de host (ejemplo: example.com y www.example.com) con tls dentro.
  3. Recargar.

Vamos a hacerlo paso a paso.

12.1 Editar /etc/caddy/Caddyfile

sudo tee /etc/caddy/Caddyfile > /dev/null <<'EOF'
# Configuración mínima de ejemplo para un sitio de producción
# Servir contenido estático y redirigir tráfico no-www a www

# Configuración global de TLS (Let's Encrypt)
# `caddy` usará el gestor de problemas de Let's Encrypt automáticamente.
# El email se usa solo para notificaciones de renovación.
# `issue` indica a Caddy que intente obtener certificados.

tls {
    # Email para notificaciones de renovación (reemplazá con tu email)
    email admin@example.com
    # Usar el gestor de problemas de Let's Encrypt (por defecto)
    # `protocol http` es el predeterminado; puedes agregar `protocol dns` para validación basada en DNS si querés.
}

example.com {
    # Redirigir HTTP a HTTPS (Caddy redirige automáticamente)
    redir https://{host}{uri}
}

www.example.com {
    root * /var/www/html
    file_server
}
EOF

Salida esperada

> /etc/caddy/Caddyfile

12.2 Recargar el servicio Caddy

sudo caddy reload

Salida esperada típica

Recargando servidor Caddy... ok

12.3 Verificar el estado del certificado

Caddy almacena los certificados en /etc/caddy/pki (o /var/lib/caddy/pki). Podés verificar que se generaron para tus dominios.

ls -l /etc/caddy/pki/issuer.curvet.pem

Si el certificado está presente, verás algo como:

-rw-r--r-- 1 caddy  caddy  4096 Sep 12 14:45 /etc/caddy/pki/issuer.curvet.pem

Nota: Si ejecutás sudo caddy reload y ves un error como no se pudo obtener un certificado para example.com, probablemente necesites exponer el puerto 80 y 443 en el firewall, o asegurarte de que el dominio resuelva correctamente a la máquina.

Paso 13: Ejemplo de proxy inverso (opcional)

Si estás ejecutando una API backend (por ejemplo, un servidor Node.js en localhost:3000), podés hacer que Caddy actúe como proxy inverso. Aquí está una configuración mínima de ejemplo:

sudo tee /etc/caddy/Caddyfile > /dev/null <<'EOF'
# Configuración global de TLS (Let's Encrypt)
tls {
    email admin@example.com
}

# Dominio principal
example.com {
    redir https://{host}{uri}
}

www.example.com {
    root * /var/www/html
    file_server
}

# Proxy inverso para la API
api.example.com {
    reverse_proxy localhost:3000
}
EOF

Ahora recarga e intenta una solicitud:

sudo caddy reload

Salida esperada

Recargando servidor Caddy... ok

Si tienes un servidor backend en ejecución en localhost:3000, podes probar:

curl -s http://api.example.com/

Deberías ver la respuesta del servidor backend (si está activo).

Paso 14: Mantener Caddy actualizado

A medida que se lanzan nuevas versiones, podés actualizar el paquete con apt igual que cualquier otra herramienta del sistema.

sudo apt update
sudo apt upgrade caddy

Salida esperada (resumen de la actualización)

Leyendo lista de paquetes... Hecho
... Obteniendo archivos... Hecho
¿Querés continuar? [S/n] s
Desinstalando paquetes... (si los hay)
¡Configuración de caddy (1:2.8.0~ubuntu~focal~abcd1234) ...

Consejo: Después de una actualización, siempre es buena práctica ejecutar caddy reload para que el servicio tome la nueva versión del binario sin interrumpir el servicio.

Paso 15: Eliminar Caddy (cuando sea necesario)

Si decides desinstalar Caddy completamente:

sudo apt purge caddy

Salida esperada

¿Querés continuar? [S/n] s
Desinstalando paquetes... (caddy y dependencias relacionadas)
Eliminando archivos de configuración de /etc/caddy ...
Eliminando archivos no utilizados... Hecho

Posteriormente, podés eliminar el archivo del repositorio y su clave si no las necesitas más.

sudo rm /etc/apt/sources.list.d/caddy-stable.list
sudo rm /usr/share/keyrings/caddy-stable-archive-keyring.gpg
sudo apt update

Sección de mejores prácticas

Práctica recomendada Por qué es importante Cómo implementarla
Ejecutar Caddy como usuario no-root Reduce el impacto de posibles fugas de seguridad. Editar /lib/systemd/system/caddy.service, cambiar User=caddy y Group=caddy, luego sudo systemctl daemon-reload && sudo systemctl restart caddy.
Permitir solo los puertos necesarios en el firewall Evita el tráfico no deseado. Para ufw: sudo ufw allow 80,443/comment "Permitir HTTP/HTTPS para Caddy". Para nftables, agregar reglas similares.
Usar un dominio real y DNS Los certificados Let's Encrypt requieren un DNS resuelto. Apuntá example.com y www.example.com a la dirección IP pública de la máquina.
Gestionar el archivo de configuración con control de versiones Permite rollback si algo se rompe. Guardar /etc/caddy/Caddyfile en un repo Git o en un bucket de almacenamiento.
Rotar logs Evita agotar el disco. Caddy escribe logs en /var/log/caddy. Usar logrotate con un archivo en /etc/logrotate.d/caddy.
Monitorear recursos Detectar picos de CPU/memoria. Usar htop, top, o caddy adapt (si tenés caddysig).
Probar la configuración antes de cargar Evitar tiempos de inactividad. caddy validate imprime advertencias de sintaxis.
Renovar certificados automáticamente Evitar interrupciones por vencimiento. Caddy tiene un cron interno (systemctl status caddy) que renueva automáticamente a los 60 días. Si querés forzar la renovación, sudo caddy reload --force.

Errores comunes y cómo evitarlos

  1. Fallo al obtener certificado TLS

    • Síntoma: sudo caddy reload muestra no se pudo obtener un certificado para example.com.
    • Causa: Falta de DNS, firewall bloqueando puertos 80/443, o email incorrecto.
    • Solución: Verificar nslookup example.com, permitir puertos (ufw allow 80,443), y asegurarse de que el bloque tls tenga un email válido.
  2. Configuración inválida del Caddyfile

    • Síntoma: caddy reload falla con Error: no se pudo parsear Caddyfile: línea X: problema Y.
    • Causa: Indentación incorrecta, llaves desbalanceadas, o sintaxis antigua.
    • Solución: Usar caddy validate para probar la configuración antes de recargar. También podés usar un editor con resaltado de sintaxis (ej: caddy edit). Asegurate de que cada bloque esté correctamente anidado.
  3. Problemas de permisos con /var/www/html

    • Síntoma: curl http://example.com devuelve un error 403 prohibido.
    • Causa: El usuario caddy no puede leer los archivos.
    • Solución: Corregir los permisos: sudo chown -R caddy:caddy /var/www/html y sudo chmod -R 755 /var/www/html.
  4. Recargas repetidas que causan tiempo de inactividad

    • Solución: Usar caddy reload --force solo si estás seguro de que hay cambios. Para actualizaciones, podés hacer una recarga activa con sudo systemctl reload caddy (esto es seguro). Para cambios que causan reinicios, podés usar caddy reload con --grace (esperar a que los trabajadores terminen).
  5. Pérdida del archivo de clave GPG del repositorio

    • Síntoma: apt update muestra no se pudo verificar la firma.
    • Solución: Eliminar el archivo del repositorio y el keyring, luego volver a ejecutar los pasos 2-3.

Conclusión

Instalar Caddy desde los repositorios oficiales en Ubuntu es un proceso rápido y sencillo. Al seguir los pasos enumerados (actualizar, agregar la clave GPG, agregar el repositorio, instalar el paquete, y empezar el servicio), obtienes rápidamente un servidor web moderno con soporte HTTP/3, TLS automático, y una configuración personalizable.

Has aprendido a:

  • Verificar la instalación con caddy version.
  • Configurar un archivo Caddyfile mínimo para servir sitios estáticos y redirigir tráfico.
  • Obtener certificados SSL válidos con Let's Encrypt.
  • Probar un proxy inverso.
  • Mantener Caddy actualizado.
  • Evitar errores comunes.

Ahora podés personalizar aún más usando los ricos módulos de Caddy (por ejemplo, rewrite, header, cache), integrar con un balanceador de carga, o combinar con un reverse proxy hacia backends en contenedores.

Pasos siguientes:

  1. Explora los módulos integrados (caddy list-modules).
  2. Agrega reglas de rewrite o header para adaptar el contenido.
  3. Implementa un balanceador de carga con forward_proxy si estás administrando múltiples backends.
  4. Configura logs estructurados para integración con Grafana o ELK.

Con una base sólida, podés mejorar la infraestructura según tus necesidades. ¡Feliz administración de servidores!

Validación de sintaxis (opcional)

Si tenés alguna duda sobre la configuración actual, podés ejecutar:

sudo caddy validate

Deberías ver La configuración es válida si no hay errores.

Referencias útiles


¿Listo para poner en producción tu servidor web? ¡Ahora Caddy está listo para servir tráfico moderno y seguro!

Comentarios (0)

Sé el primero en comentar.

Dejá tu comentario