¿Cómo instalar Caddy v2 en Ubuntu, Debian y Raspbian?

En este tutorial os enseñaremos a instalar la versión 2 de Caddy en cualquier versión Ubuntu, Debian y Raspbian de una manera sencilla, además de dar los primeros pasos en el Caddyfile con unos pequeños ejemplos.

¿Qué es Caddy?

Caddy es un servidor web escrito en GO de código abierto y que cuenta con soporte para HTTP/2. Utiliza la biblioteca estándar Go para su funcionalidad HTTP. Caddy puede obtener y renovar automáticamente los certificados TLS para sus sitios. Este soporte de HTTPS se consigue gracias a Lets Encrypt, pero si quieres puedes usar tus propios certificados realizando una sencilla configuración.

A diferencia de otros servidores web tota la configuración de todos los sitios web la podemos llevar desde un único archivo llamado Caddyfile, generalmente se encuentra en /etc/caddy/.

La modularidad de Caddy significa que puede hacer más con un solo binario estático que se compila para cualquier plataforma. Caddy funciona muy bien en contenedores como Docker, Kubernetes, ... porque no tiene dependencias. Entre las funciones de Caddy podemos encontrar opciones de configuración de un proxy inverso con solo escribir una simple linea, crear un balanceador de carga, servir archivos estáticos, establecer claves de login, ...

Borrar Caddy v1

Los que siguierais el antiguo tutorial de ¿Cómo instalar Caddy Server en Ubuntu? debéis seguir los siguientes pasos para limpiar la instalación del mismo y después poder proceder a la instalación de Caddy v2.

Primeramente debemos parar el servicio de Caddy y desactivarlo usando los dos siguientes comandos:

systemctl stop caddy
systemctl disable caddy

Una vez realizado el paso anterior procedemos a borrar el caddy.service, esto lo hacemos porque el instalador de Caddy v2 crea el suyo propio y ya no necesitamos esta vieja versión. Para ellos ejecutamos estos otros dos comandos:

cd /etc/systemd/system
rm -rf caddy.service

Posteriormente borramos el binario de caddy de nuestro sistema con estos comandos:

cd /usr/local/bin
rm -rf caddy

Eliminamos la carpeta de nuestros certificados que usábamos en la anterior versión de Caddy, ya que ahora se guardarán en la ruta $HOME/.local/share/caddy (otra opción es copiarlos a ese nuevo directorio):

rm -rf /etc/ssl/caddy

🔖 Nota: En la carpeta $HOME/.local/share/caddy se encuentran las carpetas acme, certificates, locks y ocs.

⚠️ Importante: Los que uséis Cloudflare de forma temporal poner los registros en modo "DNS Only", para que cuando instaléis Caddy v2 pueda generar los certificados. Una vez se generan y todo funciona volver a activar el Proxy.

Para desactivarlo nos vamos a la sección DNS de Cloudflare. Pulsamos en el registro A que veamos con el estado "Proxied" en Proxy Status y le hacemos click para cambiarlo a "DNS only". Para aplicar este cambio pulsamos en "Save".

Instalación de Caddy v2 en Ubuntu, Debian y Raspbian

Existen dos opciones de instalar Caddy, la primera es hacerlo de forma manual yendo al Github y bajandote el binario. El problema de esta primera forma es que hay que realizar mucha configuración manual como hacíamos para instalar caddy v1, yo os recomiendo que uséis la segunda forma que es de la que hablare en este post.

Anter de proseguir debemos de asegurarnos de tener algunas dependecias instaladas previamente, para ello ejecutamos el siguiente comando:

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https

Lo primero que debemos hacer es añadir el repositorio de Caddy que se sirve desde cloudsmith (es un gestor de paquetes), para ello escribiremos los dos siguientes comandos (el primero es para bajar la clave gpg y el segundo para añadirlo a la lista de paquetes del sistema operativo):

curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg

curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list

Una vez agregamos el comando tenemos que actualizar la lista de paquetes de nuestro sistema usando el comando apt update para posteriormente con el segundo comando instalar caddy.

sudo apt update
sudo apt install caddy

Una vez realizado esto tendremos caddy instalado en nuestro servidor, si vamos a nuestro navegador y ponemos la ip de nuestro servidor podemos ver la página por defecto que nos indica que el servidor web esta funcionando correctamente. Veréis una página web similar a la siguiente:

Otra forma de comprobar el funcionamiento es escribir en la terminal el comando systemctl status caddy o simplemente caddy. Os explico un poco más abajo como configurarlo usando el Caddyfile.

¿Donde se encuentran los archivos de los servicios de Caddy?

Al instalar Caddy v2 desde el comando apt install caddy se nos generan dos servicios en nuestro sistema. Estos servicios son caddy.service y caddy-api.service (nos permite interactuar con caddy usando su api).

Estos dos servicios por lo menos en Ubuntu se establecen en la ruta /lib/systemd/system. Por lo general no es necesario que modifiquéis nada en esos archivos ya que vienen preconfigurados.

Configuración CaddyFile

El archivo de configuración de Caddy para nuestros sitios webs lo encontraremos en /etc/caddy/, todo el contenido del archivo lo podemos borrar si queremos ya que en el tenemos que meter nuestra configuración. En esta captura podéis ver la configuración por defecto del Caddyfile:

