Caddy est un serveur Web moderne et populaire, conçu pour offrir de hautes performances et une sécurité mémoire. Il est écrit en Go, fonctionne sans aucune dépendance, offre un support intégré pour le rendu de sites statiques avec Markdown et propose le HTTPS automatique.

Caddy s’attache à fournir une expérience de gestion de serveur simple qui vous offre des fonctionnalités utiles par défaut. Il peut être plus facile à configurer et à maintenir que des systèmes concurrents tels qu’Apache et NGINX. Dans cet article, nous allons montrer comment faire fonctionner votre propre serveur avec une configuration minimale en utilisant Docker avec l’image officielle de Caddy.

Sélection d’une balise d’image

L’image Caddy existe en plusieurs versions différentes. La dernière version de Caddy est partagée par tous, la v2.4 au moment de la rédaction de cet article. Vous pouvez utiliser 2.4.x (en remplaçant x par une version de correctif spécifique), 2.4 ou 2 pour indiquer le composant majeur, mineur ou le correctif.

Caddy fonctionne avec les hôtes Docker Linux et Windows. Alpine Linux, Windows Server Core 1809 et la version LTSC de Windows Server Core 2016 sont les options de système d’exploitation actuelles. La référence à une balise Caddy nue telle que caddy:2 sélectionnera l’image appropriée pour votre plateforme ; vous pouvez utiliser des variantes telles que 2.4-alpine ou 2.4.6-windowsservercore-1809 à la place pour être plus explicite.

Démarrer un serveur de base

Caddy est livré dans une configuration prête à fonctionner. L’image Docker servira votre contenu web à partir du répertoire /usr/share/caddy. Vous pouvez ajouter vos fichiers au conteneur en montant un répertoire hôte dans ce chemin.

Caddy dispose également de répertoires distincts pour la configuration et les données, dans lesquels vous devez monter des volumes Docker. Le répertoire /config est facultatif mais recommandé ; il stocke vos fichiers de configuration mais comme ceux-ci sont convertis en requêtes API, il n’est pas strictement nécessaire de les conserver. L’emplacement /data est vital car il contient les certificats TLS générés par Caddy, les clés privées et la configuration finale du serveur qui a été traitée par l’API.

Pour aller plus loin : Comment déployer PostgreSQL en tant que conteneur Docker

docker run -d -p 80:80 \
-v ./my-website:/usr/share/caddy/ \
-v caddy-config:/config
-v caddy_data:/data
caddy:2

En tant que serveur HTTP, Caddy écoute sur le port 80 par défaut. Celui-ci est lié au port 80 de votre hôte via le drapeau -p dans l’exemple ci-dessus.

Vous pouvez maintenant visiter http://localhost dans votre navigateur pour accéder à votre site. Vous devriez voir l’index.html de votre répertoire de contenu monté. Vous obtiendrez la page d’accueil par défaut de Caddy si vous n’avez rien lié à /usr/share/caddy.

Configuration de HTTPS

L’une des caractéristiques principales de Caddy est son support automatique de TLS, nous serions donc négligents de ne pas l’utiliser. Vous devez lier le port 443 en plus du port 80 pour que Caddy puisse recevoir le trafic HTTPS. Le seul autre changement consiste à fournir le nom de domaine sur lequel votre site sera servi. Tout le reste est géré par Caddy.

docker run -d -p 80:80 -p 443:443 \
-v ./my-website:/usr/share/caddy/ \
-v caddy-config:/config
-v caddy_data:/data
caddy:2 caddy file-server –domain example.com

La commande qui suit le nom de l’image est transmise par docker run au point d’entrée de l’image Docker. Dans ce cas, cela signifie que caddy file-server … est exécuté en tant que processus de premier plan du conteneur. Le drapeau –domain est utilisé pour définir le domaine pour lequel Caddy va acquérir un certificat HTTPS. Vous devriez vérifier que vous avez un enregistrement DNS de type A référençant l’IP de votre hôte Docker avant de démarrer le conteneur.

À lire également : Utiliser Docker et les conteneurs

Ajouter votre propre fichier Caddy

Caddy utilise normalement un fichier de configuration appelé Caddyfile pour définir les routes et modifier les paramètres du serveur. L’image Docker charge le fichier Caddyfile dans /etc/caddy/Caddyfile. Montez votre propre fichier dans ce chemin pour remplacer les paramètres par défaut qui servent /usr/share/caddy :

docker run -d -p 80:80 -p 443:443 .
-v ./Caddyfile:/etc/caddy/Caddyfile
-v caddy_data:/data
caddy:2

Voici un simple Caddyfile pour un site appelé example.com avec HTTPS activé :

