Cargo.lock mis à jour pour refléter la version 0.1.11 de l'agent.
Logging temporaire côté serveur pour tracer les payloads SMART.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Un container iperf3 (linux_benchtools_iperf3) tourne depuis 4 mois sur le
même hôte. L'agent se connecte à l'IP du serveur:5201 qui résout vers ce
container existant.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
networkstatic/iperf3 n'est pas disponible sur ECR public (images officielles seulement).
Solution : Dockerfile.iperf3 basé sur alpine:latest + apk add iperf3.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Agent:
- SmartMetrics + champ device (nom du disque ex: sda, nvme0)
- smart: Option<Vec<SmartMetrics>> — tous les disques, pas seulement le 1er
- collect() itère /sys/block, accumule les résultats de tous les disques valides
Serveur:
- SmartMetrics.Device + Smart []SmartMetrics dans AgentMetrics
- InsertMetrics: stocke smart_json (JSON array) au lieu de colonnes plates
- GetLastMetrics: désérialise smart_json
- Migration: smart_json TEXT ajoutée
Dashboard:
- Tuile: une icône shield/triangle par disque avec tooltip incluant le nom
- Popup détail: un bouton SMART par disque (couleur ok/err)
- showSmart(agentId, diskIdx): affiche le disque sélectionné
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
La table metrics existant avant l'ajout du SMART n'avait pas les colonnes
smart_passed/temp/realloc/hours/wear. CREATE TABLE IF NOT EXISTS ne les ajoute
pas rétroactivement — les INSERT échouaient silencieusement, data ignorée.
ALTER TABLE ... ADD COLUMN est idempotent (erreur ignorée si colonne existante).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ServerConfig: champ gauge_type (défaut "compact")
- CSS: classes .gs-* pour la BatteryGauge standard (label + bar 9px + gloss interne)
- Grid: helper renderGaugeRow() — sélectionne compact ou standard selon la config
- Grid: rerenderAll() pour appliquer le changement sans recharger la page
- Popup config serveur: select "Type de jauge" dans la section Affichage des tuiles
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Grid: nouvel agent ajouté en temps réel dès le 1er paquet WebSocket (plus besoin d'actualiser la page)
- Grid: ip/status mis à jour depuis chaque metrics_update (adresse DHCP fraîche)
- WS: diffuse agent_removed lors de la suppression d'un agent (sync multi-onglets)
- Popup détail: min/max RAM sur la période affichée (calculé depuis l'historique déjà chargé)
- CSS: classe .chart-minmax pour l'affichage min/max sous le graphe
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
La requête précédente prenait la dernière ligne (paquet rapide, 2s) qui
a hdd_*/smart_* à NULL. Chaque sous-requête cible maintenant la dernière
valeur non-nulle indépendamment, ce qui restitue les données disque/smart
au rechargement même si le dernier paquet ne les contenait pas.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Retire l'attribut version obsolète
- build.pull: false — BuildKit ne vérifie plus le manifest pour golang:1.22-alpine
- pull_policy: if_not_present — nginx:alpine n'est tiré que si absent du cache
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Le binaire est statique (CGO_ENABLED=0) — scratch suffit. Seuls les
certificats TLS sont copiés depuis le builder golang:1.22-alpine.
Élimine le pull de docker.io/library/alpine qui déclenche le 429.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
GET /api/agents inclut désormais last_metrics (dernière ligne de la table
metrics) pour chaque agent. grid.js l'utilise lors du refresh initial, ce
qui peuple les tuiles sans attendre le prochain message WebSocket.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- nginx: client_max_body_size 10m (limite par défaut 1 Mo bloquait les images)
- icons.go: import _ golang.org/x/image/webp et image/gif pour décoder WEBP/GIF
- index.html: retire SVG de l'accept (serveur le rejette) et corrige le hint
- popups.js: try/catch autour de uploadIcon → message d'erreur visible dans le hint
pendant 4s si l'upload échoue ; reset du file input pour re-sélectionner le même
fichier ; rafraîchit l'img de la tuile avec cache-busting après succès
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- 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>
- 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>
- 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>
- 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>
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>
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>