Aller au contenu

Agent Linux, macOS, FreeBSD et Windows

Un petit binaire installé sur la machine à surveiller. Il mesure CPU, mémoire, disques, réseau, services et conteneurs — et, là où la machine les expose, températures, santé de disque, pools ZFS et machines virtuelles KVM — puis envoie ses relevés au serveur DumbMonit via HTTP.

De l’agent vers le serveur DumbMonit :

PortProtocoleUsage
8080TCPRelevés et commandes (port par défaut, 443 derrière un proxy TLS)

La direction est délibérée : l’agent appelle le serveur, jamais l’inverse. Il traverse NAT et pare-feux domestiques, et ne demande d’ouvrir aucun port sur la machine surveillée.

Toutes les métriques sont préfixées dumbmonit_. Les labels d’identité (target, host, tag_*) sont réglés par le serveur à la réception, jamais par l’agent : une machine ne peut pas écrire dans les séries d’une autre, même en falsifiant ses labels.

FamilleMétriquesLabels
CPUcpu_usage_percent, cpu_count, load_average_1/5/15 ; cpu_core_usage_percent seulement avec cpu_per_core: truecore
Mémoirememory_total/used/available_bytes, memory_used_percent, swap_total/used_bytes, swap_used_percent
Systèmes de fichiersfilesystem_total/used/free_bytes, filesystem_used_percentmountpoint, device, fstype
Réseau (compteurs)if_octets_in/out, if_packets_in/out, if_errors_in/outifname
Disques (compteurs)disk_read_bytes, disk_written_bytes, une série par périphérique blocdevice
Hôteuptime_seconds, process_count
Servicesservice_up (1 = en cours)service
Conteneurscontainer_up, container_count, container_running_count, container_series_skipped (conteneurs au-delà de docker_max_containers)container, image
Capteursagent_sensor_temperature_celsius, agent_sensor_temperature_critical_celsius (le seuil que le matériel déclare lui-même), agent_sensor_fan_rpmsensor, fan
Santé de disque (SMART)agent_disk_smart_ok (1 = le disque réussit sa propre auto-évaluation), agent_disk_temperature_celsius, agent_disk_power_on_hours, agent_disk_wearout_percent, agent_disk_reallocated_sectors, agent_disk_pending_sectors, agent_disk_media_errorsdevice, model
KVM / libvirtagent_libvirt_domains, agent_libvirt_domains_running, agent_libvirt_pools ; par domaine agent_libvirt_domain_state_info, agent_libvirt_domain_running, agent_libvirt_domain_crashed, agent_libvirt_domain_vcpus, agent_libvirt_domain_memory_max_bytes, agent_libvirt_domain_memory_used_bytes ; par pool de stockage agent_libvirt_pool_state_info, agent_libvirt_pool_active, agent_libvirt_pool_capacity_bytes, agent_libvirt_pool_allocation_bytes, agent_libvirt_pool_used_percent — voir Machines virtuelles KVM via libvirtdomain, pool, state
ZFSagent_zfs_pool_health (0 online, 1 dégradé, 2 pire), agent_zfs_pool_size/used/free_bytes, agent_zfs_pool_used_percent, agent_zfs_pool_fragmentation_percent, agent_zfs_pool_device_errors, agent_zfs_pool_data_errors, agent_zfs_pool_scrub_running, agent_zfs_pool_scrub_errors, agent_zfs_pool_scrub_age_secondspool
WireGuardagent_wireguard_interface_peers ; par pair agent_wireguard_peer_handshake_age_seconds, agent_wireguard_peer_has_handshake, agent_wireguard_peer_keepalive_seconds, agent_wireguard_peer_rx_bytes, agent_wireguard_peer_tx_bytes (compteurs) — voir Tunnels WireGuardinterface, peer, allowed_ips, name
IPsec (strongSwan)agent_ipsec_tunnel_up ; quand monté, agent_ipsec_tunnel_bytes_in/out (compteurs) et agent_ipsec_tunnel_rekey_seconds — voir Tunnels IPsecconnection, tunnel
Test de débit Internetagent_speedtest_ok, agent_speedtest_age_seconds, agent_speedtest_download_bytes_per_second, agent_speedtest_upload_bytes_per_second, agent_speedtest_latency_ms, agent_speedtest_jitter_ms ; les seuils configurés répétés en agent_speedtest_download_min_bytes_per_second, agent_speedtest_upload_min_bytes_per_second, agent_speedtest_max_latency_ms — voir Test de débit Internet
restic / Borgagent_backup_repo_reachable, agent_backup_repo_last_snapshot_age_seconds, agent_backup_repo_last_snapshot_bytes (restic) — voir Sauvegardes restic et Borgtool, repo
Compteurs de performance Windowsagent_perf_counter, une série par compteur listé dans perf_counterscounter
MDaemon (Windows)mdaemon_queue_messages, mdaemon_queue_frozen, mdaemon_sessions_active, mdaemon_sessions_total, mdaemon_messages_total, mdaemon_filtered_messages_total, mdaemon_server_active, mdaemon_running, mdaemon_uptime_seconds — voir MDaemonqueue, protocol, filter, verdict, server
Hyper-V (Windows)hyperv_vms_health_ok, hyperv_vms_health_critical, hyperv_host_cpu_percent, hyperv_host_cpu_guest_percent, hyperv_partitions ; par VM hyperv_vm_physical_memory_megabytes, hyperv_vm_guest_visible_memory_megabytes, hyperv_vm_memory_pressure_percent ; par disque virtuel hyperv_vhd_read_bytes_per_second, hyperv_vhd_write_bytes_per_second, hyperv_vhd_latency_seconds, hyperv_vhd_queue_length, hyperv_vhd_errors_total — voir Hôtes Hyper-Vvm, disk
Agentagent_collect_seconds, agent_buffered_samples, agent_dropped_samples

Une série qui ne peut pas être mesurée est absente, jamais zéro : pas de smartctl, pas de agent_disk_* ; pas de sonde lisible, pas de agent_sensor_* ; pas de ZFS, pas de agent_zfs_* ; pas de virsh, pas de agent_libvirt_*. Une température hors 1–150 °C est abandonnée plutôt que publiée, et une lecture de ventilateur à 0 tr/min est abandonnée aussi — une carte mère a plus de connecteurs de ventilateur que de ventilateurs, et un vide lit zéro comme un ventilateur mort.

LinuxmacOSFreeBSDWindows
CPU, mémoire, swap, systèmes de fichiers, réseau, uptime, processusouiouiouioui
Moyenne de chargeouiouiouinon (Windows n’a pas cette notion)
Servicessystemd (systemctl)launchd (launchctl)rc.d (service)services Windows
Conteneurs Dockerouioui, si docker_socket pointe vers le socket de Docker Desktopnon (pas de démon Docker)non
Températures/sys/class/hwmoncapteurs SMCdev.cpu.N.temperature (CPU seulement)non
Ventilateurs/sys/class/hwmonnonnonnon
Santé de disque (SMART)smartctlsmartctl (Homebrew)smartctl (sysutils/smartmontools)smartctl
Pools ZFSzpool (OpenZFS)nonzpoolnon
Machines virtuelles KVM (libvirt)virshnonnonnon
Santé de l’OS (mises à jour, redémarrage, unités en échec, SELinux)ouinonnonnon
Sauvegardes Plakarouiouiouioui
Tunnels WireGuardwg showsi wg est installé (non testé)si wg est installé (non testé)non
Tunnels IPsecswanctlsi swanctl est installé (non testé)si swanctl est installé (non testé)non
Test de débit Internetoui, opt-inoui, opt-inoui, opt-inoui, opt-in
Sauvegardes restic et Borgouiouiouirestic seulement (non testé ; Borg n’a pas de build Windows)
Compteurs de performance, files MDaemon, Hyper-Vnonnonnonoui
Identité machine/etc/machine-idIOPlatformUUIDkern.hostuuid, /etc/hostidnom d’hôte
Mode relaisouiouiouioui

Windows n’a pas de ligne de température volontairement : lire des capteurs là demande de passer par WMI, avec des droits administratifs, pour des valeurs que la plupart des machines n’exposent pas du tout. Ne rien publier est la réponse honnête.

smartctl (smartmontools), zpool et virsh sont recherchés à chaque période de lecture et utilisés quand présents ; aucun n’est installé par l’agent, et aucun n’est requis. Tous ont besoin de root (virsh fonctionne aussi pour un membre du groupe libvirt) — le service que l’installateur enregistre tourne en root, un agent démarré à la main sous votre propre compte ne trouvera rien.

Les compteurs sont envoyés bruts, pour qu’un redémarrage de l’agent ne produise jamais un faux débit ; appliquez rate() dans les requêtes.

Règles intégrées qui s’appliquent : Surveillance inaccessible, CPU élevé, CPU inhabituel. « Surveillance inaccessible » fonctionne aussi sur les agents : le serveur vérifie l’ancienneté du dernier lot reçu et déclare la machine silencieuse après trois périodes manquées (90 secondes au moins).

Quatre autres se déclenchent seulement sur les machines qui produisent la série correspondante, elles n’ont donc besoin d’aucune configuration et ne peuvent jamais se déclencher sur une machine sans le matériel :

RègleSe déclenche quand
Disque SMART en échec (critique)la propre auto-évaluation d’un disque le rapporte en échec
Pool ZFS dégradé (critique)un pool n’est plus ONLINE depuis cinq minutes
Scrub ZFS a trouvé des erreurs (critique)le dernier scrub a trouvé des erreurs, ou le pool rapporte des fichiers corrompus de façon permanente
Domaine KVM planté (critique)libvirt rapporte un domaine comme crashed
Pool libvirt presque plein (avis)l’allocation d’un pool de stockage atteint 90 % de sa capacité pendant quinze minutes
Température au-dessus du critique (critique)un capteur dépasse le seuil critique que son propre matériel déclare — aucune valeur n’est codée en dur, 85 °C étant une urgence sur un disque et un après-midi normal sur le CPU d’un portable

D’autres surveillent ce que vous déclarez ou lancez vous-même, et restent silencieuses sinon : Pair WireGuard silencieux (un pair avec un keepalive persistant et aucun handshake depuis 15 minutes), Tunnel IPsec hors service (un tunnel configuré sans session installée depuis dix minutes), Sauvegarde restic/Borg trop ancienne (aucun snapshot depuis 48 heures), Dépôt restic/Borg inaccessible, et Débit descendant Internet bas / Débit montant Internet bas / Latence Internet élevée (seulement une fois un seuil réglé) — voir Tunnels WireGuard, Tunnels IPsec, Sauvegardes restic et Borg et Test de débit Internet.

Sur un serveur Windows qui fait tourner MDaemon ou SecurityGateway, Service Windows du serveur mail arrêté surveille leurs services, et pour MDaemon cinq autres surveillent ses files : File de mail MDaemon qui grandit, File de mail bloquée, File MDaemon gelée, File Bad MDaemon non vide et File Retry MDaemon élevée (voir Règles). Sur un hôte Hyper-V, trois surveillent les machines virtuelles : Santé de VM Hyper-V critique, CPU d’hôte Hyper-V élevé et Erreurs de disque virtuel Hyper-V (voir Hôtes Hyper-V).

Les étapes ci-dessous sont celles que montre l’avis à côté du formulaire. Il n’y a aucun compte à créer sur la machine : le jeton d’enrôlement est le seul secret.

  1. Dans DumbMonit, ajoutez une surveillance et choisissez Serveur avec l’agent. Choisissez comment la machine joint le serveur : En direct, ou Via un relais d’un site distant derrière un pare-feu (voir Surveiller un site distant). Un jeton d’enrôlement (dmon_…) est montré une fois, avec la commande d’installation prête à copier pour Linux/macOS, Windows et Docker.

  2. Lancez cette commande d’installation sur la machine, avec des droits élevés (sudo sur Linux et macOS, un PowerShell élevé sur Windows).

  3. La page attend le premier envoi (quelques secondes), puis permet de nommer la machine, de la ranger dans un dossier et de la placer sur un site, sur place.

  4. Facultatif, pour Docker : si l’agent tourne sous un utilisateur dédié, ajoutez cet utilisateur au groupe « docker » et redémarrez l’agent.

    usermod -aG docker dumbmonit
  5. Pour un parc (un playbook, une image de machine), cochez Plusieurs machines avec cette commande avant de créer la commande ; tout un domaine Windows passe par le kit Active Directory, proposé sur la même page. Révoquez un jeton perdu dans Réglages → Agents.