{
email [email protected]
}

exemple.com {
respond « Ca marche ! »
}

Cette configuration minimale définit l’adresse électronique globale à [email protected] Cette adresse sera utilisée lors des demandes de certificats Let’s Encrypt. Le bloc exemple.com fournit des règles de routage pour le traitement par Caddy des demandes vers votre domaine. Dans ce cas, le serveur répondra toujours par un message statique.

Plus d’informations sur le Caddyfile sont disponibles dans la documentation de Caddy. Docker ne change rien ici : tant que votre fichier est disponible dans /etc/caddy/Caddyfile, Caddy le chargera et l’utilisera.

Création d’images Docker pour vos sites

Jusqu’à présent, nous avons examiné l’utilisation ad hoc de Caddy en démarrant des conteneurs directement à partir de l’image de base de Caddy. En pratique, il est plus probable que vous souhaitiez créer des images dédiées pour vos sites afin de ne pas avoir à monter votre contenu à chaque fois que vous démarrez un conteneur.

L’image de base de Caddy est prête à être étendue avec vos propres instructions pour ajouter du contenu et de la configuration. Voici un exemple de fichier Docker qui inclut un fichier Caddy et copie le contenu de votre site dans un répertoire personnalisé :

FROM caddy:2.4
WORKDIR /mon-site
COPY Caddyfile /etc/caddy/Caddyfile
COPIE *.html ./
COPIE *.css css/
COPIE *.js js/

Vous pouvez maintenant construire et exécuter votre image pour démarrer un serveur Caddy préconfiguré pour votre site :

docker build -t my-site:latest .
docker run -p 80:80 -p 443:443 -v caddy_data:/data mon-site:latest

Ajout de modules supplémentaires

Avec de nombreux sites, vous voudrez inclure des modules Caddy supplémentaires pour des fonctionnalités additionnelles. La meilleure façon de gérer ces modules dans votre Dockerfile est d’utiliser l’image de construction dédiée de Caddy. Celle-ci comprend les outils nécessaires pour créer une instance Caddy personnalisée avec des modules spécifiques installés.

Les constructions en plusieurs étapes de Docker sont idéales pour ce flux de travail. Voici un exemple qui ajoute le module replace-response de Caddy afin que vous puissiez réécrire des parties de données de réponse à l’aide de règles dans un fichier Caddy :

FROM caddy:2.4-builder AS caddy-build
RUN xcaddy build –with github.com/caddyserver/replace-response

À partir de caddy:2.4
COPY –from=caddy-build /usr/bin/caddy /usr/bin/caddy
WORKDIR /mon-site
COPY Caddyfile /etc/caddy/Caddyfile
COPIE *.html ./
COPIE *.css css/
COPIE *.js js/

La première étape de construction produit un binaire Caddy avec le module de réponse de remplacement intégré. La commande xcaddy disponible dans l’image du constructeur place sa sortie dans /usr/bin/caddy. La deuxième étape utilise l’image de base standard de Caddy mais écrase le binaire inclus avec celui construit sur mesure. Le résultat est un serveur Caddy qui incorpore des modules supplémentaires tout en conservant le support complet des autres fonctionnalités de l’image de base Docker.

Conclusion

Caddy est un serveur web moderne qui constitue un excellent choix pour servir efficacement des fichiers statiques. Il offre un ensemble de fonctionnalités convaincantes avec un support de première classe pour HTTPS, un rendu intégré des modèles et une intégration de Markdown.

L’utilisation de Docker pour héberger votre serveur Caddy vous offre un moyen rapide de déployer une instance sans avoir à télécharger manuellement des binaires ou à installer des fichiers de service. C’est un bon moyen de tester Caddy ou de l’exécuter avec des charges de travail existantes dans un cluster.

Comme Caddy peut agir comme un proxy inverse et un équilibreur de charge, vous pouvez l’utiliser comme point d’entrée pour acheminer le trafic vers vos autres conteneurs Docker. Le module populaire Caddy Docker Proxy étend les capacités intégrées du serveur avec un support de type Traefik pour la découverte automatique de routes via les étiquettes des conteneurs Docker.

Caddy adopte une approche de la configuration fondée sur l’API, ce qui simplifie la gestion des instances fonctionnant dans un conteneur. Vous n’avez pas à vous soucier de l’injection de fichiers de configuration ou de la gestion des volumes. Tant que le répertoire /data est conservé, vous pouvez faire des requêtes API pour modifier le fonctionnement de Caddy sans avoir à utiliser le CLI de Docker. Cela peut en faire un meilleur choix pour la conteneurisation par rapport à des options plus traditionnelles comme Apache et NGINX.