191 lines
5.5 KiB
Markdown
191 lines
5.5 KiB
Markdown
# 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
|
|
```
|