Aujourd'hui je vais vous parler du serveur web / reverse-proxy "Caddy". Pour la petite histoire j'utilisais auparavant sur mon stack de développement Docker l'outil "Traefik" comme reverse-proxy.

Mais du coup pourquoi ce changement ? Pour plusieurs raisons que je vais énoncer :

  • À la fois serveur web et reverse-proxy (donc pouvant remplacer un combo Traefik + Apache / Nginx)
  • Configuration très simple
  • Très léger
  • Redirection automatique vers le HTTPS par défaut (avec certificat local pour les adresses locales)
  • Les entêtes HTTP sont automatiquement portés vers le point qui est indiqué (que ce soit une adresse ou un conteneur Docker)
  • Système de modules permettant d'ajouter de manière assez simple le support de plus de technologies (comme Mercure ou Vulcain par exemple, ce qui va demander de créer un Dockerfile pour build les modules en même temps que l'image)
  • Support du HTTP/3

Par exemple pour voici ce que pourrait être le fichier de configuration, nommé Caddyfile pour gérer ce blog :

{
    # email to generate a valid SSL certificate
    email mymail@mail.com

    # HTTP/3 support
    servers {
        protocol {
            experimental_http3
        }
    }
}

# Host which Caddy will handle
antho.dev

# Enable the log
log

# Caddy will serve the ghost container on the default address
reverse_proxy ghost:2368

encode gzip zstd
file_server

Pour gérer les sous-domaines, là aussi c'est très simple, il suffit de les gérer de la manière suivante :

{
    # email to generate a valid SSL certificate
    email mymail@mail.com

    # HTTP/3 support
    servers {
        protocol {
            experimental_http3
        }
    }
}

antho.dev {
	reverse_proxy ghost:2368
    encode gzip zstd
    file_server
}

cv.antho.dev {
	reverse_proxy cv:8081
    encode gzip zstd
    file_server
}

github.antho.dev {
	# To redirect the subdomain to my Github page
	redir / https://github.com/Anthodev
}

Et pour le docker-compose, il suffit de déclarer le conteneur de Caddy de la façon suivante :

version: '3'

services:
    caddy:
        image: caddy
        container_name: "caddy"
        volumes:
            - ./Caddyfile:/etc/caddy/Caddyfile:ro
            - caddy_data:/data
            - caddy_config:/config
        ports:
            # HTTP
            - target: 80
            published: 80
            protocol: tcp
            # HTTPS
            - target: 443
            published: 443
            protocol: tcp
            # HTTP/3
        	- target: 443
            published: 443
            protocol: udp
        restart: unless-stopped

C'est aussi simple que cela ! En tout cas c'est bien moins pénible que la gestion des vhost d'Apache ou de Nginx.

Servir un conteneur PHP-FPM

Cependant pour servir un contenur PHP-FPM, la procédure est un peu différente, tout d'abord la déclaration du docker-compose.yml ressemblera à quelque chose comme ça :

version: '3'

services:
    caddy:
        image: caddy
        container_name: "caddy"
        volumes:
        	- ./Caddyfile:/etc/caddy/Caddyfile:ro

            # On lie le dossier de l'endroit où se situes les fichiers du conteneur PHP au niveau local avec l'endroit où le front pourra être vu par Caddy
            - ./app:/srv:ro

            - caddy_data:/data
            - caddy_config:/config
        ports:
            # HTTP
            - target: 80
            published: 80
            protocol: tcp
            # HTTPS
            - target: 443
            published: 443
            protocol: tcp
            # HTTP/3
            - target: 443
            published: 443
            protocol: udp
        restart: unless-stopped
    
      php:
          image: thecodingmachine/php:8.0-v4-fpm
          container_name: "php"
          volumes:
          - ./app:/srv:rw,cached
          ports :
          - 9000:9000
          restart: unless-stopped

Au niveau du Caddyfile, il sera configuré de cette manière :

{
    # email to generate a valid SSL certificate
    email mymail@mail.com

    # HTTP/3 support
    servers {
        protocol {
            experimental_http3
        }
    }
}

# Host which Caddy will handle
antho.dev

# Enable the log
log

# On indique quel sera le dossier racine du serveur web
root * /srv/public

# On indique à Caddy où sera interprété le PHP
php_fastcgi php:9000

encode gzip zstd
file_server

Maintenant Caddy sait que c'est le conteneur php-fpm qui interprétera le PHP et les fichiers qui seront servis sont ceux qui sont dans le dossier public du dossier app.

Désormais vous avez une première mise en main avec Caddy, à voir ensuite si vous avez été suffisamment séduit ou non.