Installation de Docker et Grafana
6 - Accéder à Grafana depuis l'extérieur avec Traefik
Traefik est un reverse-proxy open-source et un load-balancer moderne conçu (par un Français) pour faciliter le déploiement des microservices (Docker, Kubernetes, AWS, etc.). Traefik est extrêmement simple à configurer et gère automatiquement vos certificats délivrés par Let's Encrypt. Il les renouvelle 30 jours avant leurs expirations sans action de votre part. De plus, il est capable de charger vos containers dynamiquement sans interruption de service et dispose d'un dashboard affichant l'ensemble de vos routes configurées.
Si vous avez déjà un Traefik sous Docker, vous pouvez vous rendre directement à l'étape 6.4.
6.1 - Création de l'utilisateur traefik
Si vous avez plusieurs containers ou si vous avez pour projet d'en ajouter par la suite, il est préférable d'isoler le container Traefik. Il est recommandé de ne pas le lancer sous votre super-utilisateur et de créer un utilisateur dédié.
-
Créez un utilisateur traefik :
sudo adduser traefik
-
Ajoutez-le au groupe docker :
sudo adduser traefik docker
6.2 - L'image et réseau Traefik
-
Connectez-vous sous l'utilisateur traefik :
su traefik
-
Déplacez-vous dans le répertoire personnel de cet utilisateur :
cd
-
Créez le réseau dédié à Traefik et à l'ensemble de vos containers :
docker network create traefik_network
-
Créez le fichier /home/traefik/docker-compose.yml en ajoutant le contenu suivant :
version: '3.7' services: traefik: image: "traefik:v2.2" container_name: "traefik" restart: unless-stopped networks: - traefik_network ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - /home/traefik/traefik.toml:/traefik.toml:ro - /home/traefik/acme.json:/acme.json networks: traefik_network: external: true
- /var/run/docker.sock:/var/run/docker.sock:ro : précise le socket Unix de votre docker. Laissez cette valeur par défaut.
- /home/traefik/traefik.toml:/traefik.toml:ro : précise le chemin du fichier de configuration de Traefik. Nous le créerons à l'étape suivante.
- /home/traefik/acme.json:/acme.json : précise le chemin du fichier contenant les informations relatives à vos certificats.
- traefik_network : ici nous spécifions le réseau dédié à Traefik. Nous ajouterons aussi le container Grafana dans ce réseau par la suite.
6.3 - Configuration Traefik
Traefik peut être configuré de différentes manières, nous allons détailler ici, la configuration recommandée par Traefik, à savoir par un fichier statique au format TOML.
-
Traefik stocke les informations liées au certificat dans un fichier acme.json. Vous devez au préalable créer le fichier et lui attribuer un minimum de permissions :
touch /home/traefik/acme.json && chmod 600 /home/traefik/acme.json
-
Créez le fichier de configuration Traefik /home/traefik/traefik.toml en ajoutant les lignes suivantes. L'unique propriété à modifier est l'email :
[providers.docker] endpoint = "unix:///var/run/docker.sock" watch = true exposedByDefault = false [entryPoints.web] address = ":80" [entryPoints.web.http.redirections.entryPoint] to = "websecure" scheme = "https" [entryPoints.websecure] address = ":443" [certificatesResolvers.leresolver.acme] email = "[email protected]" storage = "acme.json" [certificatesResolvers.leresolver.acme.httpChallenge] entryPoint = "web"
- [providers.docker] : cette directive permet tout simplement d'activer le support Docker.
- endpoint = "unix:///var/run/docker.sock" : précise le socket Unix de votre Docker à Traefik. Laissez la valeur par défaut.
- watch = true : permet de déployer à chaud les containers dès qu'un changement dans la configuration est détectée.
- exposedByDefault = false : n'expose pas par défaut les containers au monde extérieur. Il est préférable d'activer cette option dans le docker-compose.yml pour chacun des containers dans le cas où, si pour une raison ou une autre, vous ne souhaiteriez plus rendre accessible un container de l'extérieur.
- [entryPoints.web] et [entryPoints.websecure] : ces directives définissent les points d'entrée de votre Traefik. web et websecure sont purement indicatifs, vous pouvez les nommer autrement mais ils doivent correspondre aux labels que nous définirons plus tard dans le docker-compose.yml. Les propriétés address précisent les ports sur lesquels Traefik « écoute » en fonction du point d'entrée.
- [entryPoints.web.http.redirections.entryPoint] : force la redirection du port 80 vers le port 443 donc force le HTTP en HTTPS.
- [certificatesResolvers.[NOM_RESOLVEUR].acme] : nous indiquons ici que nous souhaitons utiliser le protocole ACME (donc le service Let's Encrypt) pour obtenir un certificat. Le nom du résolveur est purement indicatif, il doit simplement correspondre aux labels que nous définirons plus tard dans le docker-compose.yml.
- storage = "acme.json" : la propriété storage précise à Traefik le fichier (que nous avons créé précédemment) où seront stockées les informations relatives aux certificats. L'erreur commune est d'indiquer le chemin absolu (dans notre cas /home/traefik/acme.json), ici le chemin à renseigner est celui au sein du container Traefik, il faut donc laisser cette valeur par défaut.
- [certificatesResolvers.[NOM_RESOLVEUR].acme.httpChallenge] : cette directive précise tout simplement par quel point d'entrée (dans notre cas le port 80) Traefik peut obtenir un certificat.
-
Déplacez-vous dans le répertoire personnel de l'utilisateur traefik et démarrez le container :
cd docker-compose up -d
6.4 - Labels Grafana et réseau Traefik
-
Connectez-vous sous l'utilisateur grafana et déplacez-vous dans son répertoire personnel :
su grafana
cd
-
Dans votre fichier /home/grafana/docker-compose.yml, ajoutez les lignes en surbrillance en modifiant uniquement la ligne 56 par votre domaine. Le réseau traefik_network est ajouté dans la configuration du container grafana. Enfin, les labels permettant de communiquer avec Traefik sont spécifiés dans le container grafana :
version: "3" services: influxdb: image: influxdb:latest container_name: influxdb restart: always hostname: influxdb networks: - lan ports: - 8086:8086 environment: INFLUX_DB: "telegraf" INFLUXDB_USER: "telegraf_user" INFLUXDB_USER_PASSWORD: "telegraf_password" volumes: - influxdb-data:/var/lib/influxdb telegraf: image: telegraf:latest depends_on: - influxdb container_name: telegraf restart: always networks: - lan links: - influxdb:influxdb tty: true volumes: - /var/run/docker.sock:/var/run/docker.sock - /home/grafana/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf privileged: true grafana: image: grafana/grafana:latest depends_on: - influxdb container_name: grafana restart: always ports: - 3000:3000 networks: - lan - traefik_network links: - influxdb:influxdb environment: GF_INSTALL_PLUGINS: "grafana-clock-panel,\ grafana-influxdb-08-datasource,\ grafana-kairosdb-datasource,\ grafana-piechart-panel,\ grafana-simple-json-datasource,\ grafana-worldmap-panel" GF_SECURITY_ADMIN_USER: "grafana_user" GF_SECURITY_ADMIN_PASSWORD: "grafana_password" volumes: - grafana-data:/var/lib/grafana labels: - "traefik.enable=true" - "traefik.docker.network=traefik_network" - "traefik.http.routers.grafana.entrypoints=web,websecure" - "traefik.http.routers.grafana.rule=Host(`grafana.mondomaine.com`)" - "traefik.http.services.grafana.loadbalancer.server.port=80" - "traefik.http.routers.grafana.tls=true" - "traefik.http.routers.grafana.tls.certresolver=leresolver" volumes: influxdb-data: grafana-data: networks: lan: traefik_network: external: true
Il est primordial de respecter l'indentation !
- traefik.enable=true : ce label expose le container au monde extérieur. Il surchage la propriété exposedByDefault de votre fichier /home/traefik/traefik.toml.
- traefik.docker.network=traefik_network : ce label précise à Traefik quel réseau utilise le container Grafana.
- traefik.http.routers.[NOM_DU_CONTAINER].entrypoints : chaque règle de routage spécifique à un container doit être spécifiée par un nom, ici nous utilisons tout simplement le nom du container. Le label entrypoints précise que les requêtes entrantes sur les points d'entrée web (port 80) et websecure (port 443) seront transmises au container.
- traefik.http.routers.[NOM_DU_CONTAINER].rule=Host(`grafana.mondomaine.com}`) : ici nous précisons une règle, toute requête arrivant sur http://grafana.mondomaine.com sera transmise au container grafana.
- traefik.http.services.[NOM_DU_CONTAINER].loadbalancer.server.port=[PORT] : ici nous précisons le port du container sur lequel les requêtes doivent être transmises.
- traefik.http.routers.[NOM_DU_CONTAINER].tls : active le support SSL/TLS.
- traefik.http.routers.[NOM_DU_CONTAINER].tls.certresolver : précise le résolveur et donc les certificats à utiliser.
-
Déplacez-vous dans le répertoire personnel de l'utilisateur grafana et démarrez le container :
cd docker-compose up -d
Il est nécessaire de patienter 2 à 3min avant d'accéder à votre Grafana, le temps que Traefik génère vos certificats SSL/TLS.
6.5 - (Facultatif) URL de type http://www.mondomaine.com/grafana
Si l'URL d'accès à votre Grafana n'est pas la racine de votre domaine (http://www.mondomaine.com/grafana par exemple), il est nécessaire de le préciser dans la configuration du container grafana.
-
Ajoutez la ligne suivante dans votre fichier /home/grafana/docker-compose.yml et modifiez l'URL en fonction de votre configuration :
version: "3" services: influxdb: image: influxdb:latest container_name: influxdb restart: always hostname: influxdb networks: - lan ports: - 8086:8086 environment: INFLUX_DB: "telegraf" INFLUXDB_USER: "telegraf_user" INFLUXDB_USER_PASSWORD: "telegraf_password" volumes: - influxdb-data:/var/lib/influxdb telegraf: image: telegraf:latest depends_on: - influxdb container_name: telegraf restart: always networks: - lan links: - influxdb:influxdb tty: true volumes: - /var/run/docker.sock:/var/run/docker.sock - /home/grafana/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf privileged: true grafana: image: grafana/grafana:latest depends_on: - influxdb container_name: grafana restart: always ports: - 3000:3000 networks: - lan - traefik_network links: - influxdb:influxdb environment: GF_INSTALL_PLUGINS: "grafana-clock-panel,\ grafana-influxdb-08-datasource,\ grafana-kairosdb-datasource,\ grafana-piechart-panel,\ grafana-simple-json-datasource,\ grafana-worldmap-panel" GF_SECURITY_ADMIN_USER: "grafana_user" GF_SECURITY_ADMIN_PASSWORD: "grafana_password" GF_SERVER_ROOT_URL: "http://www.mondomaine.com/grafana" volumes: - grafana-data:/var/lib/grafana labels: - "traefik.enable=true" - "traefik.docker.network=traefik_network" - "traefik.http.routers.grafana.entrypoints=web,websecure" - "traefik.http.routers.grafana.rule=Host(`www.mondomaine.com/grafana`)" - "traefik.http.services.grafana.loadbalancer.server.port=3000" - "traefik.http.routers.grafana.tls=true" - "traefik.http.routers.grafana.tls.certresolver=leresolver" volumes: influxdb-data: grafana-data: networks: lan: traefik_network: external: true
-
Redémarrez les containers :
docker-compose restart
Ubuntu Server 20.04 LTS
Edouard WATTECAMPS
Bonjour,
J’ai un souci avec le Docker-compose. Je tape la commande :
sudo curl -L https://github.com/docker/compose/releases/download/1.28.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
Puis :
sudo chmod +x /usr/local/bin/docker-compose
Mais la commande docker-compose -v m’indique /usr/local/bin/docker-compose: line 1: Not: command not found
Alors que j’ai bien le fichier docker-compose
Merci
Bonjour Laurent,
Sur quel système d’exploitation êtes-vous ?
Ubuntu 20.04 LTS
Essayez la 1ère commande en remplaçant la version par 1.27.4