Commit Graph

49 Commits

Author SHA1 Message Date
Gilles Soulier f604e22f6e fix(deploy): permissions config et prompt d'écrasement au réinstall
- ConfigurationDirectoryMode 0750→0755 : le DynamicUser (sans groupe root)
  peut maintenant traverser /etc/nanometrics et lire config.toml
- chmod 644 systématique sur config.toml même si conservé (corrige les
  anciennes installs en 640 qui causent un PermissionDenied au démarrage)
- Prompt interactif si config existe : o=écraser, N=conserver ; variable
  OVERWRITE_CONFIG=true pour forcer sans interaction (curl|bash)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 21:49:13 +02:00
Gilles Soulier 8d4dc0e853 fix(deploy): arrêt du service avant remplacement du binaire
Évite l'erreur "Fichier texte occupé" lors d'une mise à jour à chaud.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v0.1.2
2026-05-22 20:32:17 +02:00
Gilles Soulier 311bdbc66d chore: version agent 0.1.2 2026-05-22 20:28:30 +02:00
Gilles Soulier 0df716b8b0 feat: version agent remontée au serveur et affichée dans la popup
- payload.rs : champ version (env!("CARGO_PKG_VERSION"))
- models.go  : Version dans AgentMetrics et Agent
- db.go      : colonne version dans agents + migration ALTER TABLE
- popups.js  : badge version dans la section INFORMATIONS

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 20:27:26 +02:00
Gilles Soulier 243c97d71b fix: disque via statvfs() — valeurs identiques à df
Remplace sysinfo::Disks par un appel direct à libc::statvfs("/").
- used  = (f_blocks − f_bfree) × f_frsize  → correspond à df "Utilisé"
- free  = f_bavail × f_frsize              → correspond à df "Dispo"
- total = f_blocks × f_frsize

Avant (sysinfo) : used comptait les blocs réservés root → surestimation de ~3-4 Go.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v0.1.1
2026-05-22 20:21:58 +02:00
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
Gilles Soulier 93747e4a04 feat: favicons + correctifs tuile (RAM overflow, corbeille droite)
Favicons :
- favicon.svg (scalable, navigateurs modernes)
- favicon.ico (16/32/48px, compatibilité universelle)
- favicon-{16,32,48,96,180,192,512}.png
- favicon-180.png pour apple-touch-icon
- site.webmanifest pour PWA / ajout écran d'accueil Android
- Couleurs Gruvbox : fond #282828, accent orange, LED verte

Tuile :
- g-val : min-width + white-space:nowrap (RAM 3.0Go/5.8Go ne déborde plus)
- tile-foot : justify-content:space-between + tile-foot-info wrapper
  (corbeille alignée en bas à droite)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 20:07:40 +02:00
Gilles Soulier b93b55d5a8 fix: RAM déborde de la tuile, corbeille alignée à droite
- g-val : largeur fixe 34px → min-width + white-space:nowrap (RAM "3.0Go/5.8Go")
- tile-foot : justify-content:space-between + wrapper tile-foot-info
  pour que la corbeille soit toujours en bas à droite

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 20:06:21 +02:00
Gilles Soulier 46209b2965 fix: chmod 644 sur config.toml (DynamicUser ne peut pas lire 640)
Avec DynamicUser=yes, le fichier config.toml créé en root:root 640
n'est pas lisible par l'utilisateur dynamique → exit 101 (panic Rust).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 19:58:02 +02:00
Gilles Soulier 775d54f07c feat: suppression agent, RAM en Go, métriques par défaut (cpu/mem/disk/smart)
- API DELETE /api/agents/{id} — supprime agent + métriques + config + icône
- Bouton poubelle sur chaque tuile + dialog de confirmation
- RAM : affichage "utilisé/total" en Go (ex: 6.2Go/8.0Go) au lieu du %
- Config agent par défaut : cpu, memory, disk, smart activés (UDP)
- DefaultAgentConfig() dans models pour les nouveaux agents

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 19:54:10 +02:00
Gilles Soulier e9524858f5 feat: commande d'installation agent dans la config serveur
Nouvelle section "INSTALLATION AGENT" en bas du popup de configuration :
champ lecture seule avec la commande curl pré-remplie (SERVER_IP auto
depuis window.location.hostname) + bouton Copier.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 19:46:52 +02:00
Gilles Soulier 1a1202abcf fix: valeurs par défaut install.sh (serveur 10.0.0.50, MQTT 10.0.0.3)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 19:42:39 +02:00
Gilles Soulier c526a6e5ca fix: cross-compilation musl pour release multi-arch
- rumqttc : use-native-tls → use-rustls (supprime dépendance OpenSSL)
- .cargo/config.toml (racine) : linkers musl + CC/AR pour ring aarch64
- deploy/release.sh : passe CC_aarch64_unknown_linux_musl au build
- .gitignore : règle config.toml affinée (exclut cargo configs)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 19:42:08 +02:00
Gilles Soulier 91f4b43b6f feat: scripts de déploiement et release multi-arch
- deploy/install.sh  : installeur curl-able (détecte l'arch, télécharge
  depuis la dernière release Gitea, configure le service systemd)
