LibreNMS : superviser son réseau avec Docker Compose ou en natif sur Ubuntu Server

Avancé 16 min de lecture 13 septembre 2026
Câbles réseau bleus étiquetés, branchés sur un switch
Photo « Switch! » par andrewfhart, via Flickr — CC BY-SA 2.0

Un switch qui sature à 3 h du matin, un lien fibre qui bascule en boucle, un onduleur qui ne le dit à personne… la supervision, c’est l’art d’apprendre les mauvaises nouvelles avant les utilisateurs. LibreNMS est une plateforme de supervision réseau libre (GPL-3) qui découvre vos équipements en SNMP, trace des graphes, alerte et cartographie votre réseau. Ce guide vous emmène de zéro à une instance reproductible, cloisonnée et maintenable, avec deux chemins au choix : Docker Compose (rapide, isolé) ou installation native sur Ubuntu Server (contrôle fin de l’OS).

Public et durée : administrateurs réseau / système à l’aise avec un terminal Linux. Comptez 1 h 30 pour Docker Compose, 2 h 30 pour l’installation native, hors intégration des équipements. Les adresses, noms et secrets sont des exemples à remplacer. Testez d’abord en préproduction.

Ce que vous allez construire

LibreNMS vit dans un VLAN de supervision dédié. Il est joignable en HTTPS depuis le VLAN d’administration, et c’est lui qui initie les sondes (SNMPv3, ICMP) vers les équipements autorisés. Aucun accès utilisateur direct aux équipements n’est induit, et les flux vers la zone OT sont filtrés au strict nécessaire.

VLAN ADMIN IT Postes des administrateurs Navigateur, SSH VLAN SUPERVISION / MANAGEMENT LibreNMS librenms01 · 10.20.50.20 Web · MariaDB · Redis · Dispatcher RÉSEAU IT Switchs, routeurs, pare-feu, serveurs, onduleurs ZONE OT / SCADA Automates, IHM, passerelles ACL strictes, jamais any/any HTTPS 443 SNMPv3 / ICMP SNMPv3 filtré (UDP 161) Les flux de supervision sont toujours initiés par LibreNMS. Autoriser au strict nécessaire, interdire any/any entre IT et OT.
Architecture de référence pour un environnement IT/OT segmenté : LibreNMS dans son VLAN, administration en HTTPS, sondes SNMPv3 vers les seuls équipements autorisés.

Docker Compose ou installation native ?

Critère Docker Compose Installation native
Mise en route Rapide : une pile versionnée (LibreNMS, MariaDB, Redis, dispatcher) Plus longue : Nginx, PHP-FPM, MariaDB, RRDtool, Net-SNMP à installer un par un
Isolation Forte : rien n’est installé sur l’OS hôte Faible : tout vit sur l’OS
Mises à jour docker compose pull puis up -d Mise à jour automatique quotidienne par LibreNMS (daily.sh) + paquets de l’OS
Réglages fins Via variables d’environnement et fichiers montés Contrôle total (PHP, SNMP, cron, systemd)
Surface de maintenance Réduite, mais il faut protéger .env et les volumes Plus large : plus de composants à suivre
Recommandé pour Labo, PME, première mise en production Équipes qui veulent maîtriser chaque brique

Sécurité et NIS2 : appliquez le principe du moindre privilège, la traçabilité des actions d’administration, la gestion des vulnérabilités, une restauration testée et la séparation IT/OT. SNMPv2c reste utile pour un diagnostic ponctuel, mais SNMPv3 authPriv (authentification + chiffrement) est le choix de production.

1. Architecture et prérequis

Dimensionnement

Ressource Labo Production de départ
CPU / RAM 2 vCPU / 4 Go 4 vCPU / 8 Go
Disque 40 Go 100 à 200 Go, sur SSD (les fichiers RRD des graphes font beaucoup d’écritures)
Réseau 1 Gbit/s IP fixe + DNS + NTP
Périmètre Jusqu’à 25 équipements Environ 100 équipements ; ajustez selon le nombre de ports et la rétention

