Instalá Caddy desde los repositorios oficiales en Ubuntu paso a paso
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 consudo). - 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 updateSalida 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... DonePaso 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.gpgSalida 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:00Paso 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.listPaso 4: Verificar el archivo del repositorio
Siempre es útil chequear que el archivo se creó correctamente.
cat /etc/apt/sources.list.d/caddy-stable.listSalida 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 mainPaso 5: Actualizar de nuevo para incluir el nuevo repositorio
Ahora apt puede ver el repositorio de Caddy.
sudo apt updateSalida 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 caddySalida 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
postinstde 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 versionSalida 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 caddySalida 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=yGroup=en el archivo de servicio, luego de lo cual tenés que volver a cargarsystemctl(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/CaddyfileSalida 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>
EOFSalida esperada
> /var/www/html/index.htmlAhora, 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 (
ufwonftables), 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
# }
EOFSalida esperada
> /etc/caddy/CaddyfileAhora necesitamos recargar Caddy para que lea el nuevo archivo.
sudo caddy reloadSalida esperada
Recargando servidor Caddy... okNota: El comando
caddy reloadrequiere el usuariocaddy. Comocaddyes el propietario del socket,sudofunciona 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:
- Editar
/etc/caddy/Caddyfiley agregar un bloque globaltls. - Definir una entrada de host (ejemplo:
example.comywww.example.com) contlsdentro. - 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
}
EOFSalida esperada
> /etc/caddy/Caddyfile12.2 Recargar el servicio Caddy
sudo caddy reloadSalida esperada típica
Recargando servidor Caddy... ok12.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.pemSi el certificado está presente, verás algo como:
-rw-r--r-- 1 caddy caddy 4096 Sep 12 14:45 /etc/caddy/pki/issuer.curvet.pemNota: Si ejecutás
sudo caddy reloady ves un error comono 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
}
EOFAhora recarga e intenta una solicitud:
sudo caddy reloadSalida esperada
Recargando servidor Caddy... okSi 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 caddySalida 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 reloadpara 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 caddySalida 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... HechoPosteriormente, 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 updateSecció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
Fallo al obtener certificado TLS
- Síntoma:
sudo caddy reloadmuestrano 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 bloquetlstenga un email válido.
- Síntoma:
Configuración inválida del
Caddyfile- Síntoma:
caddy reloadfalla conError: no se pudo parsear Caddyfile: línea X: problema Y. - Causa: Indentación incorrecta, llaves desbalanceadas, o sintaxis antigua.
- Solución: Usar
caddy validatepara 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.
- Síntoma:
Problemas de permisos con
/var/www/html- Síntoma:
curl http://example.comdevuelve un error 403 prohibido. - Causa: El usuario
caddyno puede leer los archivos. - Solución: Corregir los permisos:
sudo chown -R caddy:caddy /var/www/htmlysudo chmod -R 755 /var/www/html.
- Síntoma:
Recargas repetidas que causan tiempo de inactividad
- Solución: Usar
caddy reload --forcesolo si estás seguro de que hay cambios. Para actualizaciones, podés hacer una recarga activa consudo systemctl reload caddy(esto es seguro). Para cambios que causan reinicios, podés usarcaddy reloadcon--grace(esperar a que los trabajadores terminen).
- Solución: Usar
Pérdida del archivo de clave GPG del repositorio
- Síntoma:
apt updatemuestrano se pudo verificar la firma. - Solución: Eliminar el archivo del repositorio y el keyring, luego volver a ejecutar los pasos 2-3.
- Síntoma:
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
Caddyfilemí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:
- Explora los módulos integrados (
caddy list-modules). - Agrega reglas de rewrite o header para adaptar el contenido.
- Implementa un balanceador de carga con
forward_proxysi estás administrando múltiples backends. - 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 validateDeberías ver La configuración es válida si no hay errores.
Referencias útiles
- Documentación oficial de Caddy: https://caddyserver.com/docs/
- Repositorio de Cloudsmith de Caddy: https://dl.cloudsmith.io/public/caddy/stable/
- Guía de inicio rápido de Ubuntu para repositorios: https://help.ubuntu.com/community/Repositories
¿Listo para poner en producción tu servidor web? ¡Ahora Caddy está listo para servir tráfico moderno y seguro!
DUGLAS MORENO
Comentarios (0)
Sé el primero en comentar.