Sommaire

TIG version Docker

Introduction

Suite au renouveau de mon serveur, j’ai décider d’y installer la stack TIG afin de remplacer celui que j’utilise actuellement sur un truc qui me sert de serveur à la maison.
Comme ce serveur utilise Traefik, je l’utilise en tant que point d’entrée pour InfluxDB et Grafana.

Nous verrons donc ici comment mettre en place ces différents services. J’ai fait cela d’une manière où l’on prépare tous à l’avance et pour que j’aie le moins d’actions de configuration manuelle à faire.
J’ai fait de cette manière car j’ai orchestré tout cela avec Ansible. Mais ça, ça sera pour un autre article…

Préparation

InfluxDB

Configurations

Le conteneur va prendre trois fichiers en entrée :

  1. Fichier des variables d’environnements
  2. Configuration d’InfluxDB
  3. Fichier d’initialisation du service

Le fichier 1 (.influxdb.env) est assez explicite :

1
2
INFLUXDB_ADMIN_USER=admin
INFLUXDB_ADMIN_PASSWORD=aev3netai3vahPee

Pour la configuration (2), je suis resté sur la configuration de base. Pour cela, j’ai généré le fichier avec la commande suivante :

1
docker run --rm influxdb influxd config > influxdb.conf

Le chemin de ce fichier dans le conteneur est /etc/influxdb/influxdb.conf, je l’ai donc stocké au même endroit sur ma machine physique.

Ce que j’appelle le fichier d’initialisation du service est un fichier qui va contenir l’ensemble des commandes qui vont créer les différentes BDD et utilisateurs avec les droits adéquats.
Voici donc mon fichier all.iql :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# Databases
CREATE DATABASE "telegraf_db"
CREATE DATABASE "traefik_db"

# Manage system users
## Telegraf
CREATE USER telegrafeur WITH PASSWORD 'jooKaiphae7eisee'
GRANT WRITE ON telegraf_db TO telegrafeur

## Traefik
CREATE USER traefikeur WITH PASSWORD 'aip7nahd3ahcieL4'
GRANT WRITE ON traefik_db TO traefikeur

## Grafana
CREATE USER grafaneur WITH PASSWORD 'ohw4muJ9ma9Yeero'
GRANT READ ON telegraf_db TO grafaneur
GRANT READ ON traefik_db TO grafaneur

Pour les exemples j’ai crée les passphrases avec un pwgen -B 16 1.

On voit ici que j’ai créé une BDD pour les données de Telegraf ainsi qu’un utilisateur avec les droits d’écriture sur cette base. Je fais de même pour ceux de Traefik.
En plus, je crée un utilisateur spécifique pour Grafana qui peut seulement lire ces données.

Composition

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: '3.8'
services:
  influxdb:
    image: influxdb:1.8
    container_name: influxdb
    restart: unless-stopped
    env_file:
      - /etc/influxdb/.influxdb.env
    ports:
      - 8086:8086
    volumes:
      - /etc/influxdb/influxdb.conf:/etc/influxdb/influxdb.conf:ro
      - /etc/influxdb/influx_init.iql/:/docker-entrypoint-initdb.d/
      - /var/lib/influxdb:/var/lib/influxdb
      - /var/log/influxdb:/var/log/influxdb
    labels:
      - traefik.enable=true
      - traefik.port=8086
      - traefik.http.routers.influxdb.rule=Host(`metriques.scrample.xyz`)
      - traefik.http.routers.influxdb.tls=true
      - traefik.http.routers.influxdb.tls.certresolver=mycertresolver
    networks:
      - tig-net

Les références aux fichiers de la partie précédente sont mis en surbrillance. La ligne 12 correspond a un dossier ou le fichier all.iql se trouve.

Telegraf

Configurations

Le fichier de variable d’environnement (.telegraf.env) contient les éléments qui vont permettre au conteneur de connaitre les informations de la machine physique (CPU).

1
2
HOST_PROC=/rootfs/proc
HOST_SYS=/rootfs/sys

Mon fichier de configuration est un bundle de mes anciens articles :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
[global_tags]
[agent]
  interval = "10s"
  round_interval = true
  metric_batch_size = 1000
  metric_buffer_limit = 10000
  collection_jitter = "0s"
  flush_interval = "10s"
  flush_jitter = "0s"
  precision = ""
  logfile = "/var/log/telegraf/telegraf.log"
  logfile_rotation_interval = "1d"
  logfile_rotation_max_size = "50MB"
  logfile_rotation_max_archives = 30
  hostname = "MonServeurDedie"
  omit_hostname = false
[[outputs.influxdb]]
  urls = ["http://influxdb:8086"]
  database = "telegraf_db"
  skip_database_creation = true
  username = "telegrafeur"
  password = "jooKaiphae7eisee"
[[inputs.cpu]]
  percpu = true
  totalcpu = true
  collect_cpu_time = false
  report_active = false
[[inputs.disk]]
  ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]
[[inputs.diskio]]
[[inputs.kernel]]
[[inputs.mem]]
[[inputs.processes]]
[[inputs.swap]]
[[inputs.system]]
[[inputs.net]]
  interfaces = ["eth0"]
  fieldpass = [ "bytes*" ]