Plan d’adressage d’exemple

Hostname : librenms01
IP       : 10.20.50.20/24
Gateway  : 10.20.50.1
DNS      : 10.20.10.10
FQDN     : librenms01.infra.local
Timezone : Europe/Paris

Flux réseau à autoriser

Flux Source Destination Port / protocole
Administration VLAN Admin LibreNMS TCP 443 (TCP 22 si nécessaire)
Polling LibreNMS Équipements IT/OT autorisés UDP 161 SNMPv3 ; ICMP
Traps (optionnel) Équipements LibreNMS UDP 162
Alertes LibreNMS Relais SMTP TCP 587 ou 465
Services LibreNMS DNS / NTP UDP/TCP 53 ; UDP 123

Un NTP fiable n’est pas un luxe : SNMPv3 tolère mal les horloges désynchronisées, et un graphe daté de travers ne sert à rien.

2. Déploiement via Docker Compose

Cette option regroupe LibreNMS, MariaDB, Redis, le dispatcher (polling) et un relais SMTP (msmtpd) dans une pile versionnée, à partir de l’exemple officiel du projet librenms/docker. Elle simplifie l’isolation, la mise à jour et la restauration, à condition de protéger le fichier .env et les volumes persistants.

2.1 Préparer Ubuntu et Docker

# Mise à jour de l'OS
sudo apt update
sudo apt full-upgrade -y

# Outils de base
sudo apt install -y ca-certificates curl wget unzip nano openssl

# Fuseau horaire
sudo timedatectl set-timezone Europe/Paris

# Docker et Compose v2 depuis les dépôts Ubuntu
sudo apt install -y docker.io docker-compose-v2
sudo systemctl enable --now docker

# Autoriser le compte courant, puis ouvrir une NOUVELLE session
sudo usermod -aG docker "$USER"
docker --version
docker compose version

2.2 Récupérer l’exemple officiel et préparer les secrets

sudo mkdir -p /opt/librenms-docker
sudo chown "$USER":"$USER" /opt/librenms-docker
cd /opt/librenms-docker
wget https://github.com/librenms/docker/archive/refs/heads/master.zip
unzip master.zip
cp -a docker-master/examples/compose/. .

# Vérifier les fichiers présents : compose.yml, .env, librenms.env, msmtpd.env
ls -la

# Générer un secret long ; le conserver dans un coffre de mots de passe
openssl rand -base64 36
nano .env
chmod 600 .env

Dans .env, définissez au minimum TZ=Europe/Paris, MYSQL_DATABASE=librenms, MYSQL_USER=librenms et un MYSQL_PASSWORD aléatoire (remplacez la valeur d’exemple livrée avec le dépôt). PUID/PGID doivent correspondre à l’utilisateur propriétaire du dossier (id -u, id -g). Le relais mail se configure dans msmtpd.env.

Ne déposez jamais .env dans un dépôt public, ni dans un ticket, ni dans une capture d’écran. C’est la clé de votre base de données.

2.3 Valider puis démarrer la pile

# Vérification de la syntaxe et des variables Compose
docker compose config

# Télécharger les images avant le démarrage
docker compose pull

# Démarrer en arrière-plan
docker compose up -d

# Vérifier l'état des services
docker compose ps

# Suivre les journaux pendant le premier démarrage (Ctrl+C pour sortir)
docker compose logs -f
Sortie de docker compose ps : conteneurs librenms, librenms_db, librenms_dispatcher, librenms_msmtpd et librenms_redis en état Up
Après docker compose up -d, tous les services doivent être Up. Le port 8000 n’est publié que par le conteneur librenms. (Capture console reconstituée à partir des commandes du tutoriel — sortie d’exemple.)

Repère visuel : la pile de services

Service Rôle Donnée à préserver
librenms Interface web, API et application Configuration et fichiers applicatifs (./librenms)
db (MariaDB) Base de données Dump SQL (./db)
redis Cache et sessions Recréable ; ce n’est pas une sauvegarde
dispatcher Polling périodique Configuration de la pile
msmtpd Relais SMTP pour les alertes msmtpd.env
syslogng / snmptrapd Optionnels : journaux et traps Journaux si activés

