LibreNMS : superviser son réseau avec Docker Compose ou en natif sur Ubuntu Server
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.
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

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.

# 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

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.)
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

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 |

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.0Aprè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 psousystemctl --failed - Web — connexion HTTPS depuis le VLAN Admin uniquement
- Base —
validate.phpsans erreur - SNMP —
snmpwalkv3 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

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

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

Sources
- Documentation officielle — Install LibreNMS (versions de PHP, paquets, permissions, Nginx, scheduler)
- Dépôt librenms/docker — image officielle, exemple Compose, commande de validation
- Documentation officielle — Updating
- Documentation officielle — SNMP Configuration Examples