Allez, hop, je me sens d’humeur superviseuse ce dimanche ! Installons donc un node exporter pour notre serveur Proxmox, histoire de pouvoir envisager une supervision à long terme et du capacity planning sur ce petit vLab Proxmox !
Histoire de vous présenter mon setup actuel, sachez que j’ai déjà un petit couple Grafana/Prometheus qui me sert pour d’autres choses. Chacun est déployé via des manifests docker-compose relativement simples sur lesquels je vais m’appuyer.
Voici un petit schéma synoptique de l’installation et de ce que je vais vous présenter. C’est relativement simple, mais c’estmieux en le présentant ^^.

Voici le docker-compose de grafana et prometheus :
|
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 |
services: prometheus: image: prom/prometheus container_name: prometheus restart: unless-stopped user: 502:20 ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro - ./data:/prometheus - ./logs:/var/log/prometheus labels: - "traefik.enable=true" - "traefik.http.services.prometheus.loadbalancer.server.port=9090" - "traefik.http.services.prometheus.loadbalancer.server.scheme=http" - "traefik.http.routers.prometheus.entrypoints=websecure" - "traefik.http.routers.prometheus.rule=Host(`prometheus.home.naoned.net`)" - "traefik.http.routers.prometheus.tls=true" - "traefik.http.routers.prometheus.tls.certresolver=production" - "traefik.http.routers.prometheus.tls.domains[0].main=prometheus.home.naoned.net" networks: - traefik-net grafana: image: grafana/grafana:latest container_name: grafana restart: unless-stopped user: 501:20 volumes: - ./grafana:/var/lib/grafana ports: - 4000:3000 networks: - traefik-net labels: - "traefik.enable=true" - "traefik.http.services.grafana.loadbalancer.server.port=3000" - "traefik.http.services.grafana.loadbalancer.server.scheme=http" - "traefik.http.routers.grafana.entrypoints=websecure" - "traefik.http.routers.grafana.rule=Host(`grafana.home.naoned.net`)" - "traefik.http.routers.grafana.tls=true" - "traefik.http.routers.grafana.tls.certresolver=production" - "traefik.http.routers.grafana.tls.domains[0].main=grafana.home.naoned.net" networks: traefik-net: external: true |
La description est relativement simple :
Ce fichier docker-compose.yml déploie les deux services grafana et prometheus pour le monitoring. Les deux conteneurs s’exécutent en mode unless-stopped pour une disponibilité continue, avec des utilisateurs dédiés (502:20 et 501:20) afin de gérer les permissions sur les volumes montés.
Prometheus expose son interface sur le port 9090, avec une configuration personnalisée via prometheus.yml et des données persistantes stockées dans ./data et ./logs. Grafana, accessible sur le port 4000 (mappé depuis le 3000 du conteneur), utilise un volume local pour sauvegarder ses dashboards et configurations.
Les deux services sont intégrés à Traefik comme reverse proxy, avec des règles TLS automatiques pour sécuriser les accès via les domaines prometheus.home.naoned.net et grafana.home.naoned.net. Le réseau traefik-net, défini comme externe, permet la communication entre les conteneurs et Traefik, qui gère le routage HTTPS et les certificats SSL.
Accesoirement, si vous voulez les fichiers de configuration de Traefik, dites-le moi, je la posterai en commentaire.
Je déploie le Node exporter sur un conteneur externe au Proxmox pour plus de simplicité et de sécurité entre celui-ci et le process. Accessoirement, ça évite aussi de déployer l’exporter sur chaque node proxmox, mais si je n’en ai qu’un seul actuellement 🙂
Voici le petit docker-compose. Ici, pas besoin de tls, cela reste un lab 😉
|
1 2 3 4 5 6 7 8 9 10 11 |
# docker run --init --name prometheus-pve-exporter -d -p 127.0.0.1:9221:9221 -v /path/to/pve.yml:/etc/prometheus/pve.yml prompve/prometheus-pve-exporter services: proxmox-prometheus-exporter: image: prompve/prometheus-pve-exporter container_name: proxmox-prometheus-exporter restart: unless-stopped volumes: - ./pve.yml:/etc/prometheus/pve.yml:ro ports: - 9221:9221 |
Le vous ai laissé la commande docker originale donnt je me suis inspiré. Voici par ailleurs le fichier de configuration du Node Exporter qui pemet d’indiquer les crédentials à utiliser. Le mieux c’est d’utiliser des tokens mais encore une fois, je suis en mode Lab, donc pas trop de risque dans ce cas précis.
|
1 2 3 4 |
default: user: prometheus@pve password: XXXXXXXXX verify_ssl: false |
J’ai créé un compte prometheus dans le Proxmox pour pouvoir isoler les permissions. Nous avons presque terminé. Il reste à enrichir la configuration de prometheus pour qu’il utilise ce node exporter pour aller poller les métrics du host Proxmox. Voici ce que j’ai ajouté, conformément à la documentation :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
scrape_configs: - job_name: 'lancelot' static_configs: - targets: - lancelot.home.naoned.net metrics_path: /pve params: module: @@default@@ cluster: @@'1'@@ node: @@'1'@@ relabel_configs: - source_labels: @@__address__@@ target_label: __param_target - source_labels: @@__param_target@@ target_label: instance - target_label: __address__ replacement: 172.16.16.17:9221 |
Mon extension « crayon highlighting » bug sur la partie relabeling, du coup remplacez tous les @@ par des crochets ouvrant et fermant … désolé pour cela.
Cette section scrape_configs définit un job de scraping dédié à la collecte de métriques depuis un hôte Proxmox VE (via le node exporter). Prometheus interroge directement l’adresse interne 172.16.16.17 sur le port 9221 (grâce à relabel_configs) pour aller utiliser le node exporter. Vous suivez ^^ ?
N’hésitez pas à aller consulter la doc, assez bien faite et que j’ai utilisé.
Au final, la chaine se connecte rapidement et au bou de quelques dizaines de minutes, j’obtient ce type de graph (en important le graph par défaut prometheus/proxmox sur le site des dashboard Grafana) :


Node exporter prometheus pour Proxmox : https://github.com/prometheus-pve/prometheus-pve-exporter