Una vez editamos el archivo (Caddyfile) y estando el directorio donde lo tenemos escribimos en la terminal caddy validate, con este comando podemos comprobar que todos los cambios que hicimos en ese archivo sean correctos. Una vez tenemos eso validado escribimos en la terminal caddy reload y automáticamente Caddy aplicará los cambios que hemos realizado.

⚠️ Importante: Tutorial ¿Cómo instalar PHP 7.2, 7.3 y 7.4 en Caddy? sirve para cualquier versión de Caddy

Ejemplo configuración reverse proxy

En este ejemplo estamos estableciendo un reverse proxy de una aplicación X que se ejecuta en el puerto 3000, que perfectamente podría ser una simple app en ExpressJS y le estamos diciendo a Caddy que use como algoritmo de compresión gzip. Puede darse el caso que queramos usar también el algoritmo de compresión "zstd", para usar los dos tenemos que poner encode zstd gzip y dependiendo del soporte que tenga el navegador usará uno o otro.

example.com {
    reverse_proxy localhost:3000
    encode gzip
}

Ejemplo de configuración para PhpMyAdmin

⚠️ Importante, No instaléis phpmyadmin usando el comando de apt install, principalmente porque os terminará instalando cosas que no necesitéis como apache y otras dependencias.

Yo os recomiendo ir a la web phpmyadmin.net, hacer click derecho en el botón "Download" (descargar) y poner en la terminal el comando "wget" + el enlace para bajar el zip con la instalación de phpmyadmin. Una vez bajado descomprimimos el archivo con el comando unzip + el nombre del archivo, si no tenéis unzip instalado escribir en la terminal apt install unzip.

Una vez descomprimido se os creara una carpeta con el nombre phpMyAdmin-X.X.X-all-languages, yo os recomiendo renombarla a phpmyadmin o similar para que os sea más simple de identificarla.

Después nos vamos al archivo de configuración "Caddyfile" que se encuentra en /etc/caddy y escribimos algo similar a lo siguiente:

phpmyadmin.example.com {
    root * /var/www/phpmyadmin
    php_fastcgi unix//run/php/php7.4-fpm.sock
    encode gzip
    file_server
}

Explicación de esta configuración:

  • root: es donde decimos donde están los archivos de nuestro proyecto, generalmente donde esta el archivo index.php
  • php_fastcgi: en esa línea escribimos la versión de php fpm que tenemos instalada, en este ejemplo es php7.4-fpm
  • encode: es donde le decimos al servidor que tipo de compresión queremos que se use, generalmente se suele usar gzip debido a que es compatible con todos los navegadores.
  • file_server: sirve para indicarle a caddy que queremos servir archivos

Si queremos mejorar un poco más la seguridad del panel de phpmyadmin podemos establecer un segundo login usando basicauth, dentro de este método especificamos un user y pass para que directamente en vez de mostrar se nos pidan otras credenciales. Importante no dejar espacios en el nombre de usuario o en la contraseña, el user y pass se separan entre si con un espacio.

phpmyadmin.example.com {
    root * /var/www/phpmyadmin
    php_fastcgi unix//run/php/php7.4-fpm.sock
    basicauth /*  {
      user pass
    }
    encode gzip
    file_server
}

⚠️ Importante: La contraseña la tenemos que poner cifrada, por defecto Caddy usa bcrypt como algoritmo de encriptación. Para encriptar nuestra clave ponemos el siguiente comando en la terminal:

caddy hash-password -plaintext MiContraseñaSuperSecreta

Al encriptar la clave "MiContraseñaSuperSecreta" caddy nos genera el siguiente hash JDJhJDEwJHhTRXEvVmRsWlNBLjBYSmk5Sk4wY09CNU5ybW15YkNjZUc1MzBSS2hJTTFhdEFOOG51NnlX, este hash lo ponemos en el apartado de pass de basicauth.

Ejemplo de configuración para un Wordpress

⚠️ Importante, recordar después de bajar desde Wordpress.org el zip, descomprimirlo y subirlo al servidor asignar los permisos de usuario y grupo correctos. Por norma general si instalasteis php siguiendo el tutorial que os dejamos más arriba tenéis que usar este comando:

chown -R www-data:www-data /var/www/...

Recordar cambiar /var/www/... por la ruta donde tengáis la carpeta de Wordpress. Caddyfile con la configuración de Wordpress estándar:

example.com {
    root * /var/www/wordpress
    php_fastcgi unix//run/php/php7.4-fpm.sock
    # Evitamos la ejecución de cualquier php en uploads
    respond /wp-content/uploads/*.php 404
    encode gzip
    file_server
}

Extra activar el Firewall en Ubuntu

En el caso de que queraís mejorar un poco más la seguridad de vuestro servidor Ubuntu os recomiendo instalar el firewall UFW. No es muy complicado de instalar, simplemente teneis que poner el siguiente comando:

apt install ufw

Con realizar esa simple acción ya tendremos instalado el firewall pero antes de ponerlo en marcha tenemos que establecer una reglas, en este caso con estos 3 comando dejamos abiertos los puertos de http/https y shh para poder conectarnos al servidor (sin firewall tenemos siempre todos los puertos abiertos):

sudo ufw allow http
sudo ufw allow https
sudo ufw allow ssh

Una vez tenemos esos comandos establecidos solo nos queda activarlo con este comando:

ufw enable

Si tenéis dudas sobre como configurar algún tipo de redirección o cualquier cosa en Caddy os recomiendo que os paséis por el Foro Oficial de Caddy y por su documentación oficial. Espero que este tutorial os ayude a iniciaros en el mundillo de Caddy.