2.4 Première connexion et validation

Ouvrez http://10.20.50.20:8000 et créez le compte administrateur. En production, publiez l’interface derrière un reverse proxy HTTPS et limitez l’accès au VLAN Admin.

Tableau de bord LibreNMS : carte de disponibilité, résumé des équipements, top CPU et mémoire, alertes et journal d'événements
Le tableau de bord LibreNMS une fois les équipements ajoutés : carte de disponibilité, résumé des équipements et des ports, top CPU/mémoire, alertes et journal d’événements. Capture issue de la documentation officielle LibreNMS — licence GPL-3.0
# Validation applicative depuis le conteneur
docker compose exec --user librenms librenms php validate.php

# Contrôles complémentaires
docker compose ps
docker compose logs --tail=100 librenms
docker compose logs --tail=100 db
Sortie de validate.php : connexion base de données OK, schéma correct, avertissement IPv6
Résultat attendu de validate.php : connexion MariaDB valide, schéma correct, aucun [FAIL]. Un [WARN] sur IPv6 est normal si vous ne supervisez pas d’équipements IPv6. (Capture console reconstituée d’après la sortie documentée par le projet.)
Page de validation de l'interface web LibreNMS : chaque composant affiche Ok ou Warning
La même validation existe dans l’interface web (menu ⚙ > Validate Config) : chaque composant doit afficher Ok. Capture issue de la documentation officielle LibreNMS — licence GPL-3.0

3. Installation native sur Ubuntu Server

L’installation native place Nginx, PHP-FPM, MariaDB, RRDtool, Net-SNMP et les tâches LibreNMS directement sur l’OS. Elle facilite certains réglages système mais augmente la surface de maintenance. Les commandes ci-dessous suivent la procédure officielle (onglet Ubuntu 24.04 / NGINX) et s’exécutent en root.

Version de PHP : Ubuntu 24.04 ne fournit pas une version de PHP assez récente pour LibreNMS, d’où le dépôt tiers Sury. Au moment de la rédaction, la documentation officielle indique PHP 8.5 recommandé (8.4 minimum). Vérifiez la version attendue sur docs.librenms.org avant de figer les commandes : adaptez 8.5 partout ci-dessous si nécessaire.

3.1 Paquets et PHP

sudo -i
apt update
apt full-upgrade -y
apt install -y lsb-release ca-certificates curl

# Dépôt Sury (PHP récent pour Ubuntu 24.04)
curl -sSLo /tmp/debsuryorg-archive-keyring.deb https://packages.sury.org/debsuryorg-archive-keyring.deb
dpkg -i /tmp/debsuryorg-archive-keyring.deb
echo "deb [signed-by=/usr/share/keyrings/debsuryorg-archive-keyring.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
apt update

apt install -y acl curl fping git mariadb-client mariadb-server mtr-tiny nginx-full nmap \
  php8.5-cli php8.5-curl php8.5-fpm php8.5-gd php8.5-gmp php8.5-mbstring php8.5-mysql \
  php8.5-snmp php8.5-xml php8.5-zip python3-command-runner python3-dotenv python3-pip \
  python3-psutil python3-pymysql python3-redis python3-setuptools python3-systemd \
  rrdtool snmp snmpd traceroute unzip whois

php -v

3.2 Utilisateur, code et permissions

useradd librenms -d /opt/librenms -M -r -s "$(which bash)"
cd /opt
git clone https://github.com/librenms/librenms.git
chown -R librenms:librenms /opt/librenms
chmod 771 /opt/librenms
setfacl -d -m g::rwx /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache /opt/librenms/storage
setfacl -R -m g::rwx /opt/librenms/rrd /opt/librenms/logs /opt/librenms/bootstrap/cache /opt/librenms/storage

# Dépendances PHP, en tant qu'utilisateur librenms
su - librenms
./scripts/composer_wrapper.php install --no-dev
exit

Derrière un proxy d’entreprise, le composer wrapper peut échouer : installez alors Composer manuellement (wget https://getcomposer.org/composer-stable.phar, puis déplacez-le dans /usr/bin/composer et rendez-le exécutable).

3.3 Fuseau horaire, MariaDB et PHP-FPM

# Fuseau horaire : dans les deux php.ini, régler date.timezone = Europe/Paris
nano /etc/php/8.5/fpm/php.ini
nano /etc/php/8.5/cli/php.ini
timedatectl set-timezone Europe/Paris

# MariaDB : ajouter sous [mysqld] dans /etc/mysql/mariadb.conf.d/50-server.cnf
#   innodb_file_per_table=1
#   lower_case_table_names=0
nano /etc/mysql/mariadb.conf.d/50-server.cnf
systemctl enable mariadb
systemctl restart mariadb
mysql -u root
CREATE DATABASE librenms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'librenms'@'localhost' IDENTIFIED BY 'MOT_DE_PASSE_COMPLEXE';
GRANT ALL PRIVILEGES ON librenms.* TO 'librenms'@'localhost';
exit
# PHP-FPM : un pool dédié
cp /etc/php/8.5/fpm/pool.d/www.conf /etc/php/8.5/fpm/pool.d/librenms.conf
nano /etc/php/8.5/fpm/pool.d/librenms.conf
#   [librenms]                 (à la place de [www])
#   user = librenms
#   group = librenms
#   listen = /run/php-fpm-librenms.sock
systemctl restart php8.5-fpm

3.4 Nginx, ligne de commande lnms et tâches planifiées

nano /etc/nginx/conf.d/librenms.conf
server {
    listen 80;
    server_name librenms01.infra.local;
    root /opt/librenms/html;
    index index.php;
    charset utf-8;
    gzip on;
    gzip_types text/css application/javascript text/javascript application/x-javascript image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon;
    location / { try_files $uri $uri/ /index.php?$query_string; }
    location ~ [^/]\.php(/|$) {
        fastcgi_pass unix:/run/php-fpm-librenms.sock;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include fastcgi.conf;
    }
    location ~ /\.(?!well-known).* { deny all; }
}
# Désactiver le site par défaut, tester puis recharger
rm /etc/nginx/sites-enabled/default
nginx -t
systemctl restart nginx

# Commande lnms + complétion
ln -s /opt/librenms/lnms /usr/bin/lnms
cp /opt/librenms/misc/lnms-completion.bash /etc/bash_completion.d/

# Cron, scheduler systemd et rotation des journaux
cp /opt/librenms/dist/librenms.cron /etc/cron.d/librenms
cp /opt/librenms/dist/librenms-scheduler.service /opt/librenms/dist/librenms-scheduler.timer /etc/systemd/system/
systemctl daemon-reload
systemctl enable --now librenms-scheduler.timer
cp /opt/librenms/misc/librenms.logrotate /etc/logrotate.d/librenms

Terminez l’assistant sur http://10.20.50.20/install (base de données, compte administrateur). Si l’assistant vous demande de créer config.php, copiez le contenu affiché puis chown librenms:librenms /opt/librenms/config.php. Vérifiez ensuite la configuration générée, les droits et l’état du timer : systemctl status librenms-scheduler.timer, puis sudo -u librenms php /opt/librenms/validate.php.

4. SNMPv3 Cisco et ajout d’équipements

Règle d’or : testez le SNMP depuis le serveur LibreNMS avant de soupçonner l’application. L’identité SNMPv3, les algorithmes et les secrets doivent correspondre exactement entre l’équipement et LibreNMS.

4.1 Configuration Cisco IOS-XE de référence

configure terminal
ip access-list standard ACL-SNMP-LIBRENMS
 permit host 10.20.50.20
 deny any log
exit
snmp-server view LIBRENMS-VIEW iso included
snmp-server group LIBRENMS-GRP v3 priv read LIBRENMS-VIEW access ACL-SNMP-LIBRENMS
snmp-server user librenms LIBRENMS-GRP v3 auth sha AUTHENTICATION_SECRET priv aes 128 CHIFFREMENT_SECRET
end
write memory

En production : conservez les secrets dans un coffre, limitez la vue SNMP au besoin réel si votre politique l’impose, et vérifiez que l’ACL est appliquée sur l’interface ou le VRF approprié. Notez que snmp-server user n’apparaît pas dans show running-config : c’est normal, utilisez show snmp user.

4.2 Tester SNMPv3 depuis LibreNMS

snmpwalk -v3 -l authPriv -u librenms \
  -a SHA -A 'AUTHENTICATION_SECRET' \
  -x AES -X 'CHIFFREMENT_SECRET' \
  10.20.10.21 1.3.6.1.2.1.1
Sortie de snmpwalk SNMPv3 : sysDescr, sysObjectID, sysUpTime, sysContact, sysName et sysLocation d'un switch Cisco
Résultat attendu : sysDescr, sysObjectID, sysUpTime et sysName. Un timeout indique presque toujours un problème de routage, d’ACL, d’UDP 161, de VRF, de secret ou d’horloge. (Capture console reconstituée — sortie d’exemple.)

4.3 Ajouter l’équipement dans LibreNMS

Chemin : Devices > Add Device. Renseignez :

Champ Valeur d’exemple
Hostname / IP 10.20.10.21
Version SNMP v3
Niveau authPriv
Utilisateur librenms
Auth / Priv SHA / AES
Port 161/UDP
Formulaire Add Device de LibreNMS : hostname, SNMP activé, version, mode d'association des ports
Le formulaire Add Device. Sur cette capture de la documentation, la version est v2c avec une communauté : choisissez v3 dans la liste pour faire apparaître les champs utilisateur, niveau authPriv, algorithmes et secrets. Laissez Force add sur OFF : LibreNMS vérifie d’abord la joignabilité ping/SNMP. Capture issue de la documentation officielle LibreNMS — licence GPL-3.0

Après l’ajout, attendez le premier polling (5 minutes par défaut), puis vérifiez l’état de disponibilité, les ports, les graphes et les alertes.

5. Exploitation : validation, sauvegarde, mise à jour

5.1 Checklist de validation

  • DNS / NTP — résolution du FQDN et heure synchronisée (timedatectl)
  • Services — docker compose ps ou systemctl --failed
  • Web — connexion HTTPS depuis le VLAN Admin uniquement
  • Base — validate.php sans erreur
  • SNMP — snmpwalk v3 réussi depuis LibreNMS
  • Polling — dernière collecte récente sur chaque équipement
  • Alertes — test d’une règle et réception d’un e-mail via le relais SMTP
  • Restauration — dump restauré dans un environnement isolé, au moins une fois
Collection de règles d'alerte prêtes à l'emploi dans LibreNMS : device down, reboot, port down, utilisation de port, capteurs
Pour tester les alertes, piochez dans la Alert rule collection (Alerts > Alert Rules > Load from Collection) : « Devices up/down », « Port status up/down » ou « Sensor over limit » suffisent pour démarrer. Capture issue de la documentation officielle LibreNMS — licence GPL-3.0

5.2 Sauvegarde (Docker)

sudo mkdir -p /backup/librenms
cd /opt/librenms-docker

# Dump SQL (adapter le nom du conteneur si docker compose ps affiche autre chose)
docker exec librenms_db sh -c 'mariadb-dump -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE"' \
  > /backup/librenms/librenms-$(date +%F).sql

# Données persistantes, configuration et RRD
sudo tar -czf /backup/librenms/librenms-data-$(date +%F).tar.gz /opt/librenms-docker

# Vérifier taille et présence des archives
ls -lh /backup/librenms

Chiffrez les sauvegardes au repos, copiez-les vers un emplacement séparé, appliquez une rétention et testez régulièrement une restauration. Les RRD sont volumineux mais précieux (tout l’historique des graphes) ; Redis est recréable. Relisez au besoin la règle 3-2-1.

5.3 Mise à jour (Docker)

cd /opt/librenms-docker
# 1. Vérifier qu'une sauvegarde récente existe
# 2. Récupérer les nouvelles images
docker compose pull
# 3. Recréer les services
docker compose up -d
# 4. Vérifier l'état et la validation
docker compose ps
docker compose exec --user librenms librenms php validate.php

Évitez docker compose down hors fenêtre de maintenance et sans sauvegarde vérifiée. Lisez les notes de version et validez d’abord sur une instance de test lorsque la version majeure change.

5.4 Mise à jour (native)

Par défaut, LibreNMS se met à jour tout seul chaque nuit via le script daily.sh lancé par le cron installé à l’étape 3.4 (désactivable avec lnms config:set update false). Pour forcer une mise à jour manuelle :

su - librenms
cd /opt/librenms
./daily.sh
php validate.php
exit

N’oubliez pas les paquets de l’OS (apt update && apt full-upgrade) et redémarrez php8.5-fpm et nginx après une mise à jour de PHP.

6. Dépannage rapide

Symptôme Vérifications prioritaires
Page web inaccessible IP, DNS, port publié, nginx -t ou docker compose ps, pare-feu local
Timeout SNMP Route, ACL, UDP 161, VRF, IP source, secrets et heure NTP
Polling absent Dispatcher actif, timer/cron, logs LibreNMS, taille de file et charge CPU
Erreur base État MariaDB, variables .env, droits, espace disque, journaux db
Graphes vides RRD accessibles en écriture, polling exécuté, fuseau horaire cohérent
Alertes non reçues Configuration SMTP, relais, DNS, journaux et test vers une boîte de test
Disque plein du -xh, rétention des logs, RRD, sauvegardes externes et rotation

Commandes de diagnostic

# Docker
docker compose ps
docker compose logs --tail=200 librenms
docker compose logs --tail=200 dispatcher
docker system df
df -h

# Natif
systemctl --failed
systemctl status nginx php8.5-fpm mariadb librenms-scheduler.timer snmpd
journalctl -u librenms-scheduler.timer --since today
tail -n 100 /opt/librenms/logs/librenms.log
df -h

# Réseau et SNMP
ip route
ss -lntup
snmpwalk -v3 -l authPriv -u librenms -a SHA -A 'AUTH' -x AES -X 'PRIV' 10.20.10.21 1.3.6.1.2.1.1
Onglet Capture Debug Information d'un équipement LibreNMS : boutons Run, Copy, Download pour Discovery, Poller, SNMP et Alerts
Pour un équipement précis, l’onglet ⚙ > Capture de sa fiche rejoue la découverte, le polling ou le SNMP en mode debug, directement depuis l’interface. Pratique pour joindre un diagnostic à un ticket. Capture issue de la documentation officielle LibreNMS — licence GPL-3.0

Ne partagez jamais les secrets dans la sortie d’un ticket : masquez mots de passe, jetons et chaînes de communauté avant tout partage (y compris dans les captures de debug ci-dessus).

7. Checklist de mise en production

  • Réseau — VLAN supervision dédié ; ACL par équipement ; aucun any/any IT-OT
  • Identité — compte admin nominatif, MFA ou contrôle équivalent si disponible, droits minimaux
  • Chiffrement — HTTPS ; SNMPv3 authPriv ; secrets dans un coffre
  • Journalisation — logs applicatifs et d’administration conservés et surveillés
  • Résilience — sauvegarde SQL + données + configuration ; copie séparée ; restauration testée
  • Maintenance — fenêtre de mise à jour, notes de version, procédure de retour arrière
  • Conformité — inventaire, analyse de risque, gestion des vulnérabilités et preuves de contrôle, en cohérence avec NIS2
Carte réseau générée par LibreNMS : nœuds reliés par leurs liens découverts
La récompense : une fois les équipements ajoutés, LibreNMS dessine la carte de votre réseau à partir des liens découverts (LLDP/CDP). Capture issue de la documentation officielle LibreNMS — licence GPL-3.0

Sources