Files
nano_metrics/README.md
T
2026-05-31 14:01:28 +02:00

5.5 KiB

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.82"    # 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