Files
nano_metrics/CLAUDE.md
T
Gilles Soulier 8e44b2f335 Initial commit: CLAUDE.md + spec de design Nanometrics
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 07:57:09 +02:00

167 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
> **Langue** : réponds toujours en français.
---
## Skills et outils à utiliser
Toujours utiliser les skills appropriés avant d'agir :
- **brainstorming** — avant toute création de feature, composant ou choix d'architecture
- **writing-plans / executing-plans** — pour toute tâche multi-étapes, planifier avant de coder
- **test-driven-development** — avant d'écrire le code d'implémentation
- **systematic-debugging** — avant de proposer un fix sur un bug ou test qui échoue
- **WebSearch** — rechercher la doc, les crates Rust, les packages Go, les conventions
- **verification-before-completion** — vérifier que ça fonctionne réellement avant de déclarer terminé
- utiliser rtk pour reduire la consommation de token
---
## Vue d'ensemble du projet
**Nanometrics** — système client-serveur de surveillance matérielle (CPU, RAM, disque) avec empreinte quasi nulle sur les machines Debian.
Trois composants :
- **Agent Rust** (`agent/`) — collecte les métriques, envoie via UDP et/ou MQTT
- **Serveur Go** (`server/`) — reçoit les données, expose `/metrics` Prometheus + API REST + WebSocket
- **Dashboard web** (`dashboard/`) — UI servi par Nginx dans Docker, temps réel via WebSocket
Un `README.md` doit être écrit à la racine : installation de l'agent et du serveur, liste des features.
## Métriques collectées
Métriques actuelles : `hostname`, `ip`, `memory_free`, `memory_used`, `hdd_total`, `hdd_free`, `hdd_used`, `cpu_percent`, `status` (online/offline), `uptime`.
L'agent a une **architecture modulaire** : chaque métrique est un module indépendant activable/désactivable via config. Ajouter une métrique = ajouter un module sans toucher au cœur.
## Commandes de build
```bash
# Agent Rust
rtk cargo build --release --manifest-path agent/Cargo.toml
rtk cargo test --manifest-path agent/Cargo.toml
rtk cargo clippy --manifest-path agent/Cargo.toml
# Serveur Go
rtk go test ./server/...
```
## Agent Rust — contraintes non négociables
- **Pas de runtime async** (pas de Tokio). Boucle mono-thread avec `std::thread::sleep` pour les fréquences différenciées (CPU 2s, réseau/uptime 10s, disque 60s).
- **sysinfo avec `default-features = false`** — empêche les threads de fond qui gonflent la RAM.
- **Profil release** : `strip = true`, `opt-level = "z"`, `lto = true`.
- **Config via `config.toml`** (serde) — paramètres serveur, métriques activées, protocoles. Rien de codé en dur.
- **Deux protocoles supportables simultanément** :
- `UDP` — fire-and-forget JSON vers `server_ip:server_port`
- `MQTT` — bidirectionnel vers broker `mqtt_host:mqtt_port` (défaut 10.0.0.3:1883, sans auth)
- **Échange de config au démarrage** : à la connexion, l'agent envoie un message "birth" et récupère sa config depuis le serveur (push/pull bidirectionnel). Le serveur peut envoyer une nouvelle config à l'agent à tout moment.
- **Architecture future** : prévoir un canal de réception de commandes (reboot, shutdown, screen off, update, upgrade, shell cmd…) sans refonte du cœur.
### MQTT — options de l'agent
- **Auto-discovery** : publication du topic de découverte compatible Home Assistant
- **Birth message** : publié à la connexion sur `{topic_base}/{hostname}/status` = `online`
- **Last Will message** : configuré au connect, publié automatiquement par le broker si l'agent disparaît = `offline`
- **Topic base** configurable (défaut : `nanometrics/agents`)
## Serveur Go — contraintes non négociables
- Déployé dans **Docker**`docker-compose.yml` fourni avec Nginx pour le dashboard.
- Goroutine par datagramme UDP reçu pour la désérialisation JSON.
- Écoute MQTT en parallèle (subscribe sur `{topic_base}/#`).
- Métriques exposées via `github.com/prometheus/client_golang` (Gauges) sur `/metrics`.
- **API REST** — endpoints pour le dashboard : agents, métriques, historique, config agents, icônes.
- **WebSocket** — push temps réel vers le dashboard (mise à jour des métriques et changements de statut).
- **SQLite** — persistance des métriques historiques avec rétention configurable.
- **Config agent** : le serveur stocke la config de chaque agent (métriques actives, protocoles, options MQTT). Envoyée à l'agent au birth et pushée si modifiée depuis le dashboard.
## Déploiement systemd (agent)
Le fichier `.service` doit utiliser :
- `DynamicUser=yes` — utilisateur éphémère, `ProtectSystem=strict` + `ProtectHome=read-only` automatiques
- `ConfigurationDirectory=` — accès sécurisé au TOML de config
## Dashboard web — spécifications UI
### Grille principale
- **Une tuile rectangulaire par agent** — grille `auto-fill minmax(220px, 1fr)` responsive.
- Métriques en **icônes** (pas de texte) avec **tooltips** sur chaque icône.
- **Jauges barre** pour CPU, RAM, disque dans les tuiles.
- **Effets** : halo lumineux au survol (couleur selon statut), pression 3D au clic.
- **Tooltips globaux** : positionnés en `position:fixed` via JS (jamais clippés).
- **Jusqu'à 20+ agents** — taille de tuiles configurable.
### SMART disque
- L'agent vérifie si `smartctl` est disponible sur la machine cible.
- Si disponible : collecte l'état SMART simplifié (`PASSED` / `FAILED` + température + reallocated sectors).
- Le popup détail affiche un **bouton SMART** dans la section Stockage (couleur ok/warn/err selon état).
- Clic sur le bouton → popup SMART complet, lisible par un non-expert, **en français** : état général, température, durée de vie estimée, secteurs défectueux, explications simples.
### Popup détail agent (clic sur tuile)
- **Redimensionnable** en largeur et hauteur — dernière taille sauvegardée sur le serveur.
- Pas de bouton "Fermer" — uniquement la croix en haut à droite.
- Icône agent cliquable pour upload custom (SVG/JPG/PNG/WEBP, redim. canvas max 128×128 px ratio préservé, sauvegardée sur le serveur).
- KPIs actuels + **courbes historiques** (SVG) pour CPU et RAM.
- Stockage en jauges barre.
- Protocoles actifs affichés en badges.
- **Bouton icône `fa-gears`** en bas à droite → ouvre le popup de configuration de l'agent.
### Popup configuration agent
- Accessible depuis le popup détail via l'icône gears (bas à droite).
- **Tableau métriques — 3 colonnes** : MÉTRIQUE / UDP / MQTT — une case à cocher par métrique par protocole, indépendantes. Pas d'activation générale du protocole.
- Métriques : cpu, memory, disk, smart, uptime, network, temperature
- Chaque case peut être cochée/décochée indépendamment (ex : CPU via UDP uniquement, température via MQTT uniquement)
- **Paramètres MQTT** : broker, port, topic base, auto-discovery (Home Assistant) toggle, birth message toggle, last will toggle.
- **Commandes distantes** : section affichée mais désactivée (bientôt) — reboot, shutdown, screen off, update, upgrade, shell cmd.
- **Bouton "Envoyer à l'agent"** — pousse la config via API REST → serveur → agent.
### Header
- Logo + LED animée + compteurs agents (total / ok / warn / err).
- Bouton thème clair/sombre.
- Bouton configuration interface (taille tuiles, texte, seuils, rétention historique) — config sauvegardée sur le serveur.
### Footer (status bar)
- Mode LIVE en fond accent (style tmux).
- CPU et RAM du **serveur** avec mini-jauges.
- Horodatage de la dernière actualisation.
### Stockage local des assets
Toutes les ressources web versionnées localement — pas de CDN en production :
```
dashboard/
├── fonts/ (Inter, JetBrains Mono, Share Tech Mono)
├── vendor/
│ └── fontawesome/
├── design_system/
│ ├── tokens/tokens.css
│ └── components/ui-kit.jsx
```
## Design System — règles obligatoires
Toute UI utilise `design_system/`. Lire `design_system/consigne_design_system.md` entièrement avant d'écrire du code UI.
Règles clés :
- **Toujours les variables CSS** — jamais de hex en dur.
- **`data-theme`** obligatoire sur `<html>`. Sans ça, l'UI casse silencieusement.
- **Composants** dans `ui-kit.jsx` avant d'en créer de nouveaux.
- **Icônes** : Font Awesome via `<Icon name="…">` uniquement — pas d'emoji, pas de SVG inline.
- **Polices** : Inter (UI), JetBrains Mono (valeurs numériques), Share Tech Mono (logs/terminal).
- **Labels** : uppercase + `letter-spacing: 0.08em`.
- **Border-radius** : tuiles 10-12px, boutons 8px, pastilles 999px.
- **`user-select:none`** : uniquement sur les éléments purement interactifs (`.hbtn`, `.btn`, `.pop-close`, `.cbox`, `.btn-agent-cfg`, `.tile-head`, `.tile-foot`). Jamais sur les conteneurs de contenu : le texte (hostname, IP, valeurs, labels) et les icônes doivent rester sélectionnables.
### Tokens de statut
| Token | Usage |
|-------|-------|
| `--ok` | état nominal |
| `--warn` | attention, seuil élevé |
| `--err` | erreur, alerte critique |
| `--accent` | action principale (orange Gruvbox) |
| `--blue` | datavis CPU / secondaire |
| `--purple` | MQTT / datavis tertiaire |