Cómo alojar un sitio web con Caddy en Ubuntu

Introducción

Caddy es un servidor web diseñado en torno a la simplicidad y la seguridad. Este viene con una serie de características que son útiles para alojar sitios web. Por ejemplo, puedes obtener y administrar automáticamente certificados TLS de Let’s Encrypt para habilitar HTTPS, e incluye soporte para HTTP/2.

HTTPS es un sistema para proteger el tráfico entre tus usuarios y tu servidor. Se está convirtiendo rápidamente en una expectativa básica de cualquier sitio web que se ejecute en producción. Sin él, Chrome y Firefox te advertirán que tu sitio web es “No seguro” si los usuarios intentan enviar un inicio de sesión con información.

Anteriormente, el método recomendado para instalar Caddy era descargar binarios precompilados del sitio web del proyecto Caddy. Sin embargo, los cambios en el funcionamiento de las licencias de Caddy significan que ya no te permite usar estos binarios precompilados con fines comerciales. Los puedes usar si pagas una tarifa de licencia, incluso si solo estás usando Caddy internamente en una empresa. Afortunadamente, el código fuente de Caddy sigue siendo completamente de código abierto y puede compilar Caddy tú mismo para evitar problemas de licencia.

En este tutorial, compilarás Caddy desde la fuente y lo usarás para alojar un sitio web protegido con HTTPS. Esto implica compilarlo, configurarlo usando un Caddyfile e instalar complementos. Al final, aprenderás cómo actualizar tu instalación cuando se lance una nueva versión.

Prerrequisitos

  • Un servidor Ubuntu 18.04 con privilegios de root y una cuenta secundaria no root. Puedes configurar esto siguiendo nuestra Guía de configuración básica de servidores para Ubuntu 18.04. Para este tutorial, el usuario no root es cesar.
  • Un nombre de dominio completamente registrado. Este tutorial usará your_domain en todo momento. Puedes comprar un nombre de dominio en Namecheap, obtener uno gratis en Freenom o usar el registrador de dominio que prefieras.
  • Un registro DNS A que apunta your_domain, la dirección IP pública de tu servidor.
  • La cadena de herramientas del Lenguaje Go instalada en tu servidor. Puedes seguir un tutorial sobre cómo instalar Go y configurar un entorno de programación local en Ubuntu. No necesitas crear ningún proyecto de ejemplo.
  • Un token de acceso personal de tu proveedor (clave API) con permisos de lectura y escritura para tu cuenta.

Paso 1 – Compilando Caddy

En este paso, compilarás Caddy desde la fuente con la capacidad de agregar complementos más tarde, todo sin cambiar el código fuente de Caddy.

Para los propósitos de este tutorial, almacenarás el código fuente en ~/caddy. Debes crear ese directorio ejecutando el siguiente comando:

Desplázate hasta el:

Almacenarás el código fuente para ejecutar y personalizar Caddy en un archivo llamado caddy.go. Créalo usando el siguiente comando:

Debes agregar las siguientes líneas:

Este código importa Caddy directamente desde Github (usando Git) y lo inicia desde la función de entrada main. Si deseas habilitar la telemetría, debes eliminar el comentario de la línea caddymain.EnableTelemetry y establecer el valor en true. Cuando hayas terminado, guarda y cierra el archivo.

Para que caddy.go pueda usar las dependencias importadas, deberás inicializarlo como un módulo:

En este punto, está todo listo para compilar la versión estándar de Caddy a partir del código fuente anterior ejecutando:

Habrá una gran cantidad de resultados que detallarán qué bibliotecas se descargarán como dependencias necesarias para la compilación. El ejecutable resultante se almacena en $GOPATH/bin, como se explica en los requisitos previos.

Cuando termines, intenta ejecutar Caddy:

Verás una salida similar a la siguiente:

Esto significa que Caddy se inició con éxito y está disponible en el puerto 2015. Puedes ignorar el mensaje de advertencia, porque ese límite se ajustará en pasos posteriores sin tu intervención. Para salir, presiona CTRL + C.