[[inputs.netstat]]
[[inputs.docker]]
  endpoint = "unix:///var/run/docker.sock"
  gather_services = false
  source_tag = false
  container_state_include = []
  container_state_exclude = []
  timeout = "5s"
  perdevice = true
  total = false
  docker_label_include = []
  docker_label_exclude = []

Étant donné que telegrafeur ne peut pas crée la base, on verrouille la possibilité de création de la base par Telegraf avec l’option skip_database_creation mise à true.

Composition

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
  telegraf:
    image: telegraf:1.14
    container_name: telegraf
    restart: unless-stopped
    env_file:
      - /etc/telegraf/.telegraf.env
    volumes:
      - /etc/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro
      - /var/log/telegraf:/var/log/telegraf
      # For host stats
      - /sys:/rootfs/sys:ro
      - /proc:/rootfs/proc:ro
      # For docker stats
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - tig-net

Je monte aussi le socket Docker pour avoir les métriques des conteneurs.

Grafana

Configurations

Fichier .grafana.env :

1
GF_SECURITY_ADMIN_PASSWORD=ahkaob4miemuedoh3weef7izaechaiko

Composition

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: unless-stopped
    user: "0:0"
    env_file:
      - /etc/grafana/.grafana.env
    ports:
      - 3000:3000
    volumes:
      - /var/lib/grafana:/var/lib/grafana
      - /var/log/grafana:/var/log/grafana
    labels:
      - traefik.enable=true
      - traefik.port=3000
      - traefik.http.routers.grafana.rule=Host(`supervision.scrample.xyz`)
      - traefik.http.routers.grafana.tls=true
      - traefik.http.routers.grafana.tls.certresolver=mycertresolver
    networks:
      - tig-net

networks:
  tig-net:
    external:
      name: traefik-net

Il est nécessaire de spécifier l'UID:GID de l’utilisateur (l’exemple d’ici est pour l’utilisateur root) comme je l’ai fait à la ligne 5 lorsque l’on mappe un dossier non local pour les données. Sinon, on peut utiliser un volume ou un dossier local. Plus d’information ici.

Lancement

Si vous concaténez les trois configurations Docker, vous obtenez un Docker Compose complet. Comme d’habitude, on lance la stack avec docker-compose up -d.

Pour une raison inconnue, le fichier all.iql ne s’exécute pas au lancement. Cela est peut-être dû au fait que j’ai fait beaucoup d’erreurs avant d’obtenir des fichiers fonctionnels.
Pour y remédier, j’ai forcé l’exécution des éléments du dossier :

1
2
3
docker-compose exec influxdb /usr/bin/influx \
-import -path /docker-entrypoint-initdb.d/influx_init.iql/all.iql \
-username admin -password "aev3netai3vahPee"

Cette commande vous seras utile si vous ajoutez ou modifiez des droits via des fichiers dans le dossier.

Une fois la stack fonctionnel, on se connecte sur Grafana (https://supervision.scrample.xyz dans l’exemple et on ajoute les BDD avec le compte grafaneur qui a seulement un accès en lecture sur les bases.

Une fois de plus, j’ai récupéré les dashboards 4220 et 10585 que j’ai ajouté sur Grafana.

Maintenant que tous fonctionnent, on va alors s’assurer que cela est bien sécurisé.

Vérification

Mon serveur étant dans le nuage (donc exposé), je dois m’assurer que les accès sont bien sécurisés.

Pour l’HTTPS, Traefik fait bien son travail. Pour InfluxDB, on vérifie cela en faisant différents tests avec des commandes cURL depuis un autre machine.

Voici donc des exemples qui devraient fonctionner :

1
2
curl -G "https://metriques.scrample.xyz/query" -u admin:aev3netai3vahPee --data-urlencode "q=SHOW DATABASES"
curl -G "https://metriques.scrample.xyz/query?db=telegraf_db&pretty=true" -u telegrafeur:jooKaiphae7eisee --data-urlencode "q=SHOW SERIES"

J’ai aussi fait des tests qui ne devraient pas fonctionner pour m’assurer du bon verrouillage des accès à InfluxDB.

Bonus : Métriques Traefik

Pour avoir les données de Traefik, il faut ajouté le contenue suivant dans le fichier de configuration statique :

1
2
3
4
5
6
7
metrics:
  influxDB:
    address: influxdb:8086
    protocol: http
    database: "traefik_db"
    username: "traefikeur"
    password: "aip7nahd3ahcieL4"

Conclusion

Une fois encore, j’ai refait une stack TIG mais en Docker cette fois-ci ! Petit à petit, je vais renvoyer toutes mes données sur cette stack en lieu et place de celui de mon serveur à 32 GB de stockage qui est d’ailleurs bien rempli :

PROBLEM : DISK WARNING - free space: / 5430 MB (19.93% inode=77%)
Nagios

Il me manque plus qu’à créer les BDD et comptes pour Home Assistant et Nagflux et de les configurer pour envoyer leurs données dessus !

Bon monitoring !