Sirve tus aplicaciones web con HTTPS de manera sencilla con Caddy

Caddy es un servidor web escrito en GO que se presenta como a una alternativa a tener en cuenta frente a nginx o Apache. En este artículo explicaré por qué lo estoy empezando a utilizar y ejemplos de uso.
Tabla de contenidos
¿Por qué Caddy?
Durante varios años he utilizado nginx para servir mis proyectos web con bastante satisfacción, aunque a la hora de configurar la emisión de certificados con Let's Encrypt se me hacía bastante tedioso el proceso. Tras investigar qué alternativas existían para mi caso de uso, me encontré con Caddy.
Simplemente modificando el archivo de configuración y refrescando el servicio, se levantará tu sitio web con un certificado emitido por Let's Encrypt o ZeroSSL. También se encarga de forma transparente de renovar el certificado, sin necesidad de software ni configuración adicional.
Si a esto le sumamos un registro DNS wildcard en nuestro dominio, podremos desplegar de forma muy rápida los sitios web que necesitemos con HTTPS. En resumen, lo ideal para trastear con proyectos. Y lo mejor de todo, dispone de soporte oficial para funcionar con Docker.
Desplegando el servicio con Docker
Creamos una carpeta para Caddy y en ella añadimos un archivo compose.yaml con este contenido:
services:
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./conf:/etc/caddy
- ./srv:/srv
- caddy_data:/data
- caddy_config:/config
extra_hosts:
- host.docker.internal:host-gateway
volumes:
caddy_data:
caddy_config:En este archivo de configuración, específico para la versión 2 de Caddy (la actual en el momento en el que se ha escrito este artículo), exponemos los puertos 80 y 443 (TCP y UDP) del contenedor y mapeamos las carpetas necesarias para tener disponibles tanto los archivos de configuración como las carpetas para los archivos estáticos.
Un paso importante, con host.docker.internal:host-gateway habilitamos que el contenedor de Caddy tenga acceso a los puertos del servidor bajo el hostname de host.docker.internal.
Finalmente, levantamos el contenedor con docker compose.
sudo docker compose up -d
Configurando Caddy
Otra de las ventajas que tiene Caddy es que la sintaxis para configurar sitios es muy sencilla. El archivo de configuración se encuentra en conf/Caddyfile y para recargar la configuración, sin necesidad de detener el contenedor, se puede utilizar este comando.
sudo docker compose exec -w /etc/caddy caddy caddy reloadServir archivos estáticos
Con esta configuración, serviremos para el host ejemplo.com el contenido de la carpeta srv/ejemplo como archivos estáticos.
ejemplo.com {
root * /srv/ejemplo
file_server
}
Proxy inverso
En este caso, servimos como proxy inverso el servicio o aplicación web del puerto 3000 del host.
ejemplo.com {
reverse_proxy host.docker.internal:3000
}
Servir una aplicación SPA (React, Vue, Angular)
Similar a la configuración de los archivos estáticos, le añadimos encode para transferir los archivos con compresión gzip y try_files {path} /index.html para delegar el enrutamiento a la aplicación single-page.
ejemplo.com {
root * /srv/ejemplo
file_server
encode
try_files {path} /index.html
}
Redirección a www
Un caso común, donde se redirige un dominio base a su subdominio www.
ejemplo.com {
redir https://www.{host}{uri}
}
En la documentación de Caddy se pueden encontrar más ejemplos útiles, como configuraciones para servidor aplicaciones PHP, especificar páginas de error o añadir autenticación básica HTTP.
Personalmente, me he quedado encantado con este servidor web por su conveniencia, su amigable documentación y soporte con Docker. Si lo que ofrece te parece interesante, te animo a darle una oportunidad.