Le jeton est la clé de l’agent pour envoyer ses mesures à DumbMonit. Ce n’est pas un compte sur la machine. Un jeton créé depuis le formulaire de surveillance est à usage unique : il enrôle cette seule machine et rien d’autre. Pour un parc, cochez Plusieurs machines avec cette commande dans le même parcours. À ce premier lot, le serveur donne à l’agent un secret qui lui est propre et le stocke dans /etc/dumbmonit/agent-secret, lisible par personne d’autre : à partir de là, cette machine est la seule qui peut rapporter sous cette surveillance.

Docker : pour voir les conteneurs et laisser DumbMonit les redémarrer ou les mettre à jour, l’agent doit atteindre le socket Docker. Le service que l’installateur enregistre le peut déjà. Les politiques de redémarrage et de mise à jour automatique se règlent alors par conteneur sur la page de la surveillance.

Sauvegardes Plakar : détectées automatiquement. Une surveillance Plakar apparaît sous la machine quand le binaire plakar ou un kloset (~/.config/plakar/stores.yml de chaque utilisateur, ~/.plakar, /var/lib/plakar) est trouvé, et rien n’est montré sinon. Réglez plakar_klosets dans agent.yaml pour surveiller une liste fixe, ou plakar: false pour vous retirer.

Les services que l’agent trouve (Docker, Plakar, restic/Borg, ZFS, libvirt, WireGuard, IPsec, test de débit) deviennent chacun une surveillance à part, rangée sous la machine, avec son propre état et ses alertes. Le panneau « Services trouvés par l’agent » de la machine liste ce qui a été trouvé et ce qui ne l’a pas été : décochez un module pour supprimer sa surveillance, cochez-en un pour le surveiller avant qu’il n’apparaisse. Voir Services trouvés par l’agent.

Deux choses valent d’être lues avant de déployer ça sur plus d’une machine : Liaison, ce qui fait qu’une surveillance appartient vraiment à une installation d’agent, et Usage unique ou parc, le choix que vous faites quand vous créez un jeton.

Fenêtre de terminal
curl -sSL https://server:8080/install.sh | sh -s -- --token=dmon_xxx --url=https://server:8080

Le script est en sh POSIX (BusyBox et dash fonctionnent), télécharge le binaire pour l’architecture de la machine (x86_64 ou aarch64) depuis le serveur, écrit /etc/dumbmonit/agent.yaml (mode 0600) et enregistre dumbmonit-agent avec systemd, ou avec OpenRC sur Alpine. L’unité systemd est renforcée (ProtectSystem=strict, NoNewPrivileges, MemoryMax=256M, CPUQuota=20%).

La même commande que sur Linux, lancée avec sudo :

Fenêtre de terminal
curl -sSL https://server:8080/install.sh | sudo sh -s -- --token=dmon_xxx --url=https://server:8080

Les binaires macOS ne sont pas dans l’image DumbMonit : les construire demande le SDK d’Apple, dont la licence interdit la redistribution. Ils sont attachés à chaque release GitHub à la place — dumbmonit-agent-macos-aarch64 (Apple silicon) et dumbmonit-agent-macos-x86_64 (Intel), chacun avec son .sha256 — et le serveur redirige /download/dumbmonit-agent-macos-… là, le script choisit donc celui pour l’architecture du Mac (uname -m). Le serveur ne fournit pas ces binaires, la commande d’installation ne porte donc aucune somme de contrôle pour eux : ajoutez --sha256=macos-aarch64:<hex> (ou macos-x86_64) avec la valeur du .sha256 de la release, sinon l’installateur refuse le téléchargement. Le Mac a aussi besoin d’atteindre github.com.

Sans cet accès, ou pour installer un binaire que vous avez déjà, téléchargez-le et passez-le avec --bin (comparez-le d’abord avec le .sha256 de la release : --bin installe ce que vous donnez) :

Fenêtre de terminal
curl -sSLO https://github.com/laupernoe/dumbmonit/releases/latest/download/dumbmonit-agent-macos-aarch64
curl -sSL https://server:8080/install.sh | sudo sh -s -- \
--token=dmon_xxx --url=https://server:8080 --bin=./dumbmonit-agent-macos-aarch64

Le script installe le binaire dans /usr/local/bin (et retire l’attribut de quarantaine qu’un téléchargement par navigateur porte, qui ferait refuser à Gatekeeper de le démarrer), écrit /usr/local/etc/dumbmonit/agent.yaml (mode 0600) et enregistre le démon système com.dumbmonit.agent dans /Library/LaunchDaemons, démarré avec launchctl bootstrap system. Il tourne au démarrage, sans personne connecté.

Fenêtre de terminal
fetch -qo - https://server:8080/install.sh | sh -s -- --token=dmon_xxx --url=https://server:8080

x86_64 seulement. Le script télécharge dumbmonit-agent-freebsd-x86_64 depuis le serveur, écrit /usr/local/etc/dumbmonit/agent.yaml (mode 0600) et installe /usr/local/etc/rc.d/dumbmonit_agent, activé avec service dumbmonit_agent enable. daemon(8) supervise l’agent, le redémarre s’il s’arrête et écrit /var/log/dumbmonit-agent.log.

Fonctionne pareil sur TrueNAS CORE et d’autres appliances basées FreeBSD, où les séries ZFS sont l’objet de l’exercice.

Fenêtre de terminal
& ([scriptblock]::Create((irm https://server:8080/install.ps1))) -Token dmon_xxx -Url https://server:8080

Le script télécharge dumbmonit-agent-windows-x86_64.exe depuis le serveur, le vérifie contre son SHA-256, l’installe comme C:\Program Files\DumbMonit\dumbmonit-agent.exe, écrit C:\ProgramData\DumbMonit\agent.yaml (lisible par SYSTEM et Administrators seulement) et enregistre le service Windows DumbMonitAgent (« DumbMonit system agent ») : démarré automatiquement au boot, en LocalSystem, et redémarré après un échec (10 s, 30 s, puis 60 s). L’agent parle au gestionnaire de services lui-même (--service), arrêter le service le laisse donc envoyer ce qu’il a encore avant de sortir.

Un service n’a pas de console : l’agent écrit son journal dans C:\ProgramData\DumbMonit\agent.log, mis de côté comme agent.log.old au-delà de 10 Mo.

Il n’y a pas de build ARM64 natif : sur Windows 11 pour ARM, le script installe le binaire x86_64, qui tourne sous émulation x64.

Pour tout un domaine Windows, déployez l’agent avec une seule stratégie de groupe plutôt que de lancer la commande sur chaque serveur : voir Déployer l’agent avec Active Directory.

Un jeton peut enrôler plusieurs machines : nommez-le d’après un groupe ou une machine.

L’agent est un seul exécutable statique par système, sans rien à installer à côté :

SystèmeFichierOù l’obtenir
Linux x86_64dumbmonit-agent-linux-x86_64le serveur, /download/…
Linux aarch64 (ARM 64 bits : Raspberry Pi OS 64 bits, serveurs ARM)dumbmonit-agent-linux-aarch64le serveur, /download/…
Windows x86_64dumbmonit-agent-windows-x86_64.exele serveur, /download/…
FreeBSD x86_64dumbmonit-agent-freebsd-x86_64le serveur, /download/…
macOS Apple silicondumbmonit-agent-macos-aarch64la release GitHub (le serveur y redirige)
macOS Inteldumbmonit-agent-macos-x86_64la release GitHub (le serveur y redirige)

Les binaires Linux sont liés statiquement contre musl : ils tournent sur n’importe quelle distribution, glibc ou pas (Alpine, firmwares de NAS), sans bibliothèque à faire correspondre. Chaque fichier a sa somme de contrôle à côté, <file>.sha256, au format sha256sum. Chaque release GitHub porte les six binaires et leurs sommes de contrôle, pour les machines qui ne peuvent pas atteindre le /download/ du serveur ou pour installer avec --bin.

Depuis la version 0.9.0, chaque binaire d’une release est aussi signé sans clé avec Sigstore (<file>.sigstore.json) et accompagné d’une attestation de provenance SLSA. Pour vérifier qu’un binaire a bien été construit par le workflow de release de ce dépôt :

Fenêtre de terminal
cosign verify-blob dumbmonit-agent-linux-x86_64 \
--bundle dumbmonit-agent-linux-x86_64.sigstore.json \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity-regexp '^https://github.com/laupernoe/dumbmonit/\.github/workflows/release\.yml@refs/tags/v'
# ou, avec la CLI GitHub :
gh attestation verify dumbmonit-agent-linux-x86_64 -R laupernoe/dumbmonit

Pour construire vous-même les binaires Linux, Windows et FreeBSD, depuis un clone du dépôt (Docker est le seul prérequis) :

Fenêtre de terminal
docker buildx build --target agent-dist --output type=local,dest=dist/agent .
Linux (systemd)Linux (OpenRC)macOS (launchd)FreeBSD (rc.d)Windows (PowerShell)
Statutsystemctl status dumbmonit-agentrc-service dumbmonit-agent statussudo launchctl print system/com.dumbmonit.agentservice dumbmonit_agent statusGet-Service DumbMonitAgent
Logsjournalctl -u dumbmonit-agent -ftail -f /var/log/dumbmonit-agent.logtail -f /var/log/dumbmonit-agent.logtail -f /var/log/dumbmonit-agent.logGet-Content C:\ProgramData\DumbMonit\agent.log -Tail 20 -Wait
Redémarrersystemctl restart dumbmonit-agentrc-service dumbmonit-agent restartsudo launchctl kickstart -k system/com.dumbmonit.agentservice dumbmonit_agent restartRestart-Service DumbMonitAgent
Arrêtersystemctl stop dumbmonit-agentrc-service dumbmonit-agent stopsudo launchctl bootout system/com.dumbmonit.agentservice dumbmonit_agent onestopStop-Service DumbMonitAgent
Configuration/etc/dumbmonit/agent.yaml/etc/dumbmonit/agent.yaml/usr/local/etc/dumbmonit/agent.yaml/usr/local/etc/dumbmonit/agent.yamlC:\ProgramData\DumbMonit\agent.yaml
Fichier de service/etc/systemd/system/dumbmonit-agent.service/etc/init.d/dumbmonit-agent/Library/LaunchDaemons/com.dumbmonit.agent.plist/usr/local/etc/rc.d/dumbmonit_agentservice DumbMonitAgent (services.msc)

--uninstall (-Uninstall sur Windows) retire tout, service inclus, sur chaque système.

Supprimer le moniteur d’une machine ne désinstalle pas son agent : il continue de tourner et redemande à s’enrôler. À la suppression du moniteur, DumbMonit propose Désinstaller l’agent automatiquement si l’agent en est capable :

  • il accepte les commandes (commands: true, la valeur par défaut ; un agent réglé sur commands: false ne reçoit jamais la demande) ;
  • il s’est manifesté ces dernières minutes ;
  • il a été installé par install.sh ou install.ps1, hors conteneur.

L’agent lance alors un assistant qui, quelques secondes plus tard, fait ce que fait --uninstall (-Uninstall) : il arrête et retire le service, puis efface le binaire et la configuration. Rien n’est téléchargé. L’agent confirme juste avant le ménage et s’arrête ; DumbMonit supprime ensuite le moniteur. Seul un administrateur connecté à l’interface peut le demander (pas un jeton d’API), et la demande est inscrite au journal d’audit.

Un agent qui tourne dans Docker refuse : supprimez plutôt son conteneur (docker rm -f dumbmonit-agent, puis docker volume rm dumbmonit-agent). Si l’agent refuse, ne répond pas dans les deux minutes ou est hors ligne, la page montre les commandes à lancer sur la machine, et Supprimer quand même le moniteur. À la main, à tout moment, la commande d’installation avec --uninstall (-Uninstall sur Windows) à la place de ses autres options fait la même chose.

install.shinstall.ps1Effet
--token=TOKEN-TokenJeton d’enrôlement (requis).
--url=URL-UrlURL du serveur, par exemple https://server:8080. Sur Linux, DUMBMONIT_URL dans l’environnement est utilisé si l’option est absente.
--interval=N-IntervalPériode d’échantillonnage en secondes (défaut 30).
--services=a,b,c-Services @('a','b')Services dont l’état est rapporté, nommés comme le système hôte les nomme : unités systemd sur Linux, labels launchd (com.apple.sshd) sur macOS, noms rc.d sur FreeBSD, services Windows.
--tags=key=value,…-Tags @{key='value'}Étiquettes, copiées comme tag_<key> sur chaque série.
--hostname=NAME-HostNameNom annoncé au serveur (défaut : celui de la machine).
--bin=PATH-BinPathBinaire local à installer plutôt que de le télécharger.
--sha256=LIST-Sha256SHA-256 attendu du téléchargement, comme des paires platform-arch:hex séparées par des virgules (une valeur hex seule fonctionne aussi). Inclus dans la commande que DumbMonit montre ; requis sauf si l’option suivante est donnée.
--insecure-skip-checksum-InsecureSkipChecksumInstaller un binaire téléchargé sans le vérifier, avec un avertissement. Seulement pour les configurations isolées ou manuelles.
--no-startTout installer, mais ne pas contacter le serveur ni démarrer le service (image de machine, test).
--uninstall-UninstallDésinstaller l’agent et supprimer sa configuration.
--helpMontrer l’aide.

À partir de cette version, les agents se mettent à jour eux-mêmes (voir Mises à jour automatiques) : après une mise à jour du serveur, il n’y a rien à lancer. La commande d’installation ci-dessous reste la façon de faire la première mise à jour d’un agent antérieur à cette fonction, et de changer son jeton ou son URL. Prenez la commande sur le serveur actuel ; le binaire se trouve désormais dans /usr/local/lib/dumbmonit-agent/ sous Linux.

Les deux scripts sont idempotents : relancer la commande d’installation, avec le même jeton et la même URL, remplace le binaire, réécrit la configuration et redémarre le service. C’est la procédure de mise à jour. Prenez la commande depuis le serveur actuel (ajoutez une surveillance, Serveur avec l’agent) : son --sha256 doit correspondre aux binaires de la version de serveur vers laquelle vous avez mis à jour.

La même commande migre une machine qui fait encore tourner l’agent EzyMonit, sur Linux et sur Windows. L’installateur arrête et retire l’ancien service (ezymonit-agent, ou EzyMonitAgent sur Windows), déplace la configuration vers le nouveau chemin (/etc/dumbmonit/agent.yaml, C:\ProgramData\DumbMonit\agent.yaml) et installe dumbmonit-agent à sa place. L’ancien jeton ezym_… reste valide, la commande montrée à la création du jeton fonctionne donc toujours ; rien n’a besoin d’être révoqué d’abord.

À partir de cette version, l’agent se met à jour depuis votre serveur : après une mise à jour de DumbMonit, les agents suivent sans qu’il faille relancer une commande d’installation. La première mise à jour d’un agent antérieur à cette fonction est manuelle (voir Agents installés avant cette version).

  • À chaque lot, l’agent rapporte le SHA-256 de son binaire en cours d’exécution, sa plateforme (linux-x86_64, linux-aarch64, freebsd-x86_64, windows-x86_64), s’il peut se remplacer lui-même, et le résultat de sa dernière tentative de mise à jour.
  • Le serveur embarque les binaires d’agent de son propre build (/agents dans l’image, DUMBMONIT_AGENT_DIR). Quand le SHA-256 de l’agent diffère de celui du binaire du serveur pour sa plateforme, et que les mises à jour sont autorisées pour cet agent, la réponse du serveur au lot porte une offre : version, build, fichier, SHA-256, taille et signature Ed25519. L’offre est faite sur le canal chiffré des agents (port 8443) comme sur l’ancien canal en clair.
  • C’est le build qui décide, pas seulement la version : un serveur :edge aligne ses agents sur son propre build. Un agent n’est jamais rétrogradé, sauf si un administrateur le demande : Mettre à jour maintenant sur un agent plus récent que le serveur propose Installer la version du serveur.
  • L’agent télécharge le fichier par GET /api/agent/update/download/<fichier> sur son propre canal (chiffré, épinglé, TLS mutuel s’il a un certificat), avec le jeton d’enrôlement, le secret de liaison et la clé de machine. Un voisin qui possède le jeton de parc ne peut pas le récupérer en se faisant passer pour une autre machine.
  • Avant de remplacer quoi que ce soit, l’agent vérifie que la taille ne dépasse pas 128 Mio, que le SHA-256 est celui de l’offre, que la signature Ed25519 est valide pour une clé publique de release compilée dans l’agent (voir Sécurité), puis lance une fois le nouveau binaire avec --version : il doit afficher la version offerte.

Linux et FreeBSD. L’ancien binaire est copié à côté (dumbmonit-agent.previous), un registre de mise à jour (dumbmonit-agent.update.json) est écrit, puis le nouveau binaire remplace l’ancien par un renommage atomique (avec fsync) et l’agent fait exec() du nouveau dans le même processus : systemd, OpenRC et rc.d voient le même PID. Les mesures encore en mémoire sont d’abord envoyées, ou conservées sur disque.

Windows. Un .exe en cours d’exécution ne peut pas être écrasé. L’agent se copie vers dumbmonit-agent-update-helper.exe, le lance détaché avec --update-helper et s’arrête. Le helper attend l’arrêt du service DumbMonitAgent, échange dumbmonit-agent.exe et le dumbmonit-agent.new.exe préparé (l’ancien est gardé en .previous), redémarre le service et surveille la période d’essai.

Sous Linux, le script d’installation place le binaire dans /usr/local/lib/dumbmonit-agent/dumbmonit-agent ; un lien symbolique reste en /usr/local/bin/dumbmonit-agent. L’unité systemd reçoit ReadWritePaths=/usr/local/lib/dumbmonit-agent : avec ProtectSystem=strict, ce dossier est le seul endroit où l’agent peut écrire en dehors de son cache.

Réglages → Agents → Mises à jour automatiques des agents (session administrateur uniquement ; les jetons d’API ne peuvent pas modifier ces réglages). Les mêmes réglages sont disponibles par GET/PUT /api/agent/updates, PUT /api/agent/updates/{id}, POST /api/agent/updates/{id}/now et POST /api/agent/updates/all.

RéglageSignification
Les agents se mettent à jourActivé par défaut, pour les installations neuves et existantes. Chaque agent peut le surcharger : suivre le réglage global, activé ou désactivé.
FenêtreÀ tout moment (défaut), seulement pendant une fenêtre de maintenance (un silence actif sur l’appareil) ou manuel uniquement (Mettre à jour maintenant).
Déploiement progressifLes agents marqués canari reçoivent la mise à jour en premier. Les autres attendent que chaque canari éligible exécute le nouveau build depuis N minutes (60 par défaut, 10080 au maximum) sans échec ; un canari en échec suspend le déploiement. Sans canari, tout le monde se met à jour en même temps.
Mettre à jour maintenant / Tout mettre à jourPar agent, ou pour tous : ignore la fenêtre et le déploiement progressif, et retente une fois un build en échec.
Accepter les builds non signés (développement)Désactivé par défaut, avec un avertissement dans l’interface. Voir Sécurité.

La liste des agents montre la version et un état de mise à jour pour chacun : à jour, en attente, en cours, en échec (avec la raison), refusé, désactivé, manuel, attend la fenêtre, attend les canaris, plus récent que le serveur, ancien, conteneur, lecture seule, désactivé localement, non pris en charge, aucun binaire.

  • Intégrité : le SHA-256 vient du serveur.
  • Authenticité : une signature Ed25519 détachée, faite avec la clé de release détenue uniquement dans le secret GitHub AGENT_SIGNING_KEY. La clé publique (plusieurs sont possibles, pour la rotation) est compilée dans l’agent (crates/agent/signing/release-keys.pem). Une signature qui ne vérifie pas est toujours refusée, quels que soient les réglages.
  • Les builds non signés (pas de .sig : builds locaux, forks, CI sans le secret) sont refusés par défaut. Ils ne sont acceptés que si le réglage serveur Accepter les builds non signés (développement) est activé et si l’offre est arrivée par le canal chiffré des agents, où le serveur est authentifié par l’épinglage de CA que l’agent a reçu de la commande d’installation de ce même serveur. Sur le canal en clair, n’importe qui au milieu pourrait positionner l’indicateur : les signatures y sont donc obligatoires. Un refus est signalé (état refusé) sans rien télécharger, et il est réévalué quand le réglage change.
  • Les signatures sont des fichiers séparés (<binaire>.sig, 64 octets bruts, aussi servis à /download/<binaire>.sig) : les binaires restent reproductibles bit à bit.

Pour vérifier un binaire à la main :

Fenêtre de terminal
openssl pkeyutl -verify -pubin -inkey release-key.pub.pem -rawin \
-in dumbmonit-agent-linux-x86_64 -sigfile dumbmonit-agent-linux-x86_64.sig

Comment les clés sont créées et utilisées par le workflow de release : Signer les binaires de l’agent. Le canal des agents est décrit dans Sécurité du canal des agents.

Le nouveau binaire est à l’essai jusqu’à ce que le serveur accepte son premier lot. Si cela n’arrive pas dans les 120 s (150 s pour le helper Windows), ou si le binaire s’arrête au démarrage plus de 3 fois (boucle de plantage sous systemd Restart=always, ou actions de récupération de Windows), le binaire précédent est restauré et redémarré. L’échec (rolled_back et sa raison) est signalé au serveur avec le lot suivant.

Ce build n’est alors plus retenté automatiquement sur cette machine, ni par l’agent ni par le serveur, jusqu’à ce qu’un administrateur clique sur Mettre à jour maintenant, qui retente une fois. OpenRC sans supervision ne redémarre pas un agent planté : le retour arrière a alors lieu à son prochain démarrage.

  • Docker : un agent dans un conteneur ne se remplace jamais (l’image ghcr.io/laupernoe/dumbmonit-agent définit DUMBMONIT_AGENT_CONTAINER=1 ; /.dockerenv et /run/.containerenv sont aussi détectés). L’interface dit de mettre à jour son image : docker compose pull && docker compose up -d.
  • macOS : l’image du serveur ne livre pas d’agent macOS. Mettez-les à jour avec install.sh (état non pris en charge).
  • Agents installés avant cette version : ils ne savent pas se mettre à jour (état ancien), relancez la commande d’installation une fois.
  • Dossier non inscriptible : un agent qui ne peut pas écrire dans son dossier signale lecture seule. Relancez la commande d’installation une fois (elle met en place la nouvelle disposition).
  • Pour tous : désactivez Les agents se mettent à jour dans Réglages → Agents, ou choisissez manuel uniquement pour mettre à jour à la demande.
  • Pour un agent : mettez sa surcharge sur désactivé.
  • Sur la machine elle-même : self_update: false dans agent.yaml, ou DUMBMONIT_AGENT_SELF_UPDATE=false (état désactivé localement). Cela l’emporte toujours sur le serveur.

La surveillance de la machine montre la machine : processeur, mémoire, systèmes de fichiers, réseau, santé des disques (SMART), capteurs, santé du système et les services listés dans services. Tout le reste de ce que l’agent détecte est un service, et chaque service trouvé devient une surveillance à part entière, de type agent_service, rangée sous la machine :

ServiceSes métriquesNom de la surveillance
Dockercontainer_*<machine> · Docker
Plakarbackup_*<machine> · Plakar
restic / Borgagent_backup_repo_*<machine> · restic/Borg
ZFSagent_zfs_*<machine> · ZFS
KVM / libvirtagent_libvirt_*<machine> · libvirt
WireGuardagent_wireguard_*<machine> · WireGuard
IPsecagent_ipsec_*<machine> · IPsec
Test de débit Internetagent_speedtest_*<machine> · Speed test

Le découpage se fait sur le serveur, d’après le nom de la métrique : il fonctionne avec toutes les versions de l’agent. Chaque série est écrite une seule fois, avec target égal à la surveillance à laquelle elle appartient : les séries d’un service portent l’identifiant de la surveillance du service, celles de la machine l’identifiant de la machine. Rien n’est compté deux fois.

Une surveillance de service a son propre état, ses alertes, ses règles, ses surcharges de règles et ses silences. Il est injoignable quand l’agent cesse de le rapporter alors que la machine, elle, répond toujours (démon Docker arrêté, wg désinstallé…), après les mêmes trois périodes manquées que la machine. Quand la machine se tait, ses services sont montrés masqués derrière elle (suppressed) au lieu de lever leurs propres alertes. Une nouvelle surveillance de service reprend les étiquettes de la machine : les silences et règles par étiquette continuent de s’appliquer.

Il n’y a rien à choisir avant l’installation. Après le premier rapport, la page de la machine liste chaque module dans Services trouvés par l’agent :

  • un service trouvé est coché et mène à sa surveillance ;
  • un service non trouvé est décoché ; cochez-le pour créer sa surveillance quand même (il reste injoignable tant que l’agent ne le rapporte pas — utile pour être prévenu quand un service dont vous dépendez manque) ;
  • décochez un service trouvé pour supprimer sa surveillance et écarter ses mesures. Le serveur le dit à l’agent dans son prochain accusé de réception, et l’agent cesse de le collecter (un agent plus ancien continue de collecter, et le serveur continue d’écarter). Supprimer la surveillance d’un service a le même effet. Recochez-le pour le faire revenir.

Supprimer la machine supprime ses surveillances de service. Les actions et politiques des conteneurs se règlent depuis la page de la surveillance Docker ; les commandes partent toujours vers l’agent de la machine.

Comme dans la notice de la surveillance :

  1. Installez l’agent sur la machine : chaque service qu’il trouve devient une surveillance sous cette machine dès son premier rapport.
  2. Pour ne plus en surveiller un, décochez-le dans le panneau « Services trouvés par l’agent » de la machine ou supprimez sa surveillance.

Une fois la surveillance supprimée, les mesures de l’agent pour ce service sont écartées.

Rien à faire. La première fois que l’agent rapporte un service après la mise à jour, le serveur crée sa surveillance et y déplace ce qui concernait ce service sur la machine :

  • les surcharges des règles qui lisent les métriques du service sont copiées sur la surveillance du service ;
  • les règles limitées à la machine (sélecteur ids) qui lisent les métriques du service sélectionnent aussi la surveillance du service ;
  • les silences de la machine (fenêtres de maintenance) sont copiés sur la surveillance du service ;
  • les alertes en cours sur les séries du service passent sur la surveillance du service sous leur nouvelle empreinte : elles ne se résolvent pas pour se redéclencher.

L’historique reste là où il a été écrit : VictoriaMetrics ne sait pas réétiqueter des séries existantes, les mesures d’avant la mise à jour restent donc sous la machine (elles disparaissent avec la rétention), et les graphes de la surveillance du service commencent à la mise à jour. Les références des anomalies sur les séries déplacées réapprennent. L’historique des alertes (alertes résolues) reste lui aussi avec la machine.

/etc/dumbmonit/agent.yaml sur Linux, /usr/local/etc/dumbmonit/agent.yaml sur macOS et FreeBSD, C:\ProgramData\DumbMonit\agent.yaml sur Windows :

server_url: https://server:8080
token: dmon_...
interval_secs: 30 # période d'échantillonnage
hostname: nas-basement # optionnel : nom annoncé au serveur
services: # unités systemd ou services Windows
- sshd
- docker
tags: # étiquettes libres, préfixées "tag_" sur le serveur
role: nas
room: basement
docker: true # inventaire de conteneurs (défaut : true)
docker_socket: /var/run/docker.sock
sensors: true # températures et ventilateurs (défaut : true)
smart: true # santé de disque via smartctl (défaut : true)
smart_bin: smartctl # chemin, quand il n'est pas dans le PATH du service
smart_interval_secs: 300 # minimum 60 : un disque endormi n'est jamais réveillé pour être lu
zfs: true # pools ZFS via zpool (défaut : true)
zfs_bin: zpool
zfs_interval_secs: 120 # minimum 30
libvirt: true # domaines KVM et pools de stockage via virsh (défaut : true)
libvirt_bin: virsh
libvirt_uri: qemu:///system
libvirt_interval_secs: 60 # minimum 15
wireguard: true # tunnels WireGuard via wg (défaut : true), voir ci-dessous
ipsec: true # tunnels IPsec via swanctl (défaut : true), voir ci-dessous
speedtest: false # test de débit Internet (défaut : false, opt-in), voir ci-dessous
speedtest_download_url: https://speed.example.lan/backend/garbage.php?ckSize=50
speedtest_upload_url: https://speed.example.lan/backend/empty.php
inventory: true # liste quotidienne des paquets installés, pour la recherche de CVE (défaut : true)
restic_repos: [] # dépôts restic à surveiller, voir "sauvegardes restic et Borg"
borg_repos: [] # dépôts Borg à surveiller
mdaemon: auto # Windows : files MDaemon quand son service existe (true / false / auto)
hyperv: auto # Windows : compteurs Hyper-V quand le service vmms existe (true / false / auto)
perf_counters: # Windows : compteurs de performance à publier
- '\Memory\Available MBytes'
- path: '\Processor(_Total)\% Processor Time'
name: cpu_total # valeur du label "counter" ; le chemin quand omis
max_buffered_samples: 20000
log_level: info

sensors, smart, zfs et libvirt sont détectés, jamais supposés : laissés à true sur une machine sans sonde, sans smartctl, sans pool ou sans virsh, ils coûtent un coup d’œil par période et n’émettent rien du tout. Réglez-en un sur false pour arrêter même de regarder — ça vaut le coup sur un NAS dont vous préférez que smartctl ne touche jamais les disques, bien que l’agent passe déjà -n standby pour qu’un disque endormi ne soit mesuré que quand il est réveillé pour d’autres raisons.

Sur un hyperviseur KVM (un hôte Linux ordinaire avec libvirt, pas Proxmox VE, qui a sa propre intégration), installez l’agent sur l’hôte lui-même, pas dans un invité. L’agent exécute virsh -c qemu:///system avec list --all --name, dominfo --domain <nom>, pool-list --all --name et pool-info --pool <nom> : il ne définit, ne démarre, n’arrête ni ne migre jamais un domaine, et ne modifie jamais un pool de stockage. L’URI explicite qemu:///system compte pour un agent lancé par un membre du groupe libvirt plutôt que par root : sans elle, virsh lirait la session privée, vide, de cet utilisateur. Réglez libvirt_uri pour lire une autre connexion.

agent_libvirt_domain_memory_used_bytes est absente pour un domaine éteint : libvirt n’en connaît que le maximum configuré. Les tailles des pools de stockage viennent de la sortie lisible de virsh, arrondie à deux décimales, donc agent_libvirt_pool_used_percent est une approximation, assez proche pour avertir avant qu’un pool ne se remplisse. Au plus 200 domaines et 64 pools sont détaillés.

À côté, /etc/dumbmonit/agent-secret (C:\ProgramData\DumbMonit\agent-secret sur Windows) contient le secret de liaison que le serveur a donné à cette machine. L’agent l’écrit en mode 0600 et le relit à chaque démarrage ; il ne fait pas partie d’agent.yaml parce que ce n’est pas quelque chose que vous réglez — voir Liaison. DUMBMONIT_AGENT_SECRET_FILE le déplace, ce que vous voulez pour un agent dans un conteneur.

Chaque clé peut être surchargée par l’environnement, ce qui rend l’agent utilisable dans un conteneur sans monter un fichier :

VariableEffet
DUMBMONIT_AGENT_CONFIGChemin du fichier de configuration
DUMBMONIT_AGENT_URLURL du serveur
DUMBMONIT_AGENT_TOKENJeton d’enrôlement
DUMBMONIT_AGENT_SECRET_FILEOù garder le secret de liaison (défaut : agent-secret, à côté du fichier de configuration)
DUMBMONIT_AGENT_INTERVAL_SECSPériode d’échantillonnage
DUMBMONIT_AGENT_HOSTNAMENom annoncé au serveur
DUMBMONIT_AGENT_SERVICESServices à surveiller, séparés par des virgules
DUMBMONIT_AGENT_TAGSkey=value, séparés par des virgules
DUMBMONIT_AGENT_DOCKERtrue / false
DUMBMONIT_AGENT_DOCKER_SOCKETChemin du socket Docker
DUMBMONIT_AGENT_DOCKER_MAX_CONTAINERSConteneurs détaillés par hôte, défaut 200 (0 : compteurs seulement)
DUMBMONIT_AGENT_INTERFACES_IGNOREInterfaces laissées de côté, noms ou regex séparés par des virgules ; défaut ^(veth|br-|docker|virbr|lo$|vEthernet)
DUMBMONIT_AGENT_INTERFACES_ONLYInterfaces à garder ; quand réglé, remplace la liste d’exclusion
DUMBMONIT_AGENT_MOUNTS_IGNOREPoints de montage laissés de côté des systèmes de fichiers et de l’E/S disque ; par défaut ignore /var/lib/docker/, /run/…, /sys/, /proc/, /dev/, /snap/
DUMBMONIT_AGENT_CPU_PER_COREtrue pour aussi envoyer une série CPU par cœur (défaut false)
DUMBMONIT_AGENT_SENSORStrue / false : températures et ventilateurs (défaut true)
DUMBMONIT_AGENT_SMARTtrue / false : santé de disque via smartctl (défaut true)
DUMBMONIT_AGENT_SMART_BINChemin de smartctl
DUMBMONIT_AGENT_SMART_INTERVAL_SECSPériode entre deux lectures SMART, défaut 300, minimum 60
DUMBMONIT_AGENT_ZFStrue / false : pools ZFS via zpool (défaut true)
DUMBMONIT_AGENT_ZFS_BINChemin de zpool
DUMBMONIT_AGENT_ZFS_INTERVAL_SECSPériode entre deux lectures ZFS, défaut 120, minimum 30
DUMBMONIT_AGENT_LIBVIRTtrue / false : domaines KVM et pools de stockage via virsh (défaut true)
DUMBMONIT_AGENT_LIBVIRT_BINChemin de virsh
DUMBMONIT_AGENT_LIBVIRT_URIURI de connexion libvirt, défaut qemu:///system
DUMBMONIT_AGENT_LIBVIRT_INTERVAL_SECSPériode entre deux lectures libvirt, défaut 60, minimum 15
DUMBMONIT_AGENT_WIREGUARDtrue / false : tunnels WireGuard via wg (défaut true)
DUMBMONIT_AGENT_WIREGUARD_BINChemin de wg
DUMBMONIT_AGENT_IPSECtrue / false : tunnels IPsec via swanctl (défaut true)
DUMBMONIT_AGENT_IPSEC_BINChemin de swanctl
DUMBMONIT_AGENT_SPEEDTESTtrue / false : lancer le test de débit Internet (défaut false)
DUMBMONIT_AGENT_SPEEDTEST_DOWNLOAD_URLAdresse téléchargée pour mesurer le débit descendant
DUMBMONIT_AGENT_SPEEDTEST_UPLOAD_URLAdresse où poster pour mesurer le débit montant
DUMBMONIT_AGENT_SPEEDTEST_DOWNLOAD_BYTES_CAPOctets lus au plus par test, défaut 50000000
DUMBMONIT_AGENT_SPEEDTEST_UPLOAD_BYTESOctets envoyés par test, défaut 10000000
DUMBMONIT_AGENT_SPEEDTEST_INTERVAL_SECSPériode entre deux tests, défaut 21600 (6 h), minimum 300
DUMBMONIT_AGENT_SPEEDTEST_MIN_DOWNLOAD_MBPSSeuil d’alerte, débit descendant en Mbps (non défini : pas d’alerte)
DUMBMONIT_AGENT_SPEEDTEST_MIN_UPLOAD_MBPSSeuil d’alerte, débit montant en Mbps (non défini : pas d’alerte)
DUMBMONIT_AGENT_SPEEDTEST_MAX_LATENCY_MSSeuil d’alerte, latence en millisecondes (non défini : pas d’alerte)
DUMBMONIT_AGENT_RESTIC_BINChemin de restic
DUMBMONIT_AGENT_BORG_BINChemin de borg
DUMBMONIT_AGENT_BACKUP_REPOS_INTERVAL_SECSPériode entre deux lectures des dépôts restic et Borg, défaut 600, minimum 60
DUMBMONIT_AGENT_MDAEMONtrue, false ou auto : compteurs de performance de MDaemon (défaut auto, lus quand le service Windows MDaemon existe)
DUMBMONIT_AGENT_HYPERVtrue, false ou auto : compteurs de performance d’Hyper-V (défaut auto, lus quand le service Windows vmms existe)
DUMBMONIT_AGENT_PERF_COUNTERSChemins de compteur de performance Windows, séparés par des points-virgules (une virgule peut faire partie d’un nom d’instance) ; remplace perf_counters
DUMBMONIT_AGENT_MAX_BUFFERED_SAMPLESTaille du tampon de rattrapage
DUMBMONIT_AGENT_LOGtrace, debug, info, warn, error
DUMBMONIT_AGENT_RELAYtrue pour faire tourner, pour le serveur, les sondes des surveillances assignées à cet agent (voir Faire tourner l’agent dans Docker / sur un autre réseau)
DUMBMONIT_AGENT_SITELibellé de site montré à côté de l’agent quand il est proposé comme relais
DUMBMONIT_AGENT_GATEWAY_LISTENPasserelle d’un relais pour les agents de son site, par exemple 0.0.0.0:8443 (gateway_listen:) ; prime sur le port réglé dans l’interface (voir Installer des agents derrière le relais)
DUMBMONIT_AGENT_GATEWAY_MAX_CONNECTIONSConnexions tenues à la fois par la passerelle, 64 par défaut (gateway_max_connections:)
DUMBMONIT_AGENT_GATEWAY_RATE_KIBDébit de chaque tunnel de la passerelle, par sens, en Kio/s, 4096 par défaut (gateway_rate_kib:)

Sur Windows, l’agent lit les compteurs de performance — les valeurs que Performance Monitor (perfmon) montre — via la bibliothèque PDH, et les publie à chaque période d’échantillonnage. Certains logiciels ne publient leur état nulle part ailleurs.

MDaemon. Quand le service Windows nommé MDaemon existe, l’agent lit l’objet de performance MDaemon : tailles de file, sessions, totaux de message et de spam, l’état des serveurs internes de MDaemon et son uptime. Les séries, les règles et la page qui les montre sont décrites sur la page MDaemon. mdaemon: true les lit même sans le service (un service renommé), mdaemon: false ne le fait jamais. La présence du service est vérifiée à nouveau toutes les dix périodes, un MDaemon installé après l’agent est donc pris en compte sans redémarrage.

Serveurs mail (MDaemon et SecurityGateway). Sur la même détection, l’agent lit aussi, sans aucun réglage, ce que seul le serveur lui-même peut dire : l’état et le mode de démarrage des services Windows du produit, la version de son exécutable, le nombre de messages et l’âge du plus ancien dans ses dossiers de files, et l’espace libre du volume qui contient ses données. Il interroge Windows par un appel PowerShell par période (toutes les dix périodes tant qu’aucun produit n’est trouvé). Les séries sont agent_mail_* et sont décrites sur les pages MDaemon et SecurityGateway, qui disent aussi comment une surveillance est liée à son agent. mdaemon: false désactive cela aussi.

Hyper-V. Quand le service Hyper-V Virtual Machine Management (vmms) existe, l’agent lit les objets de performance d’Hyper-V ; voir Hôtes Hyper-V. hyperv: true et hyperv: false forcent le choix, comme pour MDaemon.

Tout autre compteur. Listez son chemin complet sous perf_counters, comme \Object(Instance)\Counter ou \Object\Counter pour un objet avec une seule instance, et il est publié comme dumbmonit_agent_perf_counter{counter="…"}, avec le nom que vous donnez ou le chemin lui-même :

perf_counters:
- '\LogicalDisk(C:)\% Free Space'
- path: '\MSExchangeTransport Queues(_total)\Messages Queued For Delivery'
name: exchange_queue
  • Écrivez les noms de compteur en anglais, comme ils apparaissent dans Performance Monitor sur un Windows anglais : l’agent les ajoute avec PdhAddEnglishCounterW, le même agent.yaml fonctionne donc sur un Windows français ou allemand.
  • Mettez chaque chemin entre guillemets simples en YAML, pour que les barres obliques inverses et le % soient gardés tels quels.
  • Un chemin malformé arrête l’agent au démarrage avec la clé et la raison. Un chemin que Windows ne connaît pas (le logiciel n’est pas installé, le nom est mal orthographié) est rapporté une fois dans le journal, performance counter not available, et les autres compteurs sont quand même lus ; il est retenté toutes les dix périodes.
  • Les débits (…/sec) ont besoin de deux lectures : ils apparaissent à partir de la seconde période.
  • 200 compteurs au plus sont lus. Sur Linux, macOS et FreeBSD le réglage est accepté et rien n’est lu.

Pour voir les noms exacts sur la machine, lancez typeperf -q MDaemon (ou tout autre nom d’objet) dans une invite de commandes.

Installé sur un hôte Hyper-V — Windows Server avec le rôle Hyper-V, ou Windows avec Hyper-V activé — l’agent trouve le service vmms et lit les propres compteurs de performance d’Hyper-V, sans rien à configurer. La page de la surveillance de l’agent montre alors un panneau Hyper-V : combien de machines virtuelles rapportent une santé saine, la vraie charge CPU de l’hôte, la mémoire que chaque VM en cours détient, et le débit, la latence et les erreurs de chaque disque virtuel.

CompteurSérieLabels
\Hyper-V Virtual Machine Health Summary\Health Ok, …\Health Criticalhyperv_vms_health_ok, hyperv_vms_health_critical : machines virtuelles dans chaque état
\Hyper-V Hypervisor Logical Processor(_Total)\% Total Run Timehyperv_host_cpu_percent : la charge de l’hôte, invités inclus
\Hyper-V Hypervisor Logical Processor(_Total)\% Guest Run Timehyperv_host_cpu_guest_percent : la part passée à faire tourner les invités
\Hyper-V Hypervisor\Partitionshyperv_partitions : VM en cours plus l’hôte lui-même
\Hyper-V Dynamic Memory VM(*)\Physical Memory, …\Guest Visible Physical Memoryhyperv_vm_physical_memory_megabytes, hyperv_vm_guest_visible_memory_megabytesvm
\Hyper-V Dynamic Memory VM(*)\Current Pressurehyperv_vm_memory_pressure_percent : demande de mémoire sur mémoire assignée ; au-dessus de 100 la VM veut plus qu’elle n’avm
\Hyper-V Virtual Storage Device(*)\Read Bytes/sec, …\Write Bytes/sechyperv_vhd_read_bytes_per_second, hyperv_vhd_write_bytes_per_seconddisk
\Hyper-V Virtual Storage Device(*)\Latency, …\Queue Lengthhyperv_vhd_latency_seconds (moyenne), hyperv_vhd_queue_lengthdisk
\Hyper-V Virtual Storage Device(*)\Error Counthyperv_vhd_errors_total, un compteurdisk

Sur un hôte Hyper-V, \Processor(_Total)\% Processor Time ne mesure que la propre partition de l’hôte, pas ce que les machines virtuelles consomment : le compteur de processeur logique de l’hyperviseur est celui qui dit si la machine est saturée. vm est le nom de la machine virtuelle comme Hyper-V Manager le montre ; disk est le nom d’instance que Windows donne à chaque disque virtuel, dérivé de son chemin de fichier. Les instances _Total sont laissées de côté, et 200 VM ou disques au plus sont lus par compteur.

Trois règles intégrées s’appliquent :

  • Santé de VM Hyper-V critique : Hyper-V rapporte une VM en santé critique depuis cinq minutes (Avertissement) — le plus souvent un disque qui a manqué d’espace.
  • CPU d’hôte Hyper-V élevé : les processeurs logiques occupés à plus de 90 % depuis quinze minutes (Avis).
  • Erreurs de disque virtuel Hyper-V : un disque virtuel a rapporté des erreurs d’E/S dans la dernière heure (Avis).

L’agent Windows peut aussi déclencher des alertes sur des événements Windows (échecs de connexion, redémarrages inattendus, services plantés, erreurs de disque) : les règles se règlent par machine sur sa page d’équipement, aucune n’existe par défaut. Voir Alertes du journal d’événements Windows.

Faire tourner l’agent dans Docker / sur un autre réseau

Section intitulée « Faire tourner l’agent dans Docker / sur un autre réseau »

L’agent est aussi publié comme image conteneur, avec les mêmes tags que le serveur : ghcr.io/laupernoe/dumbmonit-agent:latest (dernière release), :edge (dernier commit sur main). C’est une image FROM scratch contenant le binaire d’agent et le paquet de CA Mozilla, configurée entièrement par variables d’environnement. Le dépôt fournit un docker-compose.agent.yml prêt à l’emploi :

Fenêtre de terminal
DUMBMONIT_AGENT_URL=https://monitor.example.org \
DUMBMONIT_AGENT_TOKEN=dmon_… \
DUMBMONIT_AGENT_HOSTNAME=docker-host-1 \
docker compose -f docker-compose.agent.yml up -d

Ce que le conteneur voit, et quoi monter :

BesoinQuoi fairePourquoi
CPU, mémoire, charge, E/S disque de l’hôteRien/proc/stat, /proc/meminfo, /proc/loadavg et /proc/diskstats sont à l’échelle de l’hôte dans tout conteneur.
Nom d’hôteDUMBMONIT_AGENT_HOSTNAMELe nom d’hôte d’un conteneur est un id aléatoire ; la surveillance serait nommée d’après lui.
Conteneurs de l’hôte- /var/run/docker.sock:/var/run/docker.sock:roOptionnel. Listes et inspections en lecture seule ; les actions Redémarrer/Mettre à jour demandent qu’il soit accessible en écriture et DUMBMONIT_AGENT_COMMANDS=true. Sans le socket, l’agent rapporte simplement aucun conteneur.
Usage du système de fichiers- /:/host:ro (ou les montages qui vous intéressent)L’agent rapporte les montages visibles à l’intérieur du conteneur, sous leur chemin de conteneur.
Compteurs réseau de l’hôtenetwork_mode: hostLes interfaces sont namespacées : sans ça l’agent voit un veth.
Surveillances ping relayés via cet agentsysctls: net.ipv4.ping_group_range: "0 2147483647"ICMP utilise une socket d’écho, autorisée par ce sysctl : aucune capacité requise. Voir Ping ICMP sans capacité.
CA privée- ./ca-bundle.crt:/etc/ssl/certs/ca-certificates.crt:roServeur derrière un reverse proxy interne, appareils avec des certificats autosignés.
Garder la liaison à travers les recréations- agent-state:/var/lib/dumbmonit-agent et DUMBMONIT_AGENT_SECRET_FILE=/var/lib/dumbmonit-agent/agent-secretLe secret de liaison vit dans le système de fichiers du conteneur, qu’un docker compose up --force-recreate jette. Sans le volume, l’agent revient non lié et quelqu’un doit autoriser le réenrôlement depuis la page de la surveillance chaque fois.

pid: host et privileged: true ne sont jamais nécessaires : l’agent ne collecte aucune métrique par processus.

Un agent peut faire plus que surveiller sa propre machine. Avec relay: true (ou DUMBMONIT_AGENT_RELAY=true), le serveur délègue des sondes à lui : les surveillances dont le réglage Atteint via nomme cet agent ne sont pas sondés par le serveur mais par l’agent, depuis son propre réseau, avec exactement les mêmes collecteurs — SNMP, Proxmox VE, Proxmox Backup Server, Synology, HTTP, TCP, DNS, ping, TLS. Les résultats atterrissent sous la surveillance comme si le serveur l’avait sondé : mêmes métriques, même dernière sonde, mêmes alertes. Un bureau distant, un second homelab ou le réseau d’un client se montrent ainsi dans le seul DumbMonit que vous avez déjà, sans VPN et sans rien à ouvrir du côté distant.

Comment le configurer, étape par étape, est dans Surveiller un site distant.

Un jeton d’enrôlement dit cette machine est autorisée à parler. Il ne dit pas laquelle parle — c’est à ça que sert la clé d’identité (/etc/machine-id, ou le nom d’hôte), et cette clé n’est pas un secret : elle peut être lue sur n’importe quelle machine en quelques secondes.

Donc au premier lot le serveur donne à chaque machine un secret de liaison qui lui est propre. Il n’en garde qu’une empreinte ; l’agent écrit le secret dans /etc/dumbmonit/agent-secret en mode 0600 et le présente dans l’en-tête X-DumbMonit-Agent-Secret à chaque requête ensuite — mesures, commandes de conteneur et sondes relayées pareil. À partir de là :

  • aucune autre machine ne peut envoyer de mesures sous cette surveillance, ni réécrire son nom d’hôte et son système d’exploitation ;
  • aucune autre machine ne peut récupérer — et donc consommer — les commandes Redémarrer et Mettre à jour mises en file pour elle.

La page de la surveillance montre où en est une machine, sous Agent → Liaison :

ÉtatCe que ça signifieQuoi faire
LiéeL’agent détient un secret qui lui est propre.Rien.
Non liée — réenrôler cet hôteUn hôte enrôlé avant que la liaison n’existe, et jamais lié depuis. Le serveur refuse ses mesures, commandes de conteneur et sondes relayées.Cliquez sur Autoriser le réenrôlement sur la page de la surveillance, puis redémarrez l’agent. Si l’agent est antérieur à la liaison, relancez d’abord la commande d’installation sur l’hôte.

Pour ramener un tel hôte :

  1. Si son agent est antérieur à la liaison, relancez la commande d’installation sur lui (le binaire d’agent doit pouvoir stocker un secret de liaison).
  2. Ouvrez sa page de surveillance et cliquez sur Agent → Autoriser le réenrôlement. Ça ouvre une fenêtre d’une heure.
  3. Redémarrez l’agent, ou attendez sa prochaine tentative : ce lot lie l’hôte avec un secret frais et ferme la fenêtre. Un jeton autre que celui qui a enrôlé l’hôte doit toujours pouvoir enrôler (pas épuisé, pas expiré).

Jusque là, le journal de l’agent porte l’explication du serveur :

WARN this agent is not recognised for this machine
reason: This machine was enrolled before agent binding and was never bound
to its agent installation, so the server no longer accepts it. Re-enrol
this host: open its device page in DumbMonit, click 'Allow re-enrolment',
then restart the agent (re-run the install command first if the agent is
older than binding).

Si la machine est reconstruite, son disque remplacé, ou son conteneur d’agent recréé sans le volume qui détient le secret, l’agent revient sans lui et le serveur refuse ses lots. Ce refus est délibéré : une machine qui est liée reste liée jusqu’à ce qu’un humain dise le contraire, sinon la liaison ne protégerait rien.

Le chemin de retour est sur la page de la surveillance : Agent → Autoriser le réenrôlement. Ça ouvre une fenêtre d’une heure pendant laquelle un agent présentant un jeton d’enrôlement valide lie à nouveau cette machine, avec un secret frais ; l’ancien secret arrête de fonctionner, et la fenêtre se ferme dès qu’elle est utilisée. L’agent retente de lui-même pendant ce temps, il n’y a donc rien à redémarrer sur la machine — et rien n’est perdu, puisque ses lectures restent en tampon jusqu’à ce que le lien soit accepté à nouveau.

Jusqu’à ce que quelqu’un ouvre cette fenêtre, le journal de l’agent dit quoi faire :

WARN this agent is not recognised for this machine
reason: This machine is already enrolled and bound to another agent
installation. If you reinstalled it, open its device page in DumbMonit and
click 'Allow re-enrolment', then restart the agent.

L’agent n’oublie son secret que sur ce refus exact. Tout autre 403, par exemple celui d’un reverse proxy ou d’un pare-feu applicatif placé devant DumbMonit, est journalisé et réessayé en conservant le secret.

  • Les jetons sont créés en ajoutant une surveillance de type agent (à usage unique, ou réutilisables pour plusieurs machines) et par le kit Active Directory. Le serveur ne garde qu’une empreinte : le jeton en clair est montré une fois, dans la réponse de création, avec les deux commandes d’installation.
  • L’agent l’envoie comme Authorization: Bearer dmon_… sur POST /api/ingest. Il n’apparaît jamais dans les journaux de l’agent, même tronqué.
  • Réglages → Agents liste les jetons avec leur préfixe, leur portée, leur date de création et leur dernière utilisation. Révoquer arrête chaque agent qui utilise ce jeton à son prochain envoi ; les machines deviennent alors inaccessibles après trois périodes manquées. Relancez l’installateur avec un nouveau jeton pour les réenrôler.
  • Les machines sont des surveillances séparées : révoquer un jeton ne les supprime pas.

La portée d’un jeton est choisie à sa création, et c’est un choix, pas un défaut qui vous arrive :

PortéeCe qu’il enrôleQuand
Usage unique (le défaut)Exactement une machine.Une installation. Une commande d’installation vit dans l’historique du shell, dans un ticket, dans un log de chat ; une à usage unique ne vaut rien une fois utilisée.
Réutilisable pour un parcAutant de machines que vous autorisez — un nombre, ou pas de limite.Un playbook, une image de machine, un lot d’installations.

Les deux peuvent porter une échéance en jours. Une échéance n’arrête que les enrôlements : les machines déjà enrôlées continuent de rapporter après qu’elle passe, ce que vous voulez pour une fenêtre d’installation. Révoquer est ce qui coupe un parc.

Un jeton qui ne peut plus enrôler — épuisé, ou passé son échéance — se montre comme N’enrôle plus dans Réglages → Agents. Ses machines continuent de rapporter ; il ne peut simplement plus en laisser entrer une nouvelle.

Quand le serveur est inaccessible, l’agent continue de mesurer et met ses lectures en tampon mémoire avec leurs horodatages d’origine. Elles sont envoyées dès que le lien revient : un redémarrage de serveur ne laisse aucun trou dans les graphiques. Le tampon est borné (max_buffered_samples, environ une heure par défaut) et abandonne les lectures les plus anciennes quand il est plein. Les tentatives reculent de 2 à 30 secondes avec du jitter, et reprennent aussitôt que le canal du relais retrouve le serveur. Les mesures encore en attente à l’arrêt sont gardées sur disque (pending-samples.json, à côté du secret de liaison) et envoyées au démarrage suivant.

Fenêtre de terminal
dumbmonit-agent --dry-run # affiche les lectures, n'envoie rien
dumbmonit-agent --once # envoie un lot puis sort
journalctl -u dumbmonit-agent -f # journal du service (systemd)
tail -f /var/log/dumbmonit-agent.log # journal du service (OpenRC)
SymptômeCause probable
L’installateur dit « could not reach the server »Mauvaise URL ou jeton. La configuration est écrite : corrigez agent.yaml, puis redémarrez le service.
Le téléchargement échoue avec 404Le serveur n’a pas de binaires d’agent (DUMBMONIT_AGENT_DIR vide). Utilisez --bin=PATH avec un binaire que vous avez construit.
L’installateur s’arrête avec « checksum mismatch »La commande a été copiée avant une mise à jour du serveur (copiez-en une fraîche en ajoutant un serveur avec l’agent), ou le binaire reçu n’est pas celui que le serveur sert : un proxy ou un cache sur le chemin, ou un téléchargement altéré.
L’installateur s’arrête avec « no expected checksum »La commande n’a pas de --sha256 pour cette plateforme : une ancienne commande, ou un binaire macOS (pas fourni par le serveur). Copiez une commande fraîche, ou passez --sha256=<platform>-<arch>:<hex> depuis le .sha256 de la release.
La machine n’apparaît jamaisL’envoi va vers /api/ingest sur l’URL de la commande d’installation ; derrière un reverse proxy, assurez-vous qu’il est transféré et que les corps jusqu’à 16 Mo sont autorisés.
Inaccessible bien que l’agent tourneLe jeton a été révoqué, ou les envois sont rejetés. Vérifiez journalctl -u dumbmonit-agent : l’erreur y est journalisée.
Le journal dit « this agent is not recognised for this machine »La machine est liée à une installation d’agent dont celui-ci n’a pas le secret — une réinstallation, ou un conteneur recréé sans son volume d’état. Ouvrez la page de la surveillance et cliquez sur Autoriser le réenrôlement ; voir Réenrôlement après une réinstallation.
Le journal dit « this machine was enrolled before agent binding »Un hôte qui ne s’est jamais lié à son agent. Cliquez sur Autoriser le réenrôlement sur sa page de surveillance, puis redémarrez l’agent ; voir Hôtes antérieurs à la liaison.
Le journal dit « this agent is too old to be bound to its machine »Le binaire d’agent ne peut pas stocker de secret de liaison. Relancez la commande d’installation sur l’hôte ; si la surveillance existe déjà, cliquez d’abord sur Autoriser le réenrôlement.
Le journal dit « this enrollment token has already enrolled all the machines it was allowed to »Un jeton à usage unique réutilisé. Créez-en un nouveau, ou cochez Plusieurs machines avec cette commande en ajoutant le serveur.
WindowsLes parties du service Windows n’avaient pas été exercées dans l’image de build du projet au moment de l’écriture ; rapportez les problèmes sur GitHub.

Quand l’agent peut lire le socket Docker (docker: true, le défaut, et un utilisateur dans le groupe docker ou root — usermod -aG docker dumbmonit, puis redémarrez l’agent), chaque conteneur devient une poignée de séries, étiquetées container et image (le name:tag que montre docker ps). Si la page de la surveillance dit « No Docker on this machine » tandis que Docker est installé, c’est la première chose à vérifier.

MétriqueSignification
container_up1 en cours, 0 sinon
container_health0 pas de healthcheck, 1 sain, 2 malsain, 3 démarrage
container_restart_countLe compteur de redémarrage de Docker pour le conteneur
container_started_secondsSecondes depuis le dernier démarrage du conteneur (0 quand arrêté)
container_image_age_secondsSecondes depuis la construction de l’image
container_update_available1 quand le registre a une image plus récente pour le même tag, 0 quand à jour, -1 inconnu

La vérification de mise à jour compare le digest de l’image locale avec celui que le registre annonce pour le tag (HEAD /v2/<name>/manifests/<tag>, flux de jeton anonyme sur Docker Hub et GHCR). Elle tourne en arrière-plan au plus une fois par heure par image et ne retarde jamais le cycle de 30 secondes ; un registre privé qui refuse l’accès anonyme se lit simplement comme -1. Désactivez-la avec docker_update_check: false (DUMBMONIT_AGENT_DOCKER_UPDATE_CHECK).

Règles intégrées : Conteneur arrêté (container_up == 0 depuis 2 minutes), Conteneur malsain (container_health == 2 depuis 3 minutes), Conteneur redémarre (trois redémarrages ou plus en 15 minutes), Mise à jour de conteneur disponible (info, après une heure, répétée chaque jour). L’alerte nomme le conteneur.

Sur la page de la surveillance, chaque conteneur a deux actions et deux interrupteurs. Les actions voyagent via un canal de commande : le serveur met la commande en file, l’agent la récupère après son prochain lot (GET /api/agent/commands, même jeton d’enrôlement), la lance, et rapporte le résultat (queued → running → done | failed), avec un court journal que vous pouvez déplier dans l’interface. Les commandes plus vieilles que dix minutes ne sont jamais exécutées ; l’agent lance une commande à la fois.

Une commande en file peut être annulée depuis l’interface tant que l’agent ne l’a pas récupérée. Une commande que personne n’est venu chercher expire après dix minutes, sur le serveur, que l’agent la sonde ou pas — une machine dont l’agent est arrêté ne garde donc jamais un « En file » périmé pour toujours, et ne bloque jamais la prochaine action sur ce conteneur.

L’agent dit au serveur, à chaque lot, s’il accepte les commandes. Quand il ne le fait pas — un agent plus ancien que le canal de commande, ou installé avec commands: false — la page de la surveillance le dit plutôt que de montrer Redémarrer et Mettre à jour, l’API refuse les commandes (409), et les politiques ne mettent rien en file. Réinstallez l’agent avec l’installateur actuel pour activer les actions.

  • Redémarrer — docker restart pour un conteneur en cours, docker start pour un arrêté, puis une vérification de 20 secondes qu’il tourne.
  • Mettre à jour maintenant — récupère le tag que le conteneur utilise déjà, crée un nouveau conteneur avec la même configuration (environnement, montages, ports, labels, réseaux, politique de redémarrage), arrête l’ancien, échange les noms, démarre le nouveau et attend son healthcheck (ou 20 secondes plus une vérification de fonctionnement quand l’image n’en a pas). Si quoi que ce soit échoue, l’agent revient en arrière : le nouveau conteneur est retiré et l’ancien redémarré, et la commande rapporte failed avec la raison. En cas de succès, l’ancien conteneur est retiré et, quand « prune » est activé, l’ancienne image aussi — sauf si un autre conteneur l’utilise encore.

Les conteneurs gérés par Compose (labels com.docker.compose.*) sont mis à jour quand même, mais le résultat avertit que le prochain docker compose up recréera le conteneur depuis le fichier compose. Les conteneurs dont le nom commence par dumbmonit ou dumbmonit sont refusés : le moniteur ne se met jamais lui-même à jour.

Une politique par conteneur est évaluée par le serveur chaque minute :

  • Redémarrer si arrêté — un conteneur rapportant container_up == 0 est redémarré automatiquement, au plus une fois toutes les dix minutes.
  • Mise à jour automatique dans les fenêtres de maintenance — un conteneur avec une mise à jour disponible est mis à jour automatiquement, mais seulement tandis qu’une fenêtre de maintenance (silence) couvre la surveillance, au plus une fois toutes les six heures. Planifiez-en une sur la page Alertes, ou mettez la surveillance en silence depuis sa page. Les politiques pruning l’ancienne image et les fenêtres de maintenance seulement par défaut.

Deux endroits les règlent :

  • la bande Docker sous l’en-tête de la surveillance : « 28 conteneurs · 27 en cours · 3 mises à jour disponibles · politiques : 2 auto-redémarrage, 0 auto-mise à jour », la dernière action et son statut, Gérer les conteneurs (ouvre la liste ci-dessous) et Politiques…, un tableau de chaque conteneur avec les deux interrupteurs et une ligne « Appliquer à tous » — la façon la plus rapide d’activer l’auto-redémarrage pour toute une machine ;
  • les interrupteurs à l’intérieur de chaque ligne de la section Conteneurs, à côté des boutons Redémarrer et Mettre à jour maintenant.

Chaque interrupteur s’enregistre seul (PUT /api/targets/<id>/containers/<name>/policy) ; un échec ne concerne que cette ligne et est montré à côté.

Les actions automatiques se montrent dans « Actions récentes » comme demandées par policy.

  • L’agent n’agit que quand commands: true (le défaut) ; réglez-le sur false pour une machine qui ne doit être que mesurée.
  • L’agent récupère les commandes lui-même, avec son jeton d’enrôlement — rien ne se connecte à la machine. Elles expirent après dix minutes et tournent une à la fois ; l’agent ne récupère jamais un tag différent de celui que le conteneur utilise déjà.
  • Une mise à jour qui ne revient pas saine est annulée vers le conteneur précédent, et l’ancienne image n’est retirée qu’une fois que le nouveau conteneur tourne.
  • Les conteneurs nommés dumbmonit* ou ezymonit* sont refusés, à la main ou par politique : le moniteur n’agit jamais sur ses propres conteneurs. La vérification est faite deux fois — le serveur refuse de mettre la commande en file, et l’agent refuse de la lancer — et l’agent la refait sur le nom que Docker rapporte après inspection du conteneur, nommer l’un par son id ne change donc rien. L’agent refuse aussi d’agir sur son propre conteneur, quel que soit son nom : il ne serait pas là pour finir le travail ou le rapporter.
  • Les conteneurs gérés par Compose sont mis à jour, mais le prochain docker compose up les recrée depuis le fichier compose : montez le tag là aussi.

L’agent peut surveiller les klosets (dépôts) Plakar : toutes les dix minutes, en arrière-plan, il lance plakar at <kloset> ls et info sur chacun et réémet la dernière lecture à chaque cycle.

Plakar est détecté, jamais supposé. Au démarrage et puis à chaque cycle jusqu’à ce qu’il trouve quelque chose, l’agent cherche le binaire plakar (sur PATH, ou plakar_bin) et des klosets dans les emplacements standards. Quand il n’y a aucun binaire, aucun kloset et aucune trace de Plakar (~/.cache/plakar), l’agent n’émet aucune série backup_* du tout, le dit une fois au niveau debug, et la page de la surveillance ne montre aucun panneau Backups — rien à configurer sur les machines sans Plakar. Pour sauter la détection entièrement :

plakar: false # ou DUMBMONIT_AGENT_PLAKAR=false

Rien à configurer : quand plakar_klosets est vide, l’agent trouve les klosets lui-même, dans cet ordre, et lit chaque emplacement une seule fois :

  1. le propre répertoire de configuration de l’agent — $XDG_CONFIG_HOME/plakar, ou ~/.config/plakar du compte sous lequel il tourne (plakar_home quand réglé) ;
  2. /root/.config/plakar ;
  3. /home/*/.config/plakar, par ordre alphabétique ;
  4. /var/lib/plakar, quand ce répertoire existe.

Dans chaque répertoire il lit stores.yml (ou stores.yaml ; l’ancien plakar.yml est accepté aussi) et prend chaque entrée de la carte stores (aussi repositories et klosets) qui a une location. Seule la location est lue : les phrases de passe et secrets rclone qui se trouvent à côté ne sont jamais gardés ni journalisés. Chaque entrée devient le kloset @<name>, lu avec plakar -configdir <dir> at @<name>, un kloset créé par un utilisateur est donc lu même quand l’agent tourne en root. ~/.plakar de chaque compte est ajouté quand il existe (le kloset par défaut de plakar create). Deux comptes nommant des klosets différents de la même façon sont distingués comme @name et <user>:@name.

Le résultat est journalisé une fois à info (et à nouveau seulement quand ça change). Deux jauges, émises seulement une fois Plakar détecté, laissent l’interface distinguer les cas restants : backup_plakar_present (1 quand le binaire tourne) et backup_klosets_found (nombre de klosets lus). La page de la surveillance dit alors « Plakar est installé mais aucun kloset n’a été trouvé », ou liste les klosets. Quand des klosets existent mais que le binaire ne tourne pas (un PATH de service sans plakar, typiquement), ils sont listés comme illisibles avec une indication de régler plakar_bin, et l’agent avertit une fois.

Pour surveiller une liste fixe à la place, nommez-la — la découverte est alors sautée :

plakar: true # défaut : détecter Plakar ; false le cache entièrement
plakar_bin: /usr/bin/plakar # défaut : "plakar" sur PATH
plakar_klosets: # liste explicite : remplace la découverte
- /srv/backups/main
- "@diskext" # un store nommé du compte de l'agent
plakar_home: /home/noe # optionnel : HOME (et répertoire de config) utilisé pour lancer plakar
plakar_interval_secs: 600 # minimum 60
VariableEffet
DUMBMONIT_AGENT_PLAKARtrue / false — surveiller les sauvegardes Plakar quand détecté (défaut true)
DUMBMONIT_AGENT_PLAKAR_BINChemin du binaire plakar
DUMBMONIT_AGENT_PLAKAR_KLOSETSKlosets, séparés par des virgules (remplace la découverte)
DUMBMONIT_AGENT_PLAKAR_HOMERépertoire home utilisé pour lancer plakar
DUMBMONIT_AGENT_PLAKAR_INTERVAL_SECSSecondes entre deux lectures
DUMBMONIT_AGENT_DOCKER_UPDATE_CHECKtrue / false — vérification de registre pour les mises à jour de conteneur
DUMBMONIT_AGENT_COMMANDStrue / false — accepter les actions du serveur

Un kloset chiffré a besoin de sa phrase de passe : mettez-la dans l’entrée du store (plakar store set <name> passphrase=…, ce que plakar store add fait) ou exportez PLAKAR_PASSPHRASE dans l’environnement du service de l’agent. Sans ça, le kloset se lit comme « Ne peut pas être ouvert » (backup_last_status = 0).

Métriques, étiquetées kloset et source (le répertoire qui a été sauvegardé) : backup_last_success_seconds (âge du snapshot le plus récent), backup_snapshot_count, backup_last_status (1 quand le snapshot le plus récent n’a pas d’erreur, 0 quand il en a ou que le kloset ne peut pas être ouvert), backup_size_bytes{kloset} (taille de stockage du dépôt), plus backup_plakar_present et backup_klosets_found décrits ci-dessus. Aucune d’elles n’existe tant que Plakar n’est pas détecté, les règles intégrées ci-dessous ne peuvent donc pas se déclencher sur une machine sans Plakar.

Règles intégrées : Sauvegarde Plakar trop ancienne (avis, aucun snapshot depuis plus de deux jours) et Sauvegarde Plakar échouée (avertissement). La page de la surveillance montre un bloc par kloset — âge de la dernière sauvegarde, nombre de snapshots, taille, dernier statut — et une ligne par source, avec une indication « Sauvegarde trop ancienne » au-delà de deux jours.

Avec Plakar 1.1 installé sur la machine (plakar version), comme l’utilisateur qui possédera les sauvegardes :

Fenêtre de terminal
# 1. un store de kloset, nommé pour que l'agent le trouve dans ~/.config/plakar/stores.yml
plakar store add diskext /mnt/diskext/plakar passphrase=… # ou tout emplacement que Plakar accepte
plakar at @diskext create # ajoutez -plaintext pour éviter le chiffrement
# 2. une première sauvegarde, puis vérifiez-la
plakar at @diskext backup /srv/photos
plakar at @diskext ls

plakar at <path> create et plakar at <path> backup <dir> fonctionnent pareil avec un simple répertoire plutôt que @name ; plakar create sans at utilise ~/.plakar, que l’agent trouve aussi. Planifiez plakar at @diskext backup /srv/photos avec cron ou un timer systemd : l’agent rapporte l’âge du snapshot le plus récent, et alerte quand un jour passe sans aucun — deux jours pour la règle intégrée.

Pour l’essayer localement avec un kloset non chiffré :

Fenêtre de terminal
mkdir -p /tmp/plakar-demo-src && echo hello > /tmp/plakar-demo-src/a.txt
plakar at /tmp/plakar-demo create -plaintext
plakar at /tmp/plakar-demo backup /tmp/plakar-demo-src
plakar at /tmp/plakar-demo ls

puis ajoutez plakar_klosets: ["/tmp/plakar-demo"] à agent.yaml (un chemin nu hors d’un home n’est pas découvert) et vérifiez avec dumbmonit-agent --dry-run que les échantillons backup_* apparaissent.

L’agent peut surveiller des dépôts restic et Borg : toutes les dix minutes, en arrière-plan, il ouvre chaque dépôt que vous déclarez et rapporte s’il a pu être lu et l’âge de son snapshot le plus récent. Rien n’est découvert : un dépôt n’a pas d’emplacement standard et ne peut pas être ouvert sans son mot de passe, chacun est donc listé dans agent.yaml, avec la façon d’obtenir son mot de passe.

Le mot de passe ne quitte jamais la machine. L’agent le donne à restic ou borg seulement via l’environnement du processus enfant ; il n’est jamais journalisé, jamais envoyé au serveur, et les séries ne portent que le nom du dépôt.

restic_repos:
- name: nas # le label "repo" ; défaut : le dépôt, sans identifiants
repository: sftp:backup@nas.lan:/srv/restic # passé comme RESTIC_REPOSITORY, jamais sur la ligne de commande
password_file: /etc/dumbmonit/restic-nas.pass
host: web-01 # optionnel : seulement les snapshots de cet hôte (--host), pour un dépôt partagé
args: ["-o", "sftp.command=ssh -i /etc/dumbmonit/id_backup -o UserKnownHostsFile=/etc/dumbmonit/known_hosts backup@nas.lan -s sftp"]
- name: b2
repository: s3:https://s3.eu-central-003.backblazeb2.com/my-bucket
password_command: cat /etc/dumbmonit/restic-b2.pass # ou toute commande qui l'affiche (RESTIC_PASSWORD_COMMAND)
env: # environnement supplémentaire pour ce dépôt seulement
AWS_ACCESS_KEY_ID: "…"
AWS_SECRET_ACCESS_KEY: "…"
borg_repos:
- name: offsite
repository: ssh://borg@offsite.example.net/./backups # passé comme BORG_REPO
password_file: /etc/dumbmonit/borg-offsite.pass # lu par l'agent, passé comme BORG_PASSPHRASE
glob_archives: "web-01-*" # optionnel : seulement ces archives (--glob-archives)
env:
BORG_RSH: "ssh -i /etc/dumbmonit/id_borg -o UserKnownHostsFile=/etc/dumbmonit/known_hosts"
restic_bin: restic # défaut : sur PATH
borg_bin: borg
backup_repos_interval_secs: 600 # minimum 60

Gardez agent.yaml et les fichiers de mot de passe lisibles par root seulement (chmod 600), comme l’installateur le fait pour agent.yaml. password_command correspond à RESTIC_PASSWORD_COMMAND ou BORG_PASSCOMMAND. Tout ce que les outils lisent depuis leur environnement peut aller sous env (RESTIC_PASSWORD, BORG_PASSPHRASE, clés cloud, BORG_RSH…), et le propre environnement de service de l’agent est aussi transmis.

Ce que l’agent lance, en lecture seule dans le sens le plus strict :

  • restic snapshots --json --latest 1 --no-lock --no-cache : aucun verrou n’est écrit, un dépôt en lecture seule ou append-only peut donc être surveillé, et un prune tenant le verrou exclusif ne fait pas paraître le dépôt en panne ; pas de cache non plus, puisque le service installé ne peut pas écrire dans /root.
  • borg --bypass-lock list --json --last 1 : sans --bypass-lock, la lecture échouerait pendant toute la durée de chaque borg create, qui tient le verrou exclusif. Borg écrit un petit enregistrement de sécurité sous ~/.config/borg ; quand ce home n’est pas accessible en écriture (le service installé tourne avec ProtectHome=yes), l’agent pointe BORG_BASE_DIR vers son /tmp privé à la place, sauf si vous réglez BORG_BASE_DIR vous-même. Un dépôt en mode keyfile a alors besoin de BORG_KEY_FILE dans son env.

Comme le service tourne avec ProtectHome=yes, gardez ce dont les outils ont besoin hors des répertoires home : fichiers de mot de passe, clés SSH et known_hosts sous /etc/dumbmonit/, comme dans l’exemple, et les dépôts locaux sous /srv, /mnt ou /var plutôt que /home. Les lectures tournent l’une après l’autre, dans la limite de mémoire du service (128 Mio avec l’agent lui-même).

Métriques, étiquetées tool (restic ou borg) et repo : agent_backup_repo_reachable (1 quand la dernière lecture a réussi, 0 sinon : dépôt inaccessible, mot de passe refusé, binaire manquant — l’agent journalise la raison une fois, et à nouveau quand elle change), agent_backup_repo_last_snapshot_age_seconds (âge du snapshot le plus récent, absent tant que le dépôt est vide), et agent_backup_repo_last_snapshot_bytes (octets que le snapshot restic le plus récent a traités, restic 0.17 et plus récent). Avec --latest 1, restic renvoie le snapshot le plus récent de chaque ensemble hôte et chemin ; le plus récent de tous est gardé, réglez donc host sur un dépôt partagé par plusieurs machines.

Règles intégrées : Sauvegarde restic/Borg trop ancienne (aucun snapshot depuis plus de 48 heures) et Dépôt restic/Borg inaccessible (depuis 30 minutes). La page de la surveillance montre un panneau Dépôts de sauvegarde, une ligne par dépôt.

Pour vérifier une déclaration, lancez l’agent une fois au premier plan et cherchez les échantillons agent_backup_repo_* :

Fenêtre de terminal
sudo dumbmonit-agent --config /etc/dumbmonit/agent.yaml --dry-run

Sur une machine qui fait tourner WireGuard, l’agent lit chaque interface et chaque pair avec wg show all dump, à chaque cycle. Rien à configurer : sans la commande wg (wireguard-tools) ou sans interface, aucune série n’est émise et aucun panneau montré. wg a besoin de root (CAP_NET_ADMIN) ; le service installé l’a, un agent démarré à la main sous votre propre compte journalise le refus une fois et ne rapporte rien.

Le dump porte aussi la clé privée de l’interface et la clé préparée de chaque pair : l’agent saute les deux champs sans jamais les copier.

Par pair, étiqueté interface, peer (sa clé publique) et allowed_ips : agent_wireguard_peer_handshake_age_seconds (secondes depuis le dernier handshake), agent_wireguard_peer_has_handshake (0 tant que le pair n’en a jamais terminé un), agent_wireguard_peer_keepalive_seconds (son keepalive persistant, 0 quand désactivé), et les compteurs agent_wireguard_peer_rx_bytes et agent_wireguard_peer_tx_bytes ; par interface, agent_wireguard_interface_peers. Pour un pair qui n’a jamais terminé de handshake, l’âge compte depuis le moment où l’agent l’a vu pour la première fois : un tunnel qui n’est jamais monté est silencieux aussi, et rapporté comme tel.

WireGuard n’a pas de noms de pair. Donnez les vôtres dans agent.yaml, par clé publique, et ils deviennent le label name :

wireguard: true # défaut ; false arrête même de regarder
wireguard_bin: wg # défaut : sur PATH
wireguard_peer_names:
"zonmO992nrIL4FgJ3B/wccmu/SBkoX2kDhSYr8KpgRU=": office-gateway
"UsKpqhrXNlYy/+rh2DLAOOEqesn8L8okEwNNorZ09lQ=": laptop

La règle intégrée Pair WireGuard silencieux se déclenche quand un pair avec un keepalive persistant n’a pas terminé de handshake depuis plus de 15 minutes. Tandis qu’un tunnel est monté, WireGuard renouvelle son handshake toutes les deux minutes, et un keepalive le garde monté même sans trafic ; un pair sans keepalive (un téléphone, un portable) peut rester inactif des jours sans rien de cassé, il est donc laissé de côté. Réglez PersistentKeepalive = 25 sur les tunnels qui doivent rester montés (liens site à site, passerelles distantes). N est le seuil de la règle : changez-le dans Alertes → Règles, ou retirez la partie and on (…) de sa requête pour surveiller chaque pair. La page de la surveillance montre un panneau WireGuard avec chaque pair, le temps depuis son dernier handshake, son trafic et son keepalive.

Sur une machine qui fait tourner strongSwan, l’agent lit chaque tunnel configuré avec deux commandes en lecture seule : swanctl --list-conns, pour les CHILD_SA déclarées dans swanctl.conf (ou ipsec.conf via swanctl --load-all), et swanctl --list-sas, pour celles réellement installées. Rien à configurer : sans la commande swanctl ou sans connexion configurée, aucune série n’est émise et aucun panneau n’est affiché. L’agent n’envoie jamais --initiate, --terminate ni aucune commande qui changerait l’état d’un tunnel.

Lire les deux commandes, et pas seulement la liste active, permet de signaler un tunnel qui n’a jamais monté comme hors service plutôt qu’invisible : une CHILD_SA déclarée mais absente de --list-sas compte comme hors service dès le premier cycle.

Par tunnel, avec les étiquettes connection (nom de l’IKE_SA) et tunnel (nom de la CHILD_SA) : agent_ipsec_tunnel_up (1 installé, 0 sinon) et, tant qu’il est monté, les compteurs agent_ipsec_tunnel_bytes_in / agent_ipsec_tunnel_bytes_out et agent_ipsec_tunnel_rekey_seconds (temps restant avant le prochain renouvellement de clé).

ipsec: true # défaut ; false n'essaie même pas de regarder
ipsec_bin: swanctl # défaut : dans le PATH

La règle intégrée Tunnel IPsec hors service se déclenche quand un tunnel configuré n’a aucune CHILD_SA installée pendant dix minutes. La page de la surveillance montre un panneau IPsec avec chaque tunnel, monté ou non, son trafic et le temps avant son prochain renouvellement de clé.

Désactivé par défaut : contrairement à tout le reste de ce que l’agent mesure, ce test consomme de la bande passante (et, sur une ligne limitée ou facturée au volume, de l’argent) à chaque exécution. Il faut à la fois speedtest: true et une adresse de téléchargement ; sans adresse, rien ne tourne même si speedtest vaut true.

Aucun serveur n’est choisi à votre place. DumbMonit ne livre aucun point de mesure par défaut et ne contacte jamais un tiers que vous n’avez pas nommé : vous décidez contre quel serveur votre ligne est mesurée, et qui voit l’adresse de l’agent pendant le test.

Le test est du HTTP simple, en lecture seule côté serveur : un GET sur speedtest_download_url, lu par morceaux et arrêté dès que speedtest_download_bytes_cap octets sont lus (50 Mo par défaut), donne le débit descendant ; un POST de speedtest_upload_bytes octets (10 Mo par défaut) vers speedtest_upload_url, s’il est défini, donne le débit montant ; quelques HEAD sur l’adresse de téléchargement donnent la latence (le plus petit aller-retour) et la gigue. Un serveur qui refuse HEAD laisse seulement latence et gigue sans mesure.

Cela fonctionne contre un backend LibreSpeed auto-hébergé (backend/garbage.php?ckSize=N et backend/empty.php), contre les points de test de Cloudflare (https://speed.cloudflare.com/__down?bytes=N et https://speed.cloudflare.com/__up), ou contre n’importe quel fichier et point de dépôt HTTP à vous.

speedtest: false # défaut : opt-in, ce test consomme de la bande passante
speedtest_download_url: https://speed.cloudflare.com/__down?bytes=50000000
speedtest_upload_url: https://speed.cloudflare.com/__up
speedtest_download_bytes_cap: 50000000 # défaut ; lit au plus ce nombre d'octets
speedtest_upload_bytes: 10000000 # défaut ; envoyés en un bloc
speedtest_interval_secs: 21600 # défaut : 6 heures, minimum 300
speedtest_min_download_mbps: 50 # optionnel : arme « Débit descendant Internet bas »
speedtest_min_upload_mbps: 10 # optionnel : arme « Débit montant Internet bas »
speedtest_max_latency_ms: 80 # optionnel : arme « Latence Internet élevée »

Le test tourne en arrière-plan, au plus une fois par speedtest_interval_secs (6 heures par défaut, jamais moins de 300 secondes : une valeur plus petite arrête l’agent au démarrage) ; un test a aussi lieu quelques secondes après chaque démarrage de l’agent. agent_speedtest_ok vaut 0 quand le téléchargement lui-même a échoué.

Les trois seuils sont volontairement optionnels : tant que vous n’en réglez pas un, Débit descendant Internet bas, Débit montant Internet bas et Latence Internet élevée restent silencieuses, personne ne pouvant deviner ce que « lent » veut dire pour votre ligne. Chaque seuil est publié comme sa propre série (agent_speedtest_download_min_bytes_per_second, etc.) ; changez-le dans agent.yaml, pas dans Alertes → Règles. La page de la surveillance montre un panneau avec les derniers débits, la latence, la gigue et l’âge du test.

L’agent ne lit pas /etc/letsencrypt directement. Chaque certificat que Certbot renouvelle est servi quelque part — un serveur web, un serveur mail, un reverse proxy — et c’est là que DumbMonit le lit : ajoutez une surveillance Certificat TLS (ou un Site web ou API web, pour un site déjà surveillé ainsi) pointé sur le port où le certificat est réellement présenté. Il lit le certificat en direct, pas un fichier sur disque, il attrape donc aussi un renouvellement qui a réussi dans /etc/letsencrypt mais n’a jamais été pris en compte par le service (un reverse proxy qui a besoin d’un reload pour voir le nouveau fichier est le cas habituel, et exactement l’écart qui compte).

Lire /etc/letsencrypt/live/*/cert.pem, la configuration de renouvellement et le journal de Certbot depuis l’agent a été envisagé et écarté : ça dupliquerait la date d’expiration que la surveillance TLS rapporte déjà, tout en ajoutant un second chemin, local à l’hôte, pour la même information — une chose de plus à garder synchronisée après qu’un certificat est déplacé ou un domaine renommé. Un hôte où Certbot tourne mais ne sert rien que DumbMonit peut atteindre directement (une étape de CA interne, un hook de validation DNS) est le seul cas que ça laisse non couvert ; c’est aussi le cas où une surveillance TLS ne pourrait pas aider non plus, puisque rien sur cet hôte ne parle TLS pour être sondé.