Ça faisait un moment que je repoussais la migration de mon serveur web traefik 1 vers la version 2. La vieille flemme de reconfigurer le serveur ainsi que chacun de mes services selon la nouvelle nomenclature de la version 2. C’est alors que j’ai pensé à caddy , un autre serveur web en Go, et je me suis demandé s’il ne pouvait pas s’interfacer avec mon docker swarm ? Et bien oui !
Attention je ne dis pas que traefik n’est pas bien, mais ma nouvelle devise étant “pourquoi faire compliqué quand on peut faire simple”, je n’ai pas besoin de la complexité de traefik pour mes besoins personnels, donc voici le plugin de caddy pour docker swarm : caddy-docker-proxy .

Tout d’abord je créé un network dédié à caddy:

docker network create --attachable --scope=swarm --driver=overlay caddy-net

Ensuite je créé un répertoire pour le volume (on peut aussi utiliser docker volume create):

mkdir /swarm/volumes/caddy

Le fichier caddy.yml pour lancer la stack caddy dans le swarm :

version: "3.7"
services:
  caddy:
    image: lucaslorentz/caddy-docker-proxy:ci-alpine
    networks:
      - caddy-net
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /swarm/volumes/caddy:/data
    deploy:
      placement:
        constraints:
          - node.role == manager

      labels:
        caddy.email: user@domain.com

networks:
  caddy-net:
    external: true

Je lance le conteneur caddy:

docker stack deploy --compose-file=caddy.yml caddy

Le serveur web est prêt à exposer les services docker. Par exemple prenons ce fichier gotify.yml qui va exposer le service gotify.fredix.xyz

version: "3.3"
services:
  gotify:
    image: gotify/server
    env_file: .env.sqlite
    networks:
      - caddy-net
    ports:
      - 80
    volumes:
      - /swarm/volumes/gotify:/app/data
    deploy:
      placement:
        constraints:
          - node.role == manager

      labels:
        caddy: gotify.fredix.xyz
        caddy.reverse_proxy: "{{upstreams 80}}"
#        caddy.tls.ca: https://acme-staging-v02.api.letsencrypt.org/directory
        caddy.tls.ca: https://acme-v02.api.letsencrypt.org/directory

networks:
  caddy-net:
    external: true

La configuration pour caddy se résume à 3 labels… \o/ On lance le service et terminé ; caddy va de lui même installer les certificats let’s encrypt. A noter que pendant les tests il vaut mieux utiliser l’API staging de letsencrypt.

docker stack deploy --compose-file=gotify.yml gotify