- deploy/release.sh  : build musl statique x86_64 + aarch64, crée la
  release Gitea et uploade les binaires en asset
- deploy/install-agent.sh : installeur local depuis le binaire compilé
- server/Dockerfile.dev + docker-compose.dev.yml : stack dev Docker

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v0.1.0
2026-05-22 19:31:53 +02:00
Gilles Soulier 6eed88ac99 feat(server): DASHBOARD_DIR pour servir le dashboard en dev sans Nginx 2026-05-22 17:57:34 +02:00
Gilles Soulier 8a8198a51a feat: métriques serveur dans footer dashboard + notification offline WS 2026-05-22 17:46:55 +02:00
Gilles Soulier 6f79554cce docs: README installation agent, serveur et dashboard 2026-05-22 17:43:22 +02:00
Gilles Soulier c26584e4ae chore: gitignore agent/target et artefacts de build 2026-05-22 17:16:14 +02:00
Gilles Soulier a19705ffda fix(dashboard): XSS escaping, ResizeObserver leak, WS reconnect timer
- Ajout de esc() dans api.js pour échapper les valeurs serveur avant injection innerHTML
- Application de esc() sur hostname, ip et agentId dans grid.js et popups.js
- Fix fuite mémoire ResizeObserver dans showDetail : déconnexion avant recréation (_resizeObs)
- Fix WebSocket reconnect : clearTimeout avant setTimeout pour éviter les timers concurrents (_reconnectTimer)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 12:46:37 +02:00
Gilles Soulier 555ddc3556 feat(dashboard): app principale WebSocket + orchestration 2026-05-22 12:43:33 +02:00
Gilles Soulier 182d520675 feat(dashboard): popups détail, config agent, SMART, config serveur 2026-05-22 12:43:15 +02:00
Gilles Soulier 8cd18b14b2 feat(dashboard): rendu grille + tuiles dynamiques 2026-05-22 12:41:26 +02:00
Gilles Soulier 5f7cf9f837 feat(dashboard): courbes SVG sparklines 2026-05-22 12:40:55 +02:00
Gilles Soulier 4cfa628036 feat(dashboard): client API REST 2026-05-22 12:40:39 +02:00
Gilles Soulier 96b9885fb3 fix(dashboard): tokens glow, scroll scfg-body, déduplication polices
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 12:36:54 +02:00
Gilles Soulier 4265b77996 fix(dashboard): retirer user-select:none de .f-mode 2026-05-22 12:34:26 +02:00
Gilles Soulier 9e36f03a5c feat(dashboard): structure HTML + CSS complet
Ajout de la structure de base du dashboard Nanometrics :
- index.html avec header, grille agents, footer et 4 popups (détail, config agent, config serveur, SMART)
- css/app.css avec design system complet (tokens dark/light, composants, animations)
- Polices locales : Inter, JetBrains Mono, Share Tech Mono (woff2)
- Font Awesome 6.5.1 en local (vendor/fontawesome)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 12:33:02 +02:00
Gilles Soulier 544989542f agent + server go 2026-05-22 12:25:31 +02:00
Gilles Soulier feba5d6b93 fix(server): race WebSocket, SVG refusé, rows.Err, time.NewTicker
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 12:18:25 +02:00
Gilles Soulier c0c7152b47 feat(server): main.go assemblage complet + Docker + Nginx
- Assemble tous les packages (config, db, handlers, transport, websocket, prometheus)
- Boucle de rétention et détection offline toutes les minutes
- Routage REST /api/agents/, /api/config, /metrics, /ws
- Dockerfile multi-stage CGO_ENABLED=0 (alpine:3.19)
- docker-compose.yml avec service server + dashboard Nginx
- nginx.conf avec proxy WebSocket et fallback SPA

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 12:13:10 +02:00
Gilles Soulier 262413e2e3 feat(server): handlers REST + transport MQTT
Ajout des handlers HTTP (agents, métriques historique, config agent/serveur, icônes upload/get) et du client MQTT serveur avec subscribe automatique et PushConfig.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 12:10:34 +02:00
Gilles Soulier f5219f3c68 feat(server): UDP listener, hub WebSocket, Gauges Prometheus
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 12:08:11 +02:00
Gilles Soulier bceee08ce4 feat(server): DB SQLite CRUD agents/metrics/config/icons + tests
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 12:06:11 +02:00
Gilles Soulier 2aa0c3be86 feat(server): go.mod + config + modèles de données
Initialise le module Go github.com/user/nanometrics/server avec toutes
les dépendances (SQLite, gorilla/websocket, paho.mqtt, prometheus,
imaging). Ajoute config.go (Load/Default via env vars) et models.go
(AgentMetrics, SmartMetrics, Agent, AgentConfig, ServerConfig, WSMessage).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 12:03:47 +02:00
Gilles Soulier 331415bbab fix(agent): filtrage CPU/RAM par config + nettoyage commentaires
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 11:49:05 +02:00
Gilles Soulier 12203f453f feat(agent): service systemd DynamicUser + documentation déploiement
- Ajoute deploy/nanometrics-agent.service avec DynamicUser, ProtectSystem,
  PrivateTmp, NoNewPrivileges et RestrictAddressFamilies