Ahora has compilado y ejecutado Caddy. En el siguiente paso, instalarás Caddy como servicio para que se inicie automáticamente en el arranque. Posteriormente ajustarás tu configuración de propiedad y permisos para garantizar la seguridad del servidor.

Paso 2 – Instalación de Caddy

Ahora que haz verificado que puedes compilar y ejecutar Caddy, es hora de configurar un servicio systemd. Esto para que Caddy pueda iniciarse automáticamente al iniciar el sistema.

Para comenzar, debes mover el binario Caddy a /usr/local/bin, la ubicación estándar para los archivos binarios que no son administrados por el administrador de paquetes de Ubuntu. Además, estos no son clave para la operación del sistema:

A continuación, cambiarás la propiedad del binario Caddy al usuario root:

Esto evitará que otras cuentas modifiquen el ejecutable. Sin embargo, incluso si el usuario root posee Caddy, se recomienda ejecutarlo solo con otras cuentas no root presentes en el sistema. Esto asegura que, en caso de que Caddy (u otro programa) se vea comprometido, el atacante no podrá modificar el binario ni ejecutar comandos como root.

A continuación, debes establecer los permisos del archivo binario a 755. Esto da a root permisos completos de lectura/escritura/ejecución para el archivo, mientras que los demás usuarios sólo podrán leer y ejecutarlo:

Dado que el proceso Caddy no se ejecutará como root, Linux evitará que se una a los puertos 80443. Estos son los puertos estándar para HTTP y HTTPS, respectivamente, ya que estas son operaciones privilegiadas.

Para poder acceder fácilmente a tu dominio, Caddy debe estar vinculado a uno de estos puertos, según el protocolo. De lo contrario, deberás agregar un número de puerto específico a la URL del dominio en tu navegador para ver el contenido que mostrarás.

Para permitir que Caddy se una a puertos bajos sin ejecutarse como root, debes ejecutar el siguiente comando:

La utilidad setcap establece las capacidades del archivo. En este comando, asignas la capacidad CAP_NET_BIND_SERVICE al binario Caddy, que permite que un ejecutable se una a un puerto inferior a 1024.

Configuración

Ahora has terminado de configurar el binario Caddy y estás listo para comenzar a escribir la configuración de Caddy. Debes crear un directorio donde almacenarás los archivos de configuración de Caddy ejecutando el siguiente comando:

Luego, debes configurar los permisos de usuario y grupo correctos para ello:

Establecer el usuario como root y el grupo como www-data asegura que Caddy tendrá acceso de lectura y escritura a la carpeta (a través del grupo www-data). Además, nos asegura que solo la cuenta de superusuario tendrá los mismos derechos para leer y modificar. www-data es el usuario y grupo predeterminado para servidores web en Ubuntu.

En un paso posterior, habilitarás el aprovisionamiento automático de certificados TLS desde Let’s Encrypt. En preparación para eso, debes crear un directorio para almacenar los certificados TLS que obtendrás. Debes darle a Caddy las mismas reglas de propiedad que el directorio /etc/caddy:

Caddy debe poder escribir certificados en este directorio y leerlo para cifrar las solicitudes. Por esta razón, debes modificar los permisos para el directorio /etc/ssl/caddy para que solo sea accesible por root y www-data:

A continuación, creerás un directorio para almacenar los archivos que alojará Caddy:

Luego, debes configurar el propietario y el grupo del directorio en www-data:

Caddy lee tu configuración de un archivo llamado Caddyfile, almacenado en /etc/caddy. Debes crear el archivo en el disco ejecutando:

Para instalar el servicio Caddy, debes descargar el archivo de la unidad systemd desde el repositorio de Caddy en Github a /etc/systemd/system, debes ejecutar:

Debes modificar los permisos del archivo de servicio para que solo pueda ser modificado por su propietario, root:

Luego, debes volver a cargar systemd para detectar el servicio de Caddy:

Debes comprobar si systemd ha detectado el servicio Caddy ejecutando systemctl status:

Resultado

Verás resultados similares a:

Si ves esta misma salida, systemd detectó correctamente el nuevo servicio.

