Guide d'installation, configuration, utilisation et reference de securite.
Docker Visualizer est un outil de supervision visuelle pour les infrastructures Docker. Il se connecte a vos hotes distants via SSH, collecte les informations Docker (conteneurs, reseaux, volumes, statistiques) et les presente dans une interface web intuitive.
docker inspect, docker stats et docker network inspect
pour collecter les donnees. Vos serveurs restent inchanges.
docker (groupe docker ou root)# Cloner le projet
git clone https://github.com/votre-repo/docker-visualizer.git
cd docker-visualizer
# Installer les dependances
npm install
# Demarrer l'application
npm start
L'application est accessible sur http://localhost:4000.
express (serveur HTTP),
ssh2 (connexion SSH) et cors (gestion des origines croisees).
Pas de base de donnees requise.
# Demarrage avec rechargement automatique
npm run dev
Le fichier de configuration principal est src/config/app.json.
S'il n'existe pas, les valeurs par defaut sont utilisees :
{
"server": {
"port": 4000,
"host": "0.0.0.0"
},
"ssh": {
"connectTimeout": 10000,
"commandTimeout": 30000,
"keepaliveInterval": 5000,
"keepaliveCountMax": 3
},
"snapshots": {
"directory": "data/snapshots",
"maxPerHost": 50
},
"collect": {
"includeStats": true,
"includeSystemInfo": true,
"includeImages": false
}
}
| Section | Parametre | Defaut | Description |
|---|---|---|---|
| server | port | 4000 | Port d'ecoute du serveur HTTP |
| server | host | 0.0.0.0 | Interface d'ecoute |
| ssh | connectTimeout | 10000 | Timeout de connexion SSH (ms) |
| ssh | commandTimeout | 30000 | Timeout d'execution des commandes (ms) |
| snapshots | maxPerHost | 50 | Nombre max de snapshots conserves par hote |
| collect | includeStats | true | Collecter les stats CPU/memoire |
| collect | includeSystemInfo | true | Collecter les infos systeme Docker |
npm starthttp://localhost:4000 dans votre navigateurCliquez sur le bouton + Hote dans le header. Remplissez les informations :
root)~/.ssh/ de l'utilisateur serveur :
id_ed25519, id_rsa, id_ecdsa.
Selectionnez un hote dans le selecteur central du header, puis cliquez sur Collecter. La progression s'affiche en temps reel grace au protocole SSE :
docker inspect)docker network inspect)docker volume inspect)docker stats --no-stream)docker system info)Le dashboard presente une synthese de l'hote selectionne en quatre cartes :
| Carte | Contenu |
|---|---|
| Conteneurs | Nombre total + repartition par statut (running, exited, paused, restarting, created) |
| Reseaux | Nombre de reseaux Docker configures |
| Images | Nombre d'images uniques utilisees par les conteneurs |
| Ports exposes | Liste des ports publies avec mapping hote:conteneur |
Le panneau de droite affiche un graphe interactif force-directed representant la topologie reseau de vos conteneurs :
Cliquez sur un conteneur dans la liste ou le graphe pour afficher un panneau de detail avec 5 onglets :
| Onglet | Informations |
|---|---|
| Info | Nom, image, statut, ID, date de creation, date de demarrage, politique de redemarrage |
| Reseau | Reseaux connectes, adresses IP, passerelle, adresse MAC, ports publies |
| Volumes | Points de montage, sources, destinations, mode (lecture seule ou lecture/ecriture) |
| Env | Variables d'environnement du conteneur |
| Ressources | Utilisation CPU (%), memoire (usage/limite), E/S reseau et disque, nombre de processus |
L'endpoint /api/hosts/:id/volumes fournit une analyse complete :
docker volume inspect pour les details completsDocker Visualizer integre un systeme de gestion de comptes avec trois niveaux de roles :
| Role | Droits | Description |
|---|---|---|
admin | Complet | Gestion des utilisateurs, approbation des inscriptions, toutes les fonctions de l'application |
user | Standard | Ajout/modification/suppression de ses propres hotes, collecte, consultation |
demo | Lecture seule | Consultation de donnees fictives uniquement, aucune ecriture autorisee, bouton Collecter desactive |
Un visiteur peut demander un acces via le lien "Demander un acces" sur la page de connexion. Le compte est cree avec le statut pending et doit etre approuve par un administrateur avant que l'utilisateur puisse se connecter.
Chaque utilisateur dispose de son propre espace de stockage :
data/
users/
<userId>/
hosts.json # Hotes configures par cet utilisateur
snapshots/ # Snapshots collectes par cet utilisateur
<hostId>/
snap_2026-02-08_....json
Le panneau d'administration est accessible uniquement aux comptes ayant le role admin. Il apparait sous forme de panneau coulissant a droite de l'ecran.
Le compte demo / demo est un mode special concu pour evaluer l'application sans aucune configuration reseau :
La securite est un pilier central de Docker Visualizer. Voici le detail des mecanismes en place :
Les mots de passe SSH et passphrases de cles sont stockes chiffres dans le fichier hosts.json de chaque utilisateur.
Le module secretCipher.js utilise :
Format de stockage : enc:<iv_hex>:<authTag_hex>:<ciphertext_hex>
src/config/.secret_key
(fichier exclu du depot Git via .gitignore). Ce fichier est genere automatiquement
au premier demarrage. Sa perte rend les secrets existants indechiffrables.
Sauvegardez ce fichier dans un lieu sur.
Les mots de passe des comptes utilisateurs ne sont jamais stockes en clair. Le module userStore.js utilise :
Format de stockage : salt_hex:hash_hex
La comparaison utilise crypto.timingSafeEqual() pour prevenir les attaques par timing.
crypto.randomBytes()Authorization: Bearer <token>?token= pour EventSource (qui ne supporte pas les headers custom)Les cles privees SSH ne sont jamais copiees ni stockees par Docker Visualizer. Seul le chemin d'acces a la cle est conserve dans la configuration de l'hote. La cle est lue depuis le systeme de fichiers a chaque connexion SSH.
| Donnee | Methode de protection | Localisation |
|---|---|---|
| Mot de passe SSH | AES-256-GCM | data/users/<id>/hosts.json |
| Passphrase SSH | AES-256-GCM | data/users/<id>/hosts.json |
| Cle privee SSH | Non stockee (chemin uniquement) | Systeme de fichiers local |
| Cle de chiffrement | Fichier protege par permissions OS | src/config/.secret_key |
| Mot de passe utilisateur | PBKDF2 (100k iter, SHA-512) | src/config/users.json |
| Token de session | Memoire volatile (Map) | Processus Node.js |
/api/* sont protegees par le middleware d'authentification (sauf /api/auth/login, /api/auth/register, /api/health)admin via le middleware requireRole()blockDemoWrites/login.html)# .gitignore
node_modules/
data/snapshots/
data/users/ # Donnees par utilisateur (hotes, snapshots)
src/config/.secret_key # Cle de chiffrement AES-256
src/config/users.json # Base de comptes utilisateurs
| Couche | Technologie | Details |
|---|---|---|
| Backend | Node.js + Express | API REST, SSE, serveur de fichiers statiques |
| SSH | ssh2 | Connexion, execution de commandes Docker, multi-key |
| Chiffrement | Node.js crypto | AES-256-GCM, PBKDF2, randomBytes |
| Frontend | Vanilla JavaScript | IIFE modules, SVG pour les graphes, aucun framework |
| Stockage | Fichiers JSON | Pas de base de donnees, fichiers par utilisateur |
docker-visualizer/
src/
api/
server.js # Point d'entree Express, middleware auth
routes/
hosts.js # CRUD hotes, collecte, test SSH
containers.js # Conteneurs, graphe, volumes, dashboard
auth/
userStore.js # CRUD comptes, PBKDF2
sessionManager.js # Tokens de session en memoire
authMiddleware.js # Middleware Bearer, roles, demo
authRoutes.js # Endpoints /api/auth/*
demoData.js # Generateur de donnees fictives
userDataProvider.js # Isolation des donnees par utilisateur
collector/
sshClient.js # Client SSH (connexion, commandes)
dockerCollector.js # Execution des commandes Docker
dataAggregator.js # Orchestration collecte + snapshots
hostManager.js # Gestion des hotes (CRUD + chiffrement)
parser/
containerParser.js # Parsing des donnees conteneurs
networkParser.js # Construction du graphe reseau
volumeParser.js # Analyse des volumes
dependencyResolver.js # Graphe de dependances
utils/
secretCipher.js # AES-256-GCM chiffrement/dechiffrement
config/
app.json # Configuration applicative
.secret_key # Cle de chiffrement (auto-generee)
users.json # Base de comptes (auto-generee)
frontend/
index.html # Application principale (SPA)
login.html # Page de connexion / inscription
css/ # Feuilles de style (main, auth, graph, dashboard)
js/
app.js # Point d'entree frontend, auth, admin
auth.js # Logique de login/inscription
api/apiClient.js # Client HTTP avec injection de token
components/ # Dashboard, NetworkGraph, HostSelector, etc.
utils/ # Formatters, colorMapper
data/
users/ # Donnees isolees par utilisateur
www/ # Site vitrine (cette documentation)
package.json
Toutes les reponses suivent le format { success: boolean, data: ..., error?: string }.
| Methode | Endpoint | Auth | Description |
|---|---|---|---|
| POST | /api/auth/login | Non | Connexion, retourne un token Bearer |
| POST | /api/auth/register | Non | Inscription (statut pending) |
| POST | /api/auth/logout | Oui | Deconnexion, invalide le token |
| GET | /api/auth/me | Oui | Informations du compte connecte |
| POST | /api/auth/change-password | Oui | Changement de mot de passe |
| GET | /api/auth/users | Admin | Liste tous les utilisateurs |
| POST | /api/auth/users/:id/approve | Admin | Approuver un compte pending |
| POST | /api/auth/users/:id/reject | Admin | Rejeter un compte pending |
| DELETE | /api/auth/users/:id | Admin | Supprimer un compte |
| Methode | Endpoint | Description |
|---|---|---|
| GET | /api/hosts | Lister les hotes de l'utilisateur connecte |
| GET | /api/hosts/:id | Detail d'un hote |
| POST | /api/hosts | Ajouter un hote |
| PUT | /api/hosts/:id | Modifier un hote |
| DELETE | /api/hosts/:id | Supprimer un hote |
| POST | /api/hosts/:id/test | Tester la connectivite SSH |
| POST | /api/hosts/:id/collect | Declencher une collecte |
| GET | /api/hosts/:id/collect-stream | Collecte avec progression SSE |
| Methode | Endpoint | Description |
|---|---|---|
| GET | /api/:hostId/containers | Liste conteneurs (filtres: status, image, search) |
| GET | /api/:hostId/containers/:cid | Detail d'un conteneur |
| GET | /api/:hostId/network-graph | Graphe reseau (noeuds + aretes) |
| GET | /api/:hostId/dependencies | Graphe de dependances |
| GET | /api/:hostId/volumes | Analyse volumes + orphelins |
| GET | /api/:hostId/dashboard | Synthese dashboard |
| GET | /api/:hostId/snapshots | Historique des snapshots |
| GET | /api/health | Etat de sante de l'API (public) |