Gilles Soulier e0ed96309c fix: conserver les métriques lentes (disque, smart) entre les paquets
Le disque est envoyé toutes les 60s mais les paquets arrivent toutes les 2s.
Chaque nouveau paquet écrasait les champs null, effaçant le disque affiché.
Correction : fusion avec les anciennes métriques, null ne remplace pas une valeur.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 20:14:45 +02:00
2026-05-22 12:25:31 +02:00
1
2026-05-22 08:18:42 +02:00

Nanometrics

Système client-serveur de surveillance matérielle (CPU, RAM, disque) conçu pour une empreinte quasi nulle sur les machines Debian.

Architecture

┌─────────────────┐       UDP / MQTT       ┌──────────────────────────┐
│  Agent Rust     │ ─────────────────────▶ │  Serveur Go              │
│  ~1 Mo binaire  │                        │  SQLite · Prometheus      │
│  systemd        │                        │  REST API · WebSocket     │
└─────────────────┘                        └──────────┬───────────────┘
                                                      │ HTTP
                                           ┌──────────▼───────────────┐
                                           │  Dashboard Nginx          │
                                           │  HTML/CSS/JS · temps réel │
                                           └──────────────────────────┘

Fonctionnalités

  • Métriques collectées : CPU, RAM (libre/utilisée), disque (total/libre/utilisé), uptime, réseau, température, SMART (si smartctl disponible)
  • Double protocole : UDP (fire-and-forget) et/ou MQTT (bidirectionnel, compatible Home Assistant auto-discovery)
  • Temps réel : WebSocket — mise à jour des tuiles sans rechargement
  • Historique : SQLite avec rétention configurable (7 à 365 jours)
  • Dashboard interactif : grille responsive, popup détail avec courbes, configuration par agent depuis l'UI
  • Empreinte agent minimale : pas de runtime async (pas de Tokio), boucle mono-thread, sysinfo sans threads de fond
  • Sécurité systemd : DynamicUser=yes, ProtectSystem=strict, ProtectHome=read-only

Installation de l'agent Rust

Prérequis

# Rust (si non installé)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Compilation

cargo build --release --manifest-path agent/Cargo.toml
# Binaire produit : agent/target/release/nanometrics-agent (~1 Mo)

Configuration

Créer /etc/nanometrics/config.toml :

[server]
ip = "10.0.0.50"    # IP du serveur Go
port = 9999          # Port UDP du serveur

[mqtt]
enabled = false
host = "10.0.0.3"
port = 1883
topic_base = "nanometrics/agents"
auto_discovery = true
birth_message = true
last_will = true

[metrics.cpu]
enabled = true
udp = true
mqtt = false

[metrics.memory]
enabled = true
udp = true
mqtt = false

[metrics.disk]
enabled = true
udp = true
mqtt = false

[metrics.smart]
enabled = true    # nécessite smartctl installé
udp = true
mqtt = false

[metrics.uptime]
enabled = true
udp = true
mqtt = false

[metrics.network]
enabled = true
udp = true
mqtt = false

[metrics.temperature]
enabled = true
udp = true
mqtt = false

Déploiement systemd

# Copier le binaire
sudo cp agent/target/release/nanometrics-agent /usr/local/bin/

# Créer le répertoire de config
sudo mkdir -p /etc/nanometrics
sudo cp agent/config.toml /etc/nanometrics/config.toml

# Installer le service
sudo cp deploy/nanometrics-agent.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now nanometrics-agent

# Vérifier
sudo systemctl status nanometrics-agent
journalctl -u nanometrics-agent -f

Pour SMART, installer smartmontools sur la machine cible :

sudo apt install smartmontools

Installation du serveur Go + dashboard

Prérequis

  • Docker et Docker Compose

Lancement

cd server
docker compose up -d

Le dashboard est disponible sur http://<ip-serveur> (port 80).

Variables d'environnement

Variable Défaut Description
UDP_ADDR 0.0.0.0:9999 Adresse d'écoute UDP
HTTP_ADDR 0.0.0.0:8080 Adresse du serveur HTTP
DB_PATH /data/nanometrics.db Chemin de la base SQLite
MQTT_BROKER tcp://10.0.0.3:1883 Adresse du broker MQTT
MQTT_TOPIC_BASE nanometrics/agents Topic MQTT de base

Endpoints exposés

Endpoint Description
GET /api/agents Liste de tous les agents
GET /api/agents/{id}/history Historique des métriques
GET /api/agents/{id}/config Configuration d'un agent
PUT /api/agents/{id}/config Modifier la config d'un agent
POST /api/agents/{id}/icon Upload d'icône (JPG/PNG/WEBP)
GET /api/config Configuration serveur
PUT /api/config Modifier la configuration serveur
GET /metrics Métriques Prometheus
WS /ws WebSocket temps réel

Commandes de développement

# Agent Rust — build, tests, lint
cargo build --release --manifest-path agent/Cargo.toml
cargo test --manifest-path agent/Cargo.toml
cargo clippy --manifest-path agent/Cargo.toml

# Serveur Go — tests, vet
go test ./server/...
go vet ./server/...

# Serveur Go — lancement local (sans Docker)
cd server
DB_PATH=/tmp/nm.db HTTP_ADDR=0.0.0.0:8080 UDP_ADDR=0.0.0.0:9999 go run .

# Simuler un agent avec netcat
echo '{"hostname":"test-01","ip":"127.0.0.1","status":"online","cpu_percent":42.5,"memory_used":3000000000,"memory_total":8000000000,"hdd_used":60000000000,"hdd_total":200000000000,"uptime":86400}' \
  | nc -u 127.0.0.1 9999
S
Description
No description provided
Readme 28 MiB
Languages
HTML 66.9%
JavaScript 12.8%
Go 6.6%
Rust 6%
CSS 5.7%
Other 1.9%