Pourquoi surveiller proactivement, et pourquoi les outils classiques ne suffisent pas
L'alerte réactive — celle qui arrive après que le client a appelé — ne protège pas la relation. Elle la répare. La différence entre les deux n'est pas une question de chance : c'est une question de couverture.
Un outil de monitoring de disponibilité comme Uptime Kuma vérifie qu'un service répond sur un port ou une URL. Il ne sait pas si PostgreSQL tourne en dehors de ce port, si la mémoire du conteneur est sur le point de saturer, ou si le disque de logs remplit à 200 Mo par heure. À l'inverse, un outil de métriques système comme Beszel surveille la consommation de chaque hôte en continu, mais ne teste pas les services applicatifs de bout en bout.
Le cas documenté sur Lemmy le 11 octobre 2026 (112 votes) illustre exactement ce point : PostgreSQL s'était arrêté sur un VPS sans déclencher d'alerte disque. Aucun seuil d'espace n'avait été franchi. Seule une vérification applicative aurait détecté l'arrêt — ce que l'opérateur n'avait pas en place.
La stack Beszel + Uptime Kuma v2 répond aux deux angles. Beszel surveille les métriques de chaque hôte (CPU, RAM, disque, réseau, conteneurs) depuis un hub central. Uptime Kuma v2 vérifie la disponibilité des services exposés, avec des canaux d'alerte configurables. Les deux sont open source, auto-hébergés, et s'installent sur un VPS dédié à la supervision de votre parc.
Ce que cette stack apporte concrètement à une agence
- Vue unifiée de tous vos serveurs clients dans une seule interface Beszel, sans multiplier les accès SSH.
- Alertes métriques (CPU, RAM, disque, réseau) configurables par seuil sur chaque hôte du parc.
- Vérification de disponibilité HTTP(s), TCP, DNS, certificats SSL via Uptime Kuma v2 — un check toutes les 60 secondes par défaut.
- Notifications Telegram ou SMTP opérationnelles dès la première heure, sans abonnement tiers.
- Détection d'une saturation disque ou d'une fuite mémoire avant qu'elle ne bloque un service applicatif.
- Page de statut publique Uptime Kuma partageables avec les clients finaux.
- Consommation totale de la stack inférieure à 150 Mo de RAM sur le VPS de supervision.
- Déploiement reproductible via Docker Compose, versionnable et redéployable en quelques minutes.
Prérequis chiffrés
Pour héberger le hub Beszel et Uptime Kuma v2 sur un VPS dédié à la supervision :
Ressources minimales. Un VPS 1 vCPU avec 1 Go de RAM est suffisant pour superviser une dizaine d'hôtes avec Beszel et une cinquantaine de moniteurs avec Uptime Kuma. En pratique, Beszel hub consomme environ 50 Mo de RAM et Uptime Kuma v2 environ 100 Mo — soit moins de 200 Mo au total au repos, selon les mesures remontées par la communauté. Pour un parc de 20 à 50 VPS, prévoir 2 Go de RAM. L'outil Beszel stocke ses données dans SQLite ; comptez 5 à 10 Go de disque pour conserver plusieurs mois d'historique.
Logiciels requis. Docker et Docker Compose installés sur le VPS de supervision. Un nom de domaine ou sous-domaine pointant sur ce VPS (monitoring.votre-domaine.com) pour le reverse proxy et le SSL. Les ports 80 et 443 ouverts pour le reverse proxy, et le port 8090 ou tout autre port de votre choix pour le hub Beszel (accessible depuis les agents sur les autres VPS).
Sur les VPS supervisés. Chaque hôte à superviser reçoit uniquement l'agent Beszel — un binaire léger ou un conteneur Docker d'environ 10 Mo de RAM. Aucune modification du pare-feu public n'est nécessaire : l'agent établit la connexion vers le hub, pas l'inverse.
Déploiement complet : Beszel hub, agents, Uptime Kuma v2 et alertes
Créer la structure Docker Compose sur le VPS de supervision
Connectez-vous au VPS dédié à la supervision. Créez un répertoire de travail et le fichier Compose :
mkdir -p /opt/monitoring && cd /opt/monitoringCréez le fichier
docker-compose.ymlavec les deux services :services: beszel: image: henrygd/beszel:latest restart: unless-stopped volumes: - ./beszel_data:/beszel_data ports: - "8090:8090" environment: - DATA_DIR=/beszel_data uptime-kuma: image: louislam/uptime-kuma:2 restart: unless-stopped volumes: - ./uptime-kuma-data:/app/data ports: - "3001:3001" healthcheck: test: ["CMD", "node", "extra/healthcheck"] interval: 30s timeout: 10s retries: 3Notez le bloc
healthchecksur Uptime Kuma : il est indispensable pour éviter le piège du crash-loop (voir la section « Pièges »).Démarrer la stack et créer les comptes administrateurs
Lancez les deux conteneurs :
docker compose up -dVérifiez que les deux conteneurs sont en état
healthyourunning:docker compose psAccédez à Beszel sur
http://<ip-vps>:8090et créez le compte administrateur lors du premier accès. Faites de même pour Uptime Kuma surhttp://<ip-vps>:3001. Ces deux interfaces doivent ensuite être placées derrière un reverse proxy (nginx ou Caddy) avec SSL pour ne pas les exposer en HTTP.Déployer l'agent Beszel sur chaque VPS à superviser
Sur chaque VPS client à surveiller, copiez la clé publique générée dans l'interface Beszel (Paramètres → Clé SSH), puis exécutez :
curl -sL https://raw.githubusercontent.com/henrygd/beszel/main/supplemental/scripts/install-agent.sh | bash -s -- -p 45876 -k "<votre-cle-publique>"Alternativement, utilisez Docker sur l'hôte supervisé :
services: beszel-agent: image: henrygd/beszel-agent:latest restart: unless-stopped network_mode: host volumes: - /var/run/docker.sock:/var/run/docker.sock:ro environment: - KEY=<votre-cle-publique> - PORT=45876Dans Beszel, ajoutez chaque hôte depuis l'interface (Systèmes → Ajouter un système) en indiquant son IP et le port de l'agent. La connexion est établie par le hub vers l'agent : l'hôte supervisé n'a pas besoin d'exposer ce port publiquement.
Configurer les alertes métriques dans Beszel
Dans Beszel, ouvrez la fiche d'un système et accédez à l'onglet Alertes. Configurez des seuils sur les métriques critiques :
- Disque : alerte à 80 % et alerte critique à 90 % — couvre le cas PostgreSQL du scénario d'ouverture.
- RAM : alerte à 85 % d'utilisation soutenue sur 5 minutes.
- CPU : alerte si la charge dépasse 90 % pendant plus de 3 minutes.Beszel supporte Telegram, Discord, Slack, Gotify, Ntfy et les webhooks génériques. Pour Telegram, vous avez besoin d'un token de bot (obtenu via
@BotFather) et de l'ID de votre chat ou groupe.Configurer les moniteurs Uptime Kuma v2 et les alertes SMTP ou Telegram
Dans Uptime Kuma, commencez par configurer un canal de notification (Paramètres → Notifications). Deux options courantes :
Telegram. Renseignez le token de bot et l'ID du chat. Le même bot que pour Beszel fonctionne — gardez un seul bot pour les deux outils et distinguez-les par des canaux différents.
SMTP. Renseignez le serveur SMTP, le port (587 en STARTTLS), les identifiants et l'adresse de destination. Utilisez de préférence un compte dédié à l'envoi d'alertes.
Créez ensuite les moniteurs pour chaque service critique : URL HTTP(s) pour les sites, TCP pour les bases de données et les ports applicatifs. Pour le cas PostgreSQL, ajoutez un moniteur TCP sur le port
5432de chaque VPS hébergeant une instance — si PostgreSQL s'arrête, le port ne répond plus et l'alerte part en quelques secondes.Mettre le tout derrière un reverse proxy avec SSL
Ajoutez un service nginx ou Caddy au Compose pour exposer Beszel et Uptime Kuma via HTTPS :
caddy: image: caddy:alpine restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile - caddy_data:/dataAvec un
Caddyfileminimal :monitoring.votre-domaine.com { reverse_proxy beszel:8090 } status.votre-domaine.com { reverse_proxy uptime-kuma:3001 }Caddy émet et renouvelle automatiquement les certificats Let's Encrypt. Retirez les sections
portsde beszel et uptime-kuma dans le Compose dès lors qu'ils sont proxifiés — ils ne doivent plus être accessibles directement.Vérifier le bon fonctionnement et configurer la rétention
Testez l'ensemble en arrêtant manuellement un service sur un VPS de test (
docker compose stop <service>) et en vérifiant que l'alerte Telegram ou SMTP arrive en moins de deux minutes.Pour Beszel, configurez la rétention des données dans Paramètres → Rétention : la valeur par défaut est 7 jours pour les données haute résolution, 30 jours pour les agrégats horaires. Ajustez selon la capacité de votre disque.
Pour Uptime Kuma, la rétention se configure dans Paramètres → Avancé → Purge automatique. Conservez au moins 90 jours pour avoir des tendances d'uptime mensuelles à présenter aux clients.
Pièges à connaître avant de mettre en production
Le crash-loop Docker déclaré UP — issue Uptime Kuma #7956. Sans healthcheck dans le Compose, Docker peut rapporter un conteneur Uptime Kuma en état running alors qu'il est en boucle de redémarrage. Le moniteur Uptime Kuma sur lui-même (TCP vers le port 3001) affichera alors un faux positif : le port répond pendant le court intervalle entre deux redémarrages. Le workaround est précisément le bloc healthcheck montré à l'étape 1 — il utilise le script embarqué dans l'image pour tester l'état interne de l'application, pas seulement la présence du processus. Docker passe alors l'état du conteneur à unhealthy si le check échoue trois fois de suite, et le moniteur Uptime Kuma le voit.
L'agent Beszel en mode network_mode: host. Si les hôtes supervisés font tourner des conteneurs, l'agent Beszel doit avoir accès au socket Docker (/var/run/docker.sock) pour remonter les métriques par conteneur. En mode réseau bridge, le socket est accessible mais l'adresse IP remontée par l'agent peut être celle du réseau Docker interne. Préférez network_mode: host sur l'agent pour garantir que Beszel hub voit l'IP publique du serveur.
Les alertes Beszel ne remplacent pas les vérifications applicatives. Beszel surveille les ressources système et la disponibilité des conteneurs Docker. Il ne teste pas qu'une application répond correctement à une requête HTTP ou que PostgreSQL accepte des connexions. Ces deux niveaux sont complémentaires : Beszel détecte la saturation qui précède la panne, Uptime Kuma confirme la panne quand elle est là.
Comparaison des niveaux d'alerte selon la stack
Faites défiler le tableau
| Scénario de panne | Beszel seul | Uptime Kuma seul | Beszel + Uptime Kuma v2 |
|---|---|---|---|
| Disque plein à 95 % | Alerte au seuil configuré | Pas de détection | Alerte Beszel avant la panne |
| PostgreSQL arrêté (port TCP down) | Non détecté (service hors Docker) | Alerte TCP en < 2 min | Alerte Uptime Kuma TCP |
| Conteneur en crash-loop | Alerte si CPU/RAM impactés | Faux positif sans healthcheck | Détecté si healthcheck en place |
| Fuite mémoire progressive | Alerte sur seuil RAM | Pas de détection | Alerte Beszel anticipée |
| Certificat SSL expiré dans 7 jours | Non surveillé | Alerte expiration SSL | Alerte Uptime Kuma SSL |
| VPS inaccessible (réseau ou host down) | Hub perd l'agent | Alerte TCP/HTTP | Double signal, convergent |
Durcissement : isolez le VPS de supervision
Le VPS de supervision est un actif critique : s'il tombe, vous perdez la visibilité sur tout le reste. Trois règles pour le durcir.
Premièrement, n'hébergez pas d'applications clientes sur ce VPS. Sa charge doit rester prévisible et son seul rôle est la supervision.
Deuxièmement, fermez tous les ports inutiles avec le pare-feu de votre VPS. Seuls 80, 443 et le port SSH (déplacé sur un port non standard) doivent être accessibles depuis Internet. Le port de l'agent Beszel (45876 par défaut) ne doit être ouvert que depuis les IP de vos autres VPS, pas depuis l'ensemble d'Internet.
Troisièmement, ajoutez un moniteur Uptime Kuma externe — par exemple depuis un service de check HTTP gratuit — qui vérifie que votre propre instance Uptime Kuma répond. Sans cette couche externe, une panne du VPS de supervision passe inaperçue.
Dépannage des problèmes courants
L'agent Beszel apparaît hors ligne immédiatement après l'ajout. Vérifiez que le port de l'agent (45876 par défaut) est bien accessible depuis le hub. Sur l'hôte supervisé, testez avec nc -zv <ip-hub> 8090 — si la connexion échoue, le problème est côté pare-feu du hub. L'agent lui-même ne nécessite pas de port entrant ouvert.
Uptime Kuma ne reçoit pas les alertes Telegram. Le problème le plus fréquent est un décalage d'horloge sur le conteneur. Vérifiez avec docker exec uptime-kuma date que l'heure correspond à l'heure UTC réelle. Si ce n'est pas le cas, ajoutez /etc/localtime:/etc/localtime:ro dans les volumes du service Uptime Kuma.
Beszel hub ne démarre pas ou perd ses données après un redémarrage. Vérifiez que le volume ./beszel_data appartient bien à l'UID utilisé par le conteneur Beszel. Une erreur de permissions sur le dossier de données empêche SQLite d'écrire : chown -R 1000:1000 ./beszel_data corrige le problème dans la plupart des cas.
Uptime Kuma en état unhealthy au démarrage. L'image v2 peut mettre 30 à 60 secondes à démarrer complètement avant que le healthcheck passe. C'est normal. Si le conteneur reste unhealthy après deux minutes, consultez les logs : docker compose logs uptime-kuma.
Pour aller plus loin
Cette stack couvre les deux niveaux essentiels : métriques système et vérification de disponibilité. Pour un troisième niveau — la traçabilité et l'analyse fine des tendances de charge — la stack Grafana + Prometheus fait suite naturellement. Elle est plus consommatrice en ressources (prévoir 2 Go de RAM dédiés), mais ouvre le langage PromQL et les dashboards sur mesure. L'article Monitoring de VPS avec Grafana et Prometheus couvre ce déploiement étape par étape.
Pour les sauvegardes du VPS de supervision lui-même — et éviter de reconstruire toute la configuration en cas de perte —, la stratégie 3-2-1 avec Restic et un stockage S3 s'applique directement aux volumes Docker de cette stack.
Si vous gérez plusieurs serveurs clients depuis une seule plateforme, la page /solutions/agences détaille comment ServOrbit centralise la supervision de votre parc sur un VPS Start.