J'exploite la plupart de mes services dans Docker et auparavant, j'utilisais Nginx en tant que reverse proxy et terminaison TLS avec Let's Encrypt. Cela fonctionnait très bien, mais chaque fois que je voulais essayer quelque chose de nouveau, je devais copier-coller une autre conf et modifier quelques valeurs. J'aurais probablement pu automatiser cela dans une certaine mesure et il y en a d'autres qui l'ont fait, mais avec ma récente migration vers les VPS, j'ai décidé d'essayer Traefik, après avoir déjà réalisé plusieurs tests (repositories sur Github). Ce blog est donc le résultat du tutoriel que vous allez suivre ici.

J'ai souhaité conserver Ghost car je trouve cet outil vraiment génial et si simple à utiliser et à configurer par rapport à Wordpress qui ressemble de plus en plus à une usine à gaz. Seulement vous avez dû le constater si vous connaissez mon ancien blog, il ne possédait pas de certificat SSL... voici la remédiation à ce problème persistant.

Ici, je vais vous montrer comment configurer Traefik avec une interface graphique, une redirection http et des certificats automatiques Let's Encrypt. Nous allons également ajouter une authentification de base à l'interface graphique de Traefik.

⚠️ Mise à jour ⚠️

Il existe une vulnérabilité dans les anciennes versions de Traefik et j'ai donc mis à jour ce message avec une version sûre. Cela devrait fonctionner de la même manière, mais l'interface graphique sera différente de l'image ci-dessous.

Conditions préalables

Ce guide suppose des connaissances générales de Linux et que vous disposez d'un serveur sur lequel ces services sont installés:  

  • docker
  • docker-composer
  • Un domaine pour héberger vos applications

Pour des serveurs bon marché et de qualité, allez à DigitalOcean ou OVH.

Installation

Ceci est basé sur le guide officiel mais avec quelques ajouts.  Commencez par créer un réseau pour que vos conteneurs Web se connectent.

docker network create web

Ensuite, nous créons un répertoire et les fichiers nécessaires, comme sudo si nécessaire.

sudo su
mkdir -p /opt/traefik
touch /opt/traefik/docker-compose.yml
touch /opt/traefik/acme.json && chmod 600 /opt/traefik/acme.json
touch /opt/traefik/traefik.toml

Ajoutons maintenant notre docker-compose ...

nano /opt/traefik/docker-compose.yml
version: '2'

services:
  proxy:
    # Always use a proper version! (edited)
    image: traefik:v1.6.6-alpine
    # Feel free to change the loglevel if needed
    command: --web --docker --logLevel=INFO
    restart: unless-stopped
    # Here's the network we created
    networks:
      - web
    # The traefik entryPoints
    ports:
      - "80:80"
      - "443:443"
    labels:
      # Make sure this domain points to your IP so that traefik can request a cert
      - "traefik.frontend.rule=Host:traefik.example.com"
      # Traefik will proxy to its own GUI
      - "traefik.port=8080" 
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /opt/traefik/traefik.toml:/traefik.toml
      - /opt/traefik/acme.json:/acme.json
networks:
  web:
    external: true

N'oubliez pas de remplacer example.com dans traefik.frontend.rule.  ... et la config pour Traefik ....

nano /opt/traefik/traefik.toml
debug = false

defaultEntryPoints = ["https","http"]

# The syntax is somewhat esoteric IMHO so this is mostly copy-paste
[entryPoints]
  [entryPoints.http]
  address = ":80"
    [entryPoints.http.redirect]
    entryPoint = "https"
  [entryPoints.https]
  address = ":443"
  [entryPoints.https.tls]

[retry]

[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "traefik.example.com"
watch = true
exposedbydefault = false

[acme]
email = "youremail@example.com"
storage = "acme.json"
entryPoint = "https"
OnHostRule = true
[acme.httpChallenge]
entryPoint = "http"

# Enable web configuration backend
[web]

# Web administration port, proxied in docker-compose.yml
address = ":8080"

Ajoutez votre domaine et votre email sous [docker] et [acme], respectivement.  ... et nous devrions être prêts !

docker-compose up -d

Vérifiez les logs (docker-compose logs) et dirigez-vous vers votre domaine configuré. Vous devriez voir quelque chose comme ceci :

Ajouter un conteneur Ghost

Maintenant, bien sûr, pour pouvoir nous en servir, nous avons besoin d’un conteneur! Ce sera évidemment mon nouveau blog Ghost que vous lisez en ce moment-même. Créez un répertoire et un fichier docker-compose.yml, n'oubliez pas de changer de domaine et ajoutez le nom d'hôte à votre DNS! 👍

mkdir -p /opt/ghost
nano /opt/ghost/docker-compose.yml

version: '2'
services:
  server:
    image: ghost:alpine
    container_name: ghost
    restart: unless-stopped
    networks:
      - web
    labels:
      - "traefik.enable=true"
      - "traefik.frontend.rule=Host:blog.example.com"
      - "traefik.port=2368"
      - "traefik.docker.network=web"
    volumes:
      - /opt/ghost/blog:/var/lib/ghost/content
    environment:
      - NODE_ENV=production
      - url=https://blog.example.com

networks:
  web:
    external: true


Exécutez l'habituel docker-compose up -d et voilà le blog avec SSL / TLS et tout et tout, de la magie pure :

A l'adresse souhaitée :

Un petit test de certificat SSL :

Propre RAS, merci Let's Encrypt !

Puis un petit test de vitesse avec Pingdom Tools

Niquel, même si on peut faire, je suis sur la gamme de base des VPS OVH c'est donc logique

Monitoring

Pour changer je vais utiliser DockProm afin de monitorer mon VPS et mes services web :

git clone https://github.com/stefanprodan/dockprom
cd dockprom

ADMIN_USER=admin ADMIN_PASSWORD=admin docker-compose up -d

Résultat sur le port 3000 :

Aller plus loin :

  • Plusieurs sous-domaines pour plusieurs containeurs et donc web services ? oui bien sûr ! Le - "traefik.frontend.rule = Host: blog.example.com" correspond à l'hôte sur lequel Traefik va répondre. Vous pouvez donc ajouter plus de services au même fichier docker-compose.yml avec des noms d'hôte différents ou disposer d'une composition docker-compose.yml. Assurez-vous simplement que vos domaines pointent sur le même serveur afin que l'authentification par certificat puisse être résolue.