Como parte del requisito previo de la configuración básica de servidores, habilitaste uncomplicated firewall – ufw y permitiste las conexiones SSH. Para que Caddy pueda mostrar tráfico HTTP y HTTPS desde tu servidor, deberás permitirles ingresar a través de ufw ejecutando el siguiente comando:

La salida será así:

Debes usar ufw status para verificar si tus cambios funcionaron:

Verás el siguiente resultado:

Tu instalación de Caddy ahora está completa, pero no está configurada para mostrar nada. En el siguiente paso, configurarás Caddy para mostrar archivos desde el directorio /var/www.

Paso 3 – Configurando Caddy

En esta sección, escribirás la configuración básica de Caddy para mostrar archivos estáticos desde tu servidor.

Debes comenzar creando un archivo HTML básico en /var/www, llamado index.html:

Cuando se muestra en un navegador web, este archivo mostrará un encabezado con el texto This page is being served via Caddy. Debes guardar y cerrar el archivo.

Tienes que abrir el archivo de configuración Caddyfile que creaste anteriormente para editarlo:

Debes agregar las siguientes líneas:

Esta es una configuración básica de Caddy, y declara que el puerto 80 de tu servidor debe ser mostrado con archivos /var/www y comprimidos gzip. Esto para reducir los tiempos de carga de la página en el lado del cliente.

En la mayoría de los casos, Caddy te permite personalizar aún más las directivas de configuración. Por ejemplo, puedes limitar la compresión gzip solo a archivos HTML y PHP y establecer el nivel de compresión a 6. 1 es el más bajo y 9 es el más alto. Debes extender la directiva con llaves y subdirectivas:

Cuando hayas terminado, guarda y cierra el archivo.

Caddy tiene una gran cantidad de directivas diferentes para muchos casos de uso. Por ejemplo, la directiva fastcgi podría ser útil para habilitar PHP. La directiva markdown podría usarse para convertir automáticamente archivos Markdown a HTML antes de mostrarlos, lo que podría ser útil para crear un blog simple.

Para probar que todo funciona correctamente, debes iniciar el servicio de Caddy:

A continuación, debes ejecutar systemctl status para buscar información sobre el estado del servicio Caddy:

Verás lo siguiente:

Ahora puedes buscar la IP de tu servidor en un navegador web. Tu página web de muestra mostrará lo siguiente:

Paso 4 – Uso de complementos (plugins)

Los complementos ofrecen una forma de cambiar y ampliar el comportamiento de Caddy. En general, ofrecen más directivas de configuración para su uso, de acuerdo con tu caso de uso. En esta sección, agregarás y usarás complementos instalando el complemento minify. Este elimina el exceso de espacios en blanco y ordena el código que mostrarás al cliente, reduciendo aún más los tiempos de carga.

El  repositorio GitHub del complemento minify es hacdias / caddy-minify.

Debes navegar al directorio con el código fuente que creaste en el paso uno:

Para agregar un complemento a Caddy, deberás importarlo en el archivo caddy.go que utilizaste para compilar Caddy. Debes abrir caddy.go para editar:

Tienes que importar el complemento minify agregando la línea resaltada, así:

Guarda y cierra el archivo.

Algunos complementos pueden requerir algunos ajustes leves de configuración, así que asegúrate de leer la documentación de los que instales. Puedes encontrar una lista de complementos populares en el panel izquierdo de la documentación de Caddy, en Plugins. 

Cada vez que agregas un nuevo complemento, debes recompilar Caddy. Esto se debe a que Go es un lenguaje de programación compilado. Esto significa que el código fuente se transforma en código de máquina antes de la ejecución. Tu cambio en la declaración de importación ha alterado el código fuente, pero no afectará el binario hasta que se haya compilado.

Debes usar el comando go install para compilar Caddy:

Binario

Cuando finalices, debes mover el binario generado a /usr/local/bin y configurar permisos para el binario como lo hiciste anteriormente. Debes seguir estos pasos cada vez que recompiles Caddy para garantizar su funcionalidad y seguridad:

Para comenzar a usar el complemento minify, deberás agregar la directiva minify a tu Caddyfile. Ábrelo para editarlo:

Debes habilitar el complemento agregando la siguiente línea al bloque de configuración:

Ahora, reinicia tu servidor usando systemctl:

Caddy ahora se está ejecutando y comprimirá todos los archivos que muestra, incluido el archivo index.html que creaste anteriormente. Puedes observar la ‘minificación’ en el trabajo buscando los contenidos de tu dominio usando curl:

Verás el siguiente resultado. Observa que se han eliminado todos los espacios en blanco innecesarios, lo que muestra que el complemento minify está funcionando.

En este paso, aprendiste a extender Caddy con complementos. A continuación, habilitarás HTTPS instalando el complemento tls.dns.proveedor.

Paso 5 – Habilitar TLS automático con Let’s Encrypt

En esta sección, habilitarás el aprovisionamiento y renovación automática de certificados Let’s Encrypt, utilizando los registros DNS TXT para la verificación.

Para verificar el uso de registros TXT DNS, instalarás un complemento para interactuar con la API, llamada tls.dns.proveedor. El procedimiento para instalarlo es casi idéntico a cómo instalaste el complemento minify en el paso anterior. Para comenzar, debes abrir caddy.go:

Debes agregar el repositorio del complemento a las importaciones:

Compílalo ejecutando:

Asegúrate de que se detenga Caddy por medio de systemctl. Luego debes terminar de instalar el complemento copiando el binario Caddy recién compilado y una vez más configurando tu propiedad y permisos:

A continuación, configura Caddy para que funcione con la API de tu proveedor para establecer registros DNS. Caddy necesita acceder a este token como una variable de entorno para configurar el DNS del proveedor, por lo que editarás tu archivo de unidad systemd:

Debes encontrar la línea que comienza Environment= en la sección [Service]. Esta línea define las variables de entorno que deben pasarse al proceso Caddy. Agrega un espacio al final de esta línea, luego agrega una variable DO_AUTH_TOKEN, seguida del token que acabas de generar:

Systemd

Tienes que guardar y cerrar este archivo. Posteriormente vuelve a cargar el demonio systemd como lo hiciste anteriormente para asegurarte de que la configuración se actualice:

Ejecuta systemctl status para verificar que los cambios de configuración fueron correctos:

La salida debería verse así:

Tendrás que hacer un par de pequeños cambios en tu Caddyfile, así que ábrelo para editarlo:

Agrega las líneas resaltadas al Caddyfile, asegurándote de reemplazar your_domain con tu dominio (en lugar de solo el puerto :80) y comentando gzip:

El uso de un dominio en lugar de solo un puerto para el nombre de host hará que Caddy atienda solicitudes a través de HTTPS. La directiva tls configura el comportamiento de Caddy cuando se usa TLS. El dns subdirectivo especifica que Caddy debe usar el sistema DNS-01, en lugar de HTTP-01.

Con esto, tu sitio web está listo para ser implementado. Debes iniciar Caddy con systemctl y luego enable, para que se ejecute en el arranque:

Si navegas a tu dominio, serás redirigido automáticamente a HTTPS, con el mismo mensaje mostrado.

Tu instalación de Caddy ahora está completa y segura, y puedes personalizar aún más según tu caso de uso.

Si deseas actualizar Caddy cuando salga una nueva versión, deberás actualizar el archivo go.mod (almacenado en el mismo directorio), que se ve así:

La parte resaltada es la versión de Caddy que estás utilizando. Cuando se lanza una nueva versión en Github puedes reemplazar el existente go.mod con ella y compilar Caddy de acuerdo con los primeros dos pasos. Puedes hacer lo mismo para todos los complementos importados.

Conclusión

Ahora tienes Caddy instalado y configurado en tu servidor, muestra páginas estáticas en tu dominio deseado, está asegurado con certificados Let’s Encrypt TLS gratuitos.

Un buen próximo paso sería encontrar una forma de ser notificado cuando se lancen nuevas versiones de Caddy. Por ejemplo, podría usar el feed Atom para las versiones de Caddy o un servicio dedicado como dependencies.io .

Puedes explorar la documentación de Caddy para obtener más información sobre cómo configurar Caddy.