monit
Monit
Monit est un chouette petit outils pour surveiller un serveur. J'ai créé cette page juste pour conserver et partager un exemple de fichier de configuration et les commandes de base. Je ne vais pas entrer dans le détail de toutes les options possible (comme le mini-serveur web dashboard intégré).
- Site officiel : https://mmonit.com/monit/
- Pour faire court: Monit est un service sous forme d'un simple exécutable qui se réveille toutes les X minutes (2 par défaut) pour faire un ensemble de vérification et effectuer des actions. Les fichiers de configuration sont assez lisibles.
- Exemples de vérifications: espace disque libre, CPU/mémoire/trafic réseau d'un processus au dessus/en dessous d'un seuil, processus plus en mémoire, fichier ou répertoire modifié, résultat d'une commande, vérifier qu'un service répond sur un port, vérifier qu'il répond avec le bon contenu, vérifier la date d'expiration d'un certificat, vérifier qu'un interface réseau répond…
- Exemple d'actions : arrêter/relancer un service, lancer une commande, envoyer une alerte…
- Installation:
sudo apt install monit
- Premier lancement (cela va créer le service) :
sudo monit
- Vos fichiers de config (sous Debian) sont à placer dans le répertoire
/etc/monit/conf.d/
- Vérifier la syntaxe des fichiers de config :
sudo monit -t
- Prendre en compte les modifications du fichier de config :
sudo monit reload
- Réveiller Monit :
sudo monit
- Arrêter la surveillance :
sudo monit quit
Dans les actions, au lieu d'utiliser la commande alert
(qui envoie un mail), j'ai préféré lancer un script shell à moi (sebnotif
) qui utilise apprise pour m'envoyer l'alerte sur un bot Telegram.
Je ne vais pas détailler les choix que j'ai fait pour chaque chose à surveiller ni la syntaxe utilisée. Je vous laisse explorer la documentation de Monit.
Voici un exemple de fichier de config:
# Vérification de l'espace libre sur disque. check filesystem NAS-nvme-free with path / every 7 cycles if space free < 4 GB then exec "/usr/local/bin/sebnotif ""Espace libre sur / inférieur à 4 Go.""" # Santé des disques: check program NAS-hdd-SMART with path "/usr/bin/bash -c 'sudo smartctl -H /dev/sda'" every 7 cycles if content != "result: PASSED" then exec "/usr/local/bin/sebnotif ""Alerte SMART HDD""" # On pourrait également surveiller d'autres paramètres SMART comme: # sudo smartctl /dev/sda -A # Regarder: # 5 Reallocated_Sector_Ct # 194 Temperature_Celsius # Vérifier que l'IP publique n'a pas changé. check program NAS-IP-publique with path "/usr/bin/curl -s https://api.ipify.org" if content != "90\.91\.92\.93" for 3 cycles then exec "/usr/local/bin/sebnotif ""L'adresse IP publique a changé.""" # On vérifie que l'IP du LAN n'a pas changé. check program NAS-IP-LAN with path "/usr/bin/hostname --all-ip-addresses" if content != "192\.168\.1\.33" for 3 cycles then exec "/usr/local/bin/sebnotif ""L'adresse IP du LAN a changé.""" # On vérifie que le serveur web répond, et avec le bon contenu. # (On pourrait prendre comme action de redémarrer Apache, par exemple. Là on envoie juste une alerte) check host NAS-Apache with address monordi.mywire.org if failed port 11533 protocol https and status = 200 and request "/" with content = "Bienvenue à la maison" for 3 cycles then exec "/usr/local/bin/sebnotif ""monordi.mywire.org est injoignable.""" # Notez que le test va considérer qu'il y a un problème si la résolution de nom échoue, même sur le serveur web lui-même marche bien. # Attention "content = " est piégeux : Il signifie en fait "contient" # Et n'oubliez jamais les espaces devant et derrière le signe égale et les autres opérateurs. Monit l'exige. # Autre manière de vérifier un service web : avec curl. # On vérifie qu'un serveur web (qui exige un login/mot de passe) répond bien avec le bon contenu. # On fait un premier "grep" pour réduire la quantité de données que Monit va vérifier (par défaut Monit lit les 512 premiers octets de la sortie des programmes). check program VPS-page-accueil with path "/usr/bin/bash -c ""/usr/bin/curl -s -u utilisateur:monmotdepasse 'https://monseveur.mywire.org/' | grep vital""" if content != "Il est donc vital" for 15 cycles then exec "/usr/local/bin/sebnotif ""Le serveur le répond pas correctement.""" # Même chose pour Jellyfin : S'il ne répond pas, on le redémarre de force. check host jellyfin with address 192.168.1.29 if failed port 8097 protocol http and request "/web/" with content = "Jellyfin" for 2 cycles then exec "/usr/bin/systemctl restart jellyfin.service" # On vérifie l'expiration du certificat (toutes les 12 heures : 1 cycles = 2 minutes par défaut. Donc 360 cycles = 12 heures) check host NAS-certificat with address monordi.mywire.org every 360 cycles if failed port 11533 with protocol https and certificate valid > 7 days use ssl options {verify: enable} then exec "/usr/local/bin/sebnotif ""Apache: Le certificat expire dans moins de 7 jours.""" # Recevoir une alerte si certains fichiers de config sont modifiés: check file apache-conf4 with path /etc/apache2/sites-enabled/webdav-vps.conf if changed checksum then exec "/usr/local/bin/sebnotif ""Fichier config apache modifié (sites-enabled) : webdav-vps.conf""" # Vérifier qu'une page n'est *PAS* accessible sans login/mot de passe: check program VPS-noauth with path "/usr/bin/curl -s 'https://monserveur.mywire.org/privé'" if content != "401 Unauthorized" for 3 cycles then exec "/usr/local/bin/sebnotif ""Le serveur est accessible sans login/mot de passe !""" # Notez que cette alerte se déclenchera aussi si le serveur n'est pas accessible du tout (arrêté). # Donc attention à bien comprendre les tests que vous mettez en place et les fausses alertes. # Vérifier que mon Shaarli répond bien : check host sebsauvage.net-shaarli with address sebsauvage.net if failed port 443 protocol https and status = 200 and request "/links/?searchterm=SPOILER+PORTAL+2" with content = "GLADOS" for 7 cycles then exec "/usr/local/bin/sebnotif ""🌐sebsauvage.net : Shaarli ne répond pas.""" # Vérifier qu'Apache répond bien, et le redémarrer si ce n'est pas le cas: check process apache-service with pidfile /var/run/apache2/apache2.pid restart program = "/usr/sbin/apachectl restart" # NextCloud: if failed port 443 protocol https and status = 200 and request "/nextcloud/login" then restart # Je vérifie que mon service webdav Apache répond bien: if failed port 8443 protocol https and status = 200 and request "/Jeux/OST/" with content = "Minecraft" then restart # Je vérifie que le reverse-proxy https pour Jellyfin fonctionne bien: if failed port 9443 protocol https and status = 200 and request "/web/" with content = "Jellyfin" for 2 cycles then restart
Notes
- Parfois dans le
then
on aimerait effectuer plusieurs actions. Ce n'est pas possible avec Monit. Dans ce cas, écrivez un script shell qui fait les différentes actions que vous souhaitez (par exemple redémarrer un service puis envoyer une alerte) puis lancez ce script avec unexec
.
monit.txt · Dernière modification : 2025/03/20 09:25 de sebsauvage