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

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 :

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


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