Tutoriel

Stack monitoring proactif VPS : Beszel + Uptime Kuma v2

Sécurité & Monitoring11 min de lecture7 étapes

Un service PostgreSQL s'arrête sans déclencher aucune alerte disque. Le client appelle. Vous apprenez la panne en même temps que lui. Ce cas, documenté et relayé dans la communauté en octobre 2026, illustre le problème des piles de monitoring mono-outil : chaque couche voit ce qu'elle regarde, et rien d'autre. La combinaison Beszel et Uptime Kuma v2 couvre les deux angles — métriques système sur chaque hôte, et vérification de disponibilité de bout en bout — pour un coût en ressources inférieur à un WordPress idle.

Sommaire· Pourquoi surveiller proactivement, et pourquoi les outils classiques ne suffisent pas1/9
  1. 01Pourquoi surveiller proactivement, et pourquoi les outils classiques ne suffisent pas
  2. 02Ce que cette stack apporte concrètement à une agence
  3. 03Prérequis chiffrés
  4. 04Déploiement complet : Beszel hub, agents, Uptime Kuma v2 et alertes
  5. 05Pièges à connaître avant de mettre en production
  6. 06Comparaison des niveaux d'alerte selon la stack
  7. 07Durcissement : isolez le VPS de supervision
  8. 08Dépannage des problèmes courants
  9. 09Pour aller plus loin

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

  1. 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/monitoring

    Créez le fichier docker-compose.yml avec 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: 3

    Notez le bloc healthcheck sur Uptime Kuma : il est indispensable pour éviter le piège du crash-loop (voir la section « Pièges »).

  2. Démarrer la stack et créer les comptes administrateurs

    Lancez les deux conteneurs :

    docker compose up -d

    Vérifiez que les deux conteneurs sont en état healthy ou running :

    docker compose ps

    Accédez à Beszel sur http://<ip-vps>:8090 et créez le compte administrateur lors du premier accès. Faites de même pour Uptime Kuma sur http://<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.

  3. 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=45876

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

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

  5. 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 5432 de chaque VPS hébergeant une instance — si PostgreSQL s'arrête, le port ne répond plus et l'alerte part en quelques secondes.

  6. 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:/data

    Avec un Caddyfile minimal :

    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 ports de beszel et uptime-kuma dans le Compose dès lors qu'ils sont proxifiés — ils ne doivent plus être accessibles directement.

  7. 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 panneBeszel seulUptime Kuma seulBeszel + Uptime Kuma v2
Disque plein à 95 %Alerte au seuil configuréPas de détectionAlerte Beszel avant la panne
PostgreSQL arrêté (port TCP down)Non détecté (service hors Docker)Alerte TCP en < 2 minAlerte Uptime Kuma TCP
Conteneur en crash-loopAlerte si CPU/RAM impactésFaux positif sans healthcheckDétecté si healthcheck en place
Fuite mémoire progressiveAlerte sur seuil RAMPas de détectionAlerte Beszel anticipée
Certificat SSL expiré dans 7 joursNon surveilléAlerte expiration SSLAlerte Uptime Kuma SSL
VPS inaccessible (réseau ou host down)Hub perd l'agentAlerte TCP/HTTPDouble 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.

Superviser votre parc depuis un seul VPS

Vous gérez plusieurs serveurs clients. Centralisez la supervision de votre parc sur un VPS ServOrbit avec accès root, IPv4 dédiée et Docker préinstallé — la stack Beszel + Uptime Kuma v2 tient sur le plan d'entrée de gamme.

Besoin d'aide ?

Parcourez notre centre d'aide et notre FAQ, ou contactez notre équipe — rappel, WhatsApp ou e-mail. Support en français, anglais et arabe.

Écrire sur WhatsApps'ouvre dans un nouvel onglet