- Ajoute deploy/README.md avec procédure d'installation/désinstallation
- Corrige 3 avertissements clippy : iter_kv_map (network.rs) et
  collapsible_match (mqtt.rs)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 11:44:13 +02:00
Gilles Soulier 960fd02fd7 feat(agent): boucle principale avec timers 2s/10s/60s 2026-05-22 11:42:00 +02:00
Gilles Soulier a85e5cbee2 feat(agent): transport MQTT birth/LWT/subscribe config
Implémente le transport MQTT complet avec rumqttc 0.24 :
- Birth message (online) au ConnAck + subscribe config topic
- Last Will Testament (offline) configuré au connect
- Réception config agent via topic {base}/{hostname}/config
- publish_metrics helper pour envoyer les métriques
- Transport::Tcp forcé pour broker sans TLS (malgré use-native-tls feature)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 11:39:58 +02:00
Gilles Soulier 5ef0461e65 feat(agent): transport UDP fire-and-forget + test loopback 2026-05-22 11:37:45 +02:00
Gilles Soulier b53456dad8 feat(agent): collecte SMART via smartctl -j 2026-05-22 11:36:51 +02:00
Gilles Soulier b78788b931 feat(agent): métriques disque et température 2026-05-22 11:35:24 +02:00
Gilles Soulier 22212460fc feat(agent): métriques CPU, RAM, réseau, uptime
Implémentation complète des 4 modules sysinfo 0.30 (sans default-features).
- cpu: moyenne sur tous les cœurs via refresh_cpu_usage()
- memory: used/free/total via System
- network: total_received/total_transmitted via Networks
- uptime: System::uptime() statique
10 tests unitaires passent.
2026-05-22 11:34:30 +02:00
Gilles Soulier c473ed9dfa feat(agent): payload AgentMetrics + SmartMetrics + tests
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 11:32:31 +02:00
Gilles Soulier 91c5f15d4c feat(agent): config struct avec valeurs par défaut MQTT + tests
TDD : 3 tests d'intégration écrits en premier (config_test.rs), puis
implémentation MqttConfig avec default_mqtt_host/port/topic_base pour
garantir des valeurs par défaut même si la section [protocols.mqtt] est
minimale dans le TOML.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 11:30:46 +02:00
Gilles Soulier 3f5c735507 feat(agent): setup Cargo.toml et structure complète
Initialise la structure de l'agent Rust avec tous les modules stub :
config, payload, metrics (cpu/memory/disk/network/uptime/temperature/smart),
transport (udp/mqtt). Corrige les features sysinfo 0.30 (pas de feature
disk/networks séparées). Compile sans erreurs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 08:21:34 +02:00
Gilles Soulier 395e006014 1 2026-05-22 08:19:27 +02:00
Gilles Soulier 5ea3436438 1 2026-05-22 08:18:42 +02:00
Gilles Soulier a0f47bf966 feat: add plans, design system, CONSIGNE and brainstorm assets
Ajoute les trois plans d'implémentation (agent Rust, serveur Go, dashboard),
les consignes de design, les fichiers de brainstorming et le .gitignore.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-22 08:13:53 +02:00
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