Quarante machines. Une page.
Vos serveurs s'analysent eux-mêmes et envoient leurs résultats. Le disque qui se remplit en premier apparaît en haut. Le hub ne touche jamais aux machines qu'il surveille.
docker pull ghcr.io/unalcakir28/spacetrace-hub:main| Hôte | Racine | Libre | Croissance | 14 derniers jours | Plein dans |
|---|---|---|---|---|---|
| db-02 | /var/lib/postgresql | 18.2 GiB / 500 GiB | +3.1 GiB/day | 6 jours | |
| nas | /volume1/backups | 402 GiB / 8.0 TiB | +41 GiB/day | 10 jours | |
| srv-01 | /srv | 120 GiB / 400 GiB | +1.4 GiB/day | 85 jours | |
| ci-runner-1 | /var/lib/docker | 96 GiB / 250 GiB | −2.0 GiB/day | — r² 0.11 | |
| build-03 | /home | 1.1 TiB / 2.0 TiB | — | — 2 instantanés | |
| /var/mail | — capacité non enregistrée | +180 MiB/day | — |
Dessiné plutôt que capturé. Le vrai tableau de bord est du HTML rendu par le serveur — un outil auto-hébergé qui réclame un npm install avant de vous montrer une page est un outil moins bon.
Mise en place
Deux identifiants, un fichier de configuration et une ligne ajoutée à chaque agent. Il n'y a rien d'autre à déployer.
Créez un jeton admin et une configuration
head -c 32 /dev/urandom | od -An -tx1 | tr -d ' \n' > admin-tokendb = "/var/lib/spacetrace-hub/hub.sqlite" listen = "0.0.0.0:8080" admin_token_file = "/run/secrets/admin-token" keep_per_target = 90
Enregistrez-la sous hub.toml, puis docker compose up -d — ou lancez le binaire directement et validez la configuration avant de servir.
Connectez-vous et créez un jeton d'agent
Ouvrez le hub, connectez-vous avec le contenu d'admin-token et créez un jeton sur la page Agents. Ou faites-le en ligne de commande.
spacetrace-hub --config hub.toml token nasPointez chaque agent vers lui
spacetrace-agent --config /etc/spacetrace/agent.toml push https://hub.example.com --token <agent token>Ajoutez cela au calendrier de l'agent et la flotte se remplit d'elle-même. Renvoyer est sans effet : un instantané déjà présent avec le même hôte, la même racine et la même heure de début est ignoré.
Mettez du TLS devant
Avant d'exposer le hub hors de votre réseau, terminez le TLS dans un reverse proxy. Le cookie de session est HttpOnly et SameSite=Strict ; le drapeau Secure vient du fait de le servir en HTTPS.
Deux identifiants, volontairement
Un jeton posé dans un fichier de configuration sur un NAS ne doit pas être la clé de l'inventaire de toute la flotte. Un jeton d'agent n'est donc pas un identifiant de tableau de bord — et l'inverse est vrai aussi.
Les jetons d'agent sont stockés sous forme de hachages SHA-256 : une copie de la base n'est pas un jeu d'identifiants fonctionnels. Révoquer conserve la trace et rend le jeton inopérant immédiatement.
Les deux sens sont couverts par des tests.
| Identifiant | Peut | Ne peut pas |
|---|---|---|
| Jeton d'agent | Envoyer un instantané | Lire le tableau de bord ou l'API |
| Jeton admin | Tout lire, gérer les jetons et les règles | Envoyer des instantanés |
La prévision est la fonction la plus retenue
C'est celle qui a le plus de chances d'être fausse, donc celle qui refuse le plus souvent de répondre. « Plein dans N jours » n'apparaît que si tout ceci est vrai.
Au moins trois instantanés, couvrant au moins un jour
Deux points font toujours une droite parfaite. Un jour est le plus court intervalle où un motif quotidien peut apparaître.
Un ajustement linéaire de r² ≥ 0,5
L'usage disque n'est souvent pas linéaire. Une rotation de journaux ou une restauration ponctuelle produisent volontiers une droite dont la pente ne veut rien dire.
Une capacité réellement mesurée
Sans la taille réelle du système de fichiers, il n'y a rien à remplir. Le hub ne la devine pas à partir du plus grand total qu'il a vu.
Une réponse à moins de dix ans
« Plein dans 4 000 jours » est de l'arithmétique, pas de l'information.
La croissance et la prévision sont deux nombres différents
La croissance est mesurée sur le dossier analysé. La prévision projette l'espace restant du système de fichiers à ce rythme. Les pages disent lequel est lequel plutôt que de les fondre en un seul chiffre rassurant.
Alertes
Des règles de seuil, livrées par webhook. Trois types, chacun avec un délai de repos pour qu'un disque qui se remplit ne devienne pas un flot de messages identiques :
- Espace libre sous un pourcentage
- Croissance au-dessus d'un rythme
- Une prévision qui tombe dans un horizon donné
L'envoi par e-mail n'est pas encore implémenté, et il y a un seul identifiant admin plutôt que des comptes par personne.
API HTTP
| GET /health | — |
|---|---|
| POST /snapshots | Jeton d'agent |
| GET /api/fleet | Jeton admin |
| GET /target?host=&root= | Jeton admin |
| GET /alerts | Jeton admin |
| GET /tokens | Jeton admin |
Pourquoi il n'y a pas de table d'agrégats
Les instantanés sont conservés tels quels dans le même stockage que celui utilisé par la ligne de commande et l'agent. Le hub ne tient aucune table de résumé propre : rien ne peut donc dériver par rapport aux instantanés dont il découle.
Ce qu'un agent envoie est le fichier même qu'il conserve localement : rien n'est converti d'un côté ni de l'autre, et la comparaison sur la page d'une cible est calculée par le même code que sur votre portable.