# 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 ```bash # Rust (si non installé) curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh ``` ### Compilation ```bash cargo build --release --manifest-path agent/Cargo.toml # Binaire produit : agent/target/release/nanometrics-agent (~1 Mo) ``` ### Configuration Créer `/etc/nanometrics/config.toml` : ```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 ```bash # 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 : ```bash sudo apt install smartmontools ``` --- ## Installation du serveur Go + dashboard ### Prérequis - Docker et Docker Compose ### Lancement ```bash 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 ```bash # 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 ```