Monitoring et notifications Ntfy sur Alpine
Introduction
Cet article couvre la mise en place d'un système complet de monitoring en prenant l'exemple d'un usage NAS basique sous Alpine Linux 3.23, avec envoi de notifications push via ntfy.sh. L'objectif est de recevoir des alertes en temps réel sur smartphone et navigateur en cas de problème : erreurs SMART, espace disque critique, services arrêtés, RAID dégradé, tentatives d'intrusion SSH, etc.
Toutes les alertes sont acheminées gratuitement via le service ntfy.sh, sans avoir besoin d'héberger son propre serveur de notifications.
Mise en place de Ntfy.sh
Principe
Ntfy.sh est un service de notifications push gratuit. Le serveur envoie des messages via curl vers un sujet (topic) sur ntfy.sh, et toute personne abonnée à ce sujet reçoit la notification instantanément.
Prérequis
- Créer un compte sur ntfy.sh
- Installer l'application Ntfy sur smartphone (Android / iOS)
- S'abonner à un sujet : créer un nom complexe pour le monitoring et le noter.
Exemple de sujet : Evziniljglijg401bvlinz/em> - Sur le smartphone : dans l'application Ntfy, ajouter le sujet (+) et entrer le même nom
Installation et test sur le serveur
# Installer curl
apk add curl
# Tester l'envoi d'une notification
TOPIC="Evziniljglijg401bvlinz"
curl -d "Coucou" ntfy.sh/"$TOPIC"
Le message sera reçu sur le navigateur web (si les notifications sont autorisées) et sur le smartphone.
Monitoring SMART des disques
Installation de smartmontools
apk add smartmontools curl
Script d'alerte SMART
Ce script est appelé automatiquement par smartd lorsqu'une erreur SMART est détectée sur un disque. Il envoie immédiatement une notification avec le nom du disque et la nature du problème.
TOPIC="Evziniljglijg401bvlinz"
mkdir -p /usr/local/sbin
cat << EOF > /usr/local/sbin/smart-alert
#!/bin/sh
# Alerte SMART via ntfy
MESSAGE="⚠️ Alerte SMART sur \$(hostname)
Disque: \$SMARTD_DEVICE
Problème: \$SMARTD_MESSAGE"
curl -s -d "\$MESSAGE" ntfy.sh/"$TOPIC"
EOF
chmod +x /usr/local/sbin/smart-alert
Configuration de smartd
Configurer smartd pour surveiller les disques du RAID et appeler le script d'alerte en cas de problème. Les seuils de température sont définis à 45°C (avertissement) et 50°C (critique).
(Adapter les noms de disques /dev/vdb, /dev/vdc, etc. à votre configuration)
cat << 'EOF' > /etc/smartd.conf
/dev/vdb -a -o on -S on -W 4,45,50 -m @smart-alert -M exec /usr/local/sbin/smart-alert
/dev/vdc -a -o on -S on -W 4,45,50 -m @smart-alert -M exec /usr/local/sbin/smart-alert
EOF
# Activer et démarrer le service
rc-update add smartd default
rc-service smartd restart
rc-service smartd status
Test de la notification SMART
SMARTD_DEVICE="/dev/vdc" SMARTD_MESSAGE="Test secteurs défectueux" /usr/local/sbin/smart-alert
À partir de maintenant, les erreurs SMART détectées seront immédiatement envoyées en tant que notifications push.
Script central d'envoi de notifications
Avant de créer les différents scripts de monitoring, il faut mettre en place un script central que tous les autres utiliseront pour envoyer des notifications via ntfy.
TOPIC="Evziniljglijg401bvlinz"
cat << EOF > /usr/local/sbin/ntfy-send
#!/bin/sh
TOPIC="$TOPIC"
curl -s -d "\$1" ntfy.sh/\$TOPIC
EOF
chmod +x /usr/local/sbin/ntfy-send
Tous les scripts suivants utilisent /usr/local/sbin/ntfy-send pour envoyer leurs alertes. Le message est passé en premier argument.
Scripts de monitoring
Chaque script surveille un aspect spécifique du système. Ils utilisent un système de seuils avec deux niveaux : 🟠 AVERTISSEMENT et 🔴 CRITIQUE.
Alerte espace disque
Surveille l'utilisation de /mnt/data avec un seuil d'avertissement à 70% et critique à 90%.
cat << 'EOF' > /usr/local/sbin/check-disk
#!/bin/sh
WARN=70
CRIT=90
USAGE=$(df /mnt/data 2>/dev/null | awk 'NR==2 {gsub("%",""); print $5}')
if [ -n "$USAGE" ]; then
if [ "$USAGE" -ge "$CRIT" ]; then
/usr/local/sbin/ntfy-send "🔴 CRITIQUE - NAS $(hostname) : Espace disque ${USAGE}% sur /mnt/data"
elif [ "$USAGE" -ge "$WARN" ]; then
/usr/local/sbin/ntfy-send "🟠 AVERTISSEMENT - NAS $(hostname) : Espace disque ${USAGE}% sur /mnt/data"
fi
fi
EOF
chmod +x /usr/local/sbin/check-disk
Alerte santé Btrfs
Vérifie les statistiques d'erreurs Btrfs. Si des erreurs sont détectées (après un scrub par exemple), une alerte critique est envoyée avec le détail.
cat << 'EOF' > /usr/local/sbin/check-btrfs
#!/bin/sh
ERRORS=$(/sbin/btrfs device stats /mnt/data 2>/dev/null | awk '$2 > 0 {count++} END {print count+0}')
if [ "$ERRORS" -gt 0 ]; then
DETAILS=$(/sbin/btrfs device stats /mnt/data | grep -v ' 0$')
/usr/local/sbin/ntfy-send "🔴 CRITIQUE - NAS $(hostname) : Erreurs Btrfs détectées
$DETAILS"
fi
EOF
chmod +x /usr/local/sbin/check-btrfs
Alerte services arrêtés
Vérifie que les services essentiels (smbd, sshd, zerotier-one) sont bien en cours d'exécution.
cat << 'EOF' > /usr/local/sbin/check-services
#!/bin/sh
check_service() {
local service=$1
local process=$2
if ! pidof "$process" > /dev/null 2>&1; then
/usr/local/sbin/ntfy-send "🔴 CRITIQUE - NAS $(hostname) : Service $service arrêté !"
fi
}
check_service "smbd" "smbd"
check_service "sshd" "sshd"
check_service "zerotier-one" "zerotier-one"
EOF
chmod +x /usr/local/sbin/check-services
Notification de redémarrage
Envoie une notification à chaque redémarrage du NAS, avec l'adresse IP et le temps de fonctionnement. Le script attend 60 secondes pour que le réseau soit complètement initialisé.
cat << 'EOF' > /usr/local/sbin/notify-reboot
#!/bin/sh
sleep 60
IP=$(ip -4 addr show | awk '/inet / && !/127.0.0.1/ {gsub(/\/.*/, "", $2); print $2; exit}')
UPTIME=$(awk '{printf "up %d minutes", $1/60}' /proc/uptime)
/usr/local/sbin/ntfy-send "🔵 INFO - NAS $(hostname) a redémarré
IP: $IP
$UPTIME"
EOF
chmod +x /usr/local/sbin/notify-reboot
Le service OpenRC associé permet de lancer ce script automatiquement au démarrage :
cat << 'EOF' > /etc/init.d/notify-reboot
#!/sbin/openrc-run
description="Notification de redémarrage NAS"
depend() {
need net
after firewall
}
start() {
ebegin "Envoi notification redémarrage"
/usr/local/sbin/notify-reboot &
eend $?
}
EOF
chmod +x /etc/init.d/notify-reboot
rc-update add notify-reboot default
Tentatives SSH échouées
Analyse le fichier /var/log/messages pour détecter les tentatives de connexion SSH échouées. Seuil d'avertissement à 5 tentatives et critique à 15.
cat << 'EOF' > /usr/local/sbin/check-ssh-failures
#!/bin/sh
WARN=5
CRIT=15
LOGFILE="/var/log/messages"
# Timestamp d'il y a 1 heure (format BusyBox)
HOUR_AGO=$(date -d "@$(($(date +%s) - 3600))" "+%b %e %H" 2>/dev/null || date -u -r $(($(date +%s) - 3600)) "+%b %e %H")
# Compter les échecs
FAILURES=$(grep -E "Failed password|Invalid user" "$LOGFILE" 2>/dev/null | grep -c "$(date '+%b %e')")
if [ "$FAILURES" -ge "$CRIT" ]; then
DETAILS=$(grep -E "Failed password|Invalid user" "$LOGFILE" | tail -5)
/usr/local/sbin/ntfy-send "🔴 CRITIQUE - NAS $(hostname) : $FAILURES tentatives SSH échouées
$DETAILS"
elif [ "$FAILURES" -ge "$WARN" ]; then
/usr/local/sbin/ntfy-send "🟠 AVERTISSEMENT - NAS $(hostname) : $FAILURES tentatives SSH échouées (dernière heure)"
fi
EOF
chmod +x /usr/local/sbin/check-ssh-failures
Charge système (CPU / RAM)
Surveille la charge processeur (load average) et l'utilisation mémoire avec des seuils séparés pour chaque métrique.
cat << 'EOF' > /usr/local/sbin/check-load
#!/bin/sh
LOAD_WARN=2
LOAD_CRIT=4
RAM_WARN=80
RAM_CRIT=95
LOAD=$(awk '{print int($2)}' /proc/loadavg)
RAM=$(free | awk '/Mem:/ {printf "%.0f", $3/$2 * 100}')
if [ "$LOAD" -ge "$LOAD_CRIT" ]; then
/usr/local/sbin/ntfy-send "🔴 CRITIQUE - NAS $(hostname) : Charge CPU - Load: $LOAD"
elif [ "$LOAD" -ge "$LOAD_WARN" ]; then
/usr/local/sbin/ntfy-send "🟠 AVERTISSEMENT - NAS $(hostname) : Charge CPU - Load: $LOAD"
fi
if [ "$RAM" -ge "$RAM_CRIT" ]; then
/usr/local/sbin/ntfy-send "🔴 CRITIQUE - NAS $(hostname) : RAM ${RAM}% utilisée"
elif [ "$RAM" -ge "$RAM_WARN" ]; then
/usr/local/sbin/ntfy-send "🟠 AVERTISSEMENT - NAS $(hostname) : RAM ${RAM}% utilisée"
fi
EOF
chmod +x /usr/local/sbin/check-load
Connectivité ZeroTier
Vérifie que le service ZeroTier est en ligne. Toute déconnexion déclenche une alerte critique.
cat << 'EOF' > /usr/local/sbin/check-zerotier
#!/bin/sh
STATUS=$(zerotier-cli status 2>/dev/null | awk '{print $5}')
if [ "$STATUS" != "ONLINE" ]; then
/usr/local/sbin/ntfy-send "🔴 CRITIQUE - NAS $(hostname) : ZeroTier hors ligne - Status: $STATUS"
fi
EOF
chmod +x /usr/local/sbin/check-zerotier
Mises à jour de sécurité en attente
Vérifie si des paquets nécessitent une mise à jour via apk. Avertissement dès 1 paquet en attente, critique à partir de 10.
cat << 'EOF' > /usr/local/sbin/check-updates
#!/bin/sh
WARN=1
CRIT=10
apk update -q 2>/dev/null
UPDATES=$(apk version -l '<' 2>/dev/null | wc -l)
if [ "$UPDATES" -ge "$CRIT" ]; then
/usr/local/sbin/ntfy-send "🔴 CRITIQUE - NAS $(hostname) : $UPDATES mises à jour en attente"
elif [ "$UPDATES" -ge "$WARN" ]; then
/usr/local/sbin/ntfy-send "🟠 AVERTISSEMENT - NAS $(hostname) : $UPDATES mises à jour en attente"
fi
EOF
chmod +x /usr/local/sbin/check-updates
RAID Btrfs dégradé
Détecte si un disque du RAID est manquant ou si le RAID fonctionne en mode dégradé.
cat << 'EOF' > /usr/local/sbin/check-raid
#!/bin/sh
DEVICES=$(/sbin/btrfs filesystem show /mnt/data 2>/dev/null | grep -c "devid")
MISSING=$(/sbin/btrfs filesystem show /mnt/data 2>/dev/null | grep -c "missing")
if [ "$MISSING" -gt 0 ]; then
/usr/local/sbin/ntfy-send "🔴 CRITIQUE - NAS $(hostname) : RAID dégradé - Disque manquant !"
elif [ "$DEVICES" -lt 2 ]; then
/usr/local/sbin/ntfy-send "🔴 CRITIQUE - NAS $(hostname) : RAID dégradé - Seulement $DEVICES disque(s) détecté(s)"
fi
EOF
chmod +x /usr/local/sbin/check-raid
Température CPU
Surveille la température du processeur via les zones thermiques du noyau. Avertissement à 60°C, critique à 75°C.
cat << 'EOF' > /usr/local/sbin/check-temp
#!/bin/sh
WARN=60
CRIT=75
if [ -f /sys/class/thermal/thermal_zone0/temp ]; then
TEMP=$(($(cat /sys/class/thermal/thermal_zone0/temp) / 1000))
elif [ -f /sys/class/hwmon/hwmon0/temp1_input ]; then
TEMP=$(($(cat /sys/class/hwmon/hwmon0/temp1_input) / 1000))
else
exit 0
fi
if [ "$TEMP" -ge "$CRIT" ]; then
/usr/local/sbin/ntfy-send "🔴 CRITIQUE - NAS $(hostname) : Température CPU ${TEMP}°C"
elif [ "$TEMP" -ge "$WARN" ]; then
/usr/local/sbin/ntfy-send "🟠 AVERTISSEMENT - NAS $(hostname) : Température CPU ${TEMP}°C"
fi
EOF
chmod +x /usr/local/sbin/check-temp
Surveillance de l'intégrité des fichiers système
Ce script utilise inotifywait pour surveiller en temps réel toute modification, création, suppression ou déplacement de fichiers système critiques. Toute modification déclenche une alerte immédiate.
Installation
apk add inotify-tools
Script de surveillance
Fichiers et dossiers surveillés :
- Fichiers de configuration :
/etc/samba/smb.conf, /etc/ssh/sshd_config, /etc/nftables.nft, /etc/smartd.conf - Fichiers système sensibles :
/etc/passwd, /etc/shadow, /etc/group, /etc/sudoers, /etc/hosts, /etc/fstab - Autres fichiers critiques :
/etc/apk/repositories, /root/.ssh/authorized_keys - Répertoires surveillés :
/etc/periodic/daily, /etc/periodic/weekly, /etc/periodic/monthly, /etc/sudoers.d, /usr/local/sbin
cat << 'EOF' > /usr/local/sbin/watch-integrity
#!/bin/sh
FILES="
/etc/samba/smb.conf
/etc/ssh/sshd_config
/etc/nftables.nft
/etc/smartd.conf
/etc/passwd
/etc/shadow
/etc/group
/etc/sudoers
/etc/hosts
/etc/fstab
/etc/apk/repositories
/root/.ssh/authorized_keys
"
DIRS="
/etc/periodic/daily
/etc/periodic/weekly
/etc/periodic/monthly
/etc/sudoers.d
/usr/local/sbin
"
WATCH_LIST=""
for f in $FILES; do
[ -f "$f" ] && WATCH_LIST="$WATCH_LIST $f"
done
for d in $DIRS; do
[ -d "$d" ] && WATCH_LIST="$WATCH_LIST $d"
done
inotifywait -m -e modify,create,delete,move $WATCH_LIST 2>/dev/null | while read path action file; do
/usr/local/sbin/ntfy-send "🔴 CRITIQUE - NAS $(hostname) : Modification détectée
Action: $action
Fichier: ${path}${file}"
done
EOF
chmod +x /usr/local/sbin/watch-integrity
Service OpenRC pour watch-integrity
Le service permet de lancer la surveillance au démarrage du système en tâche de fond.
cat << 'EOF' > /etc/init.d/watch-integrity
#!/sbin/openrc-run
description="Surveillance intégrité fichiers système"
command="/usr/local/sbin/watch-integrity"
command_background=true
pidfile="/var/run/watch-integrity.pid"
depend() {
need net localmount
}
EOF
chmod +x /etc/init.d/watch-integrity
rc-update add watch-integrity default
rc-service watch-integrity start
Planification des tâches cron
Tous les scripts de monitoring sont planifiés dans le crontab de root avec des fréquences adaptées à la criticité de chaque vérification.
cat << 'EOF' >> /etc/crontabs/root
# === Alertes NAS ===
# Espace disque (toutes les 6h)
0 */6 * * * /usr/local/sbin/check-disk
# Santé Btrfs (quotidienne à 4h)
0 4 * * * /usr/local/sbin/check-btrfs
# RAID dégradé (toutes les 15 min)
*/15 * * * * /usr/local/sbin/check-raid
# Services (toutes les 15 min)
*/15 * * * * /usr/local/sbin/check-services
# SSH échoués (toutes les heures)
0 * * * * /usr/local/sbin/check-ssh-failures
# Charge système (toutes les 10 min)
*/10 * * * * /usr/local/sbin/check-load
# Température CPU (toutes les 10 min)
*/10 * * * * /usr/local/sbin/check-temp
# ZeroTier (toutes les 15 min)
*/15 * * * * /usr/local/sbin/check-zerotier
# Mises à jour (quotidienne à 8h)
0 8 * * * /usr/local/sbin/check-updates
EOF
# Redémarrer crond
rc-service crond restart
Récapitulatif des fréquences
- Toutes les 10 minutes : charge système (CPU/RAM), température CPU
- Toutes les 15 minutes : état du RAID, services actifs, connectivité ZeroTier
- Toutes les heures : tentatives SSH échouées
- Toutes les 6 heures : espace disque
- Quotidien à 4h : santé Btrfs
- Quotidien à 8h : mises à jour en attente
- En temps réel : intégrité des fichiers système (inotifywait), erreurs SMART (smartd)
- Au démarrage : notification de reboot
Conclusion
Ce système de monitoring couvre l'ensemble des aspects critiques d'un NAS sous Alpine Linux : santé des disques, intégrité du RAID, disponibilité des services, sécurité et performances. Toutes les alertes sont envoyées instantanément sur smartphone via ntfy.sh, permettant une réaction rapide en cas de problème.
La surveillance de l'intégrité des fichiers système via inotifywait et les alertes SMART en temps réel complètent les vérifications périodiques planifiées par cron, offrant une couverture à la fois réactive et proactive.
↑ Haut de page