Installation du serveur Caddy sous Devuan

Caractéristiques

Caddy est un serveur récent, écrit dans le langage Go. Ses caractéristiques principales sont plutôt intéressantes :

  • HTTP/2,
  • Https, de façon automatique avec Let’s Encrypt
  • IPv6,
  • Reverse proxy,
  • Markdown,
  • WebSockets,
  • FastCGI,
  • les templates,

Installation

Go est un langage compilé. Pour installer caddy, on télécharge le binaire précompilé par l’équipe.

Sur la page de téléchargement, vous avez le choix d’ajouter des options. Ensuite, vous indiquez votre système et, vous téléchargez l’application.

Si, comme moi, vous n’avez accès à votre serveur que via ssh, il existe un script qui vous permet un téléchargement et une installation via la ligne de commande.

Le script se trouve par ICI. Lisez le avant d’automatiser la chose :

$ wget -qO- https://getcaddy.com | bash

Une fois le binaire téléchargé, le script passera par sudo afin de l’installer dans le répertoire /usr/local/bin.

Voilà, c’est tout.

Configuration

Je choisis de ne pas lancer caddy en tant que root.

Utilisateur

Création d’un utilisateur (ou utilisation de votre utilisateur) qui servira à lancer caddy en tant que démon, sans droit root.

Fichier de configuration

Par défaut, ce script pousse caddy à lire un fichier de configuration situé dans /etc/caddy/Caddyfile. Sa syntaxe est des plus simple. Exemple :

# Pour du https automatique avec redirection
plop.net www.plop.net {
    tls votre@email
    root /data/www/plop.net
    gzip
}

# Pour du classique
da.plip.net:80 {
    tls off
    root /data/www/da.plip
    gzip
}

Démon

Vous n’avez qu’un binaire, la procédure pour le lancer en tant que service n’existe pas.

Il va falloir créer un script caddy et le placer dans /etc/init.d/. Je vous propose le suivant :

#!/bin/sh
# kFreeBSD do not accept scripts as interpreters, using #!/bin/sh and sourcing.
if [ true != "$INIT_D_SCRIPT_SOURCED" ] ; then
    set "$0" "$@"; INIT_D_SCRIPT_SOURCED=true . /lib/init/init-d-script
fi

### BEGIN INIT INFO
# Provides:          caddy
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start caddy server at boot time
# Description:       Enable service provided by caddy daemon.
### END INIT INFO

DESC="the caddy server"
NAME=caddy
DAEMON=/usr/local/bin/$NAME
DAEMONOPTS="-conf=/etc/caddy/Caddyfile -log /var/log/caddy.log"
DAEMONUSER="a_not_root_user"

USERBIND="/sbin/setcap cap_net_bind_service=+ep"
PIDFILE=/var/run/$NAME.pid
STOP_TIMEOUT=30

test -x $DAEMON || exit 0

start () {
    $USERBIND $DAEMON
    start-stop-daemon --background --make-pidfile --pidfile $PIDFILE \
        --start --quiet --chuid $DAEMONUSER \
        --exec $DAEMON -- $DAEMONOPTS
}

stop () {
    start-stop-daemon --stop --quiet \
        --exec $DAEMON --retry $STOP_TIMEOUT --oknodo
}

case "$1" in
    start)
        log_daemon_msg "Starting web server daemon $NAME"
        start
    ;;
    stop)
        log_daemon_msg "Stopping web server daemon $NAME"
        stop
    ;;
    restart)
        log_daemon_msg "Restarting web server daemon $NAME"
        stop
        start
    ;;
    status)
        status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit $?
    ;;
    *)
        log_action_msg "Usage: $0 {status|start|stop|restart}"
        exit 2
    ;;
esac

exit 0

Vous pouvez récupérer ce script sur le dépôt Git chez Devuan. Il vous reste à renseigner la variable DAEMONUSER et le rendre exécutable :

$ sudo chmod +x /etc/init.d/caddy

La variable USERBIND=“/sbin/setcap cap_net_bind_service=+ep” est utilisée pour permettre à caddy, qui fonctionne sans droits root, d’utiliser les ports 80 et 443.

Vous pouvez tester si cela vous convient :

$ sudo /etc/init.d/caddy start

Les options classiques stop, restart, status sont disponibles.

Pour automatiser le service à chaque redémarrage :

$ sudo update-rc.d caddy defaults

Voilà, n’hésitez pas à l’améliorer ;)