Caddy est un projet de serveur Web qui gère, en natif, HTTP/2 et LetsEncrypt. De plus, il est écrit en Golang, supporte fastcgi/proxy http et semble assez stable.

En clair, la solution idéale à utiliser comme serveur frontal sur mon VPS OVH.

Seul bémol, il faut l’installer et le gérer manuellement.

Première étape: le téléchargement. Direction la page Downloads, on sélectionne les modules qu’on veut (dans mon cas, ipfilter), clic droit sur Linux 64-bit (ou 32, ou ARM, ou OSX … Libre à vous) copier le lien et on wget ça sur la machine.

$ cd $(mktemp -d)
# Permet de se rendre dans un dossier temporaire ;D
$ wget -O "caddy.tar.gz" "https://caddyserver.com/download/build?os=linux&arch=amd64&features=ipfilter"
--2015-12-27 01:43:33--  https://caddyserver.com/download/build?os=linux&arch=amd64&features=ipfilter
Resolving caddyserver.com (caddyserver.com)... 162.243.142.63
Connecting to caddyserver.com (caddyserver.com)|162.243.142.63|:443... connected.
HTTP request sent, awaiting response... tar xvf 200 OK
Length: unspecified [application/x-gzip]
Saving to: ‘caddy.tar.gz’

caddy.tar.gz       [    <=>  ]   3.30M  1.52MB/s   in 2.2s

2015-12-27 01:43:45 (1.52 MB/s) - ‘caddy.tar.gz’ saved [3463359]
$ tar xvf caddy.tar.gz
README.txt
LICENSES.txt
CHANGES.txt
caddy
$ mv caddy /usr/bin/
$ setcap cap_net_bind_service=+ep /usr/bin/caddy
$ mkdir -p /etc/caddy/

Nous voilà en possession du fameux fichier, caddy ! On en a profité pour le mettre dans /usr/bin, et pour associer des privilèges au fichier binaire : ceux-ci lui permettent de bind les ports inférieurs à 1024 sans nécessiter de privilèges root (#sécurité !)

Afin de faire tourner un site statique minimal, disons … ungeek.fr, il faut un fichier Caddyfile (Voir la doc’).

ungeek.fr {
	gzip
	root /var/www/
}

Et c’est tout. Afin d’organiser tout ça, pourquoi ne pas créer ce fichier dans /etc/caddy/Caddyfile ?

Étant donné que Caddy s’occupe de vos certificats et a besoin d’un endroit accessible en écriture, il est préférable de lui créer un utilisateur nommé caddy (original ? Non, pas vraiment). Il va stocker ses fichiers dans /var/lib/caddy/.

$ mkdir /var/lib/caddy/
$ useradd -d /var/lib/caddy/ --system caddy
$ chown -R caddy /var/lib/caddy/
$ chmod 700 /var/lib/caddy/

Enfin, pour automatiser le tout, une petite unité systemd.

# /etc/systemd/system/caddy.service
[Unit]
Description=Caddy HTTP/2 web server
Documentation=https://caddyserver.com/docs
After=network.target

[Service]
WorkingDirectory=/var/lib/caddy/
User=caddy
Environment=STNORESTART=yes
LimitNOFILE=4096
ExecStart=/usr/bin/caddy -agree=true -email=votre@email.com -conf=/etc/caddy/Caddyfile
Restart=on-failure
StartLimitInterval=600

[Install]
WantedBy=multi-user.target

On active, on démarre, et on suit les logs pour vérifier que tout tourne bien.

$ systemctl enable caddy.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/caddy.service to /etc/systemd/system/caddy.service.
$ systemctl start caddy.service
$ systemctl status caddy.service
● caddy.service - Caddy HTTP/2 web server
   Loaded: loaded (/etc/systemd/system/caddy.service; enabled)
   Active: active (running) since Sat 2015-12-26 17:33:15 CET; 8h ago
     Docs: https://caddyserver.com/docs
 Main PID: 19756 (caddy)
   CGroup: /system.slice/caddy.service
           └─19756 /etc/caddy/caddy -agree=true -email=mon@mail.com -conf=/etc/caddy/Caddyfile

Dec 26 17:33:15 gravity.popcorp.eu systemd[1]: Started Caddy HTTP/2 web server.
Dec 26 17:33:15 gravity.popcorp.eu caddy[19756]: Activating privacy features... done.
...
$ journalctl -xn -u caddy.service -f
... logs qui défilent ...

Et voilà ! Notre petit serveur Web caddy tourne, en théorie.

Dans mon cas, c’est Caddy qui fait tourner l’interface de mes deux nouveaux VPS : Gravity et Entropy. Longue vie à eux !