Documentation

Documentation complete

Guide d'installation, configuration, utilisation et reference de securite.

Presentation

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.

Aucun agent a installer. Docker Visualizer se connecte en SSH standard a vos serveurs et execute des commandes docker inspect, docker stats et docker network inspect pour collecter les donnees. Vos serveurs restent inchanges.

Fonctionnalites principales

  • Dashboard -- Synthese en temps reel : nombre de conteneurs, reseaux, images, ports exposes
  • Topologie reseau -- Graphe force-directed interactif avec drag & drop et zoom
  • Inventaire conteneurs -- Tableau filtrable avec detail complet (info, reseau, volumes, env, ressources)
  • Analyse volumes -- Detection des volumes orphelins, details de montage
  • Graphe de dependances -- Liens inter-conteneurs via reseaux, volumes partages, links Docker
  • Collecte SSE -- Progression en temps reel pendant la collecte avec logs detailles
  • Multi-hotes -- Gerez autant de serveurs Docker que necessaire
  • Comptes utilisateurs -- Roles admin/user/demo, donnees isolees par compte

Installation

Prerequis

  • Node.js 18 ou superieur
  • npm (inclus avec Node.js)
  • Acces SSH aux hotes Docker a superviser
  • L'utilisateur SSH doit avoir les droits d'execution de docker (groupe docker ou root)

Installation rapide

# 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.

3 dependances uniquement : express (serveur HTTP), ssh2 (connexion SSH) et cors (gestion des origines croisees). Pas de base de donnees requise.

Mode developpement

# Demarrage avec rechargement automatique
npm run dev

Configuration

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
  }
}
SectionParametreDefautDescription
serverport4000Port d'ecoute du serveur HTTP
serverhost0.0.0.0Interface d'ecoute
sshconnectTimeout10000Timeout de connexion SSH (ms)
sshcommandTimeout30000Timeout d'execution des commandes (ms)
snapshotsmaxPerHost50Nombre max de snapshots conserves par hote
collectincludeStatstrueCollecter les stats CPU/memoire
collectincludeSystemInfotrueCollecter les infos systeme Docker

Utilisation

Premier demarrage

  1. Demarrez l'application avec npm start
  2. Ouvrez http://localhost:4000 dans votre navigateur
  3. Vous etes redirige vers la page de connexion
  4. Connectez-vous avec le compte par defaut : admin / admin
  5. Un changement de mot de passe obligatoire vous est demande
  6. Ajoutez votre premier hote Docker via le bouton + Hote
localhost:4000/login.html

Ajouter un hote Docker

Cliquez sur le bouton + Hote dans le header. Remplissez les informations :

  • Adresse IP / Hostname -- Adresse du serveur Docker (obligatoire)
  • Utilisateur SSH -- Compte SSH (obligatoire, generalement root)
  • Port SSH -- Port de connexion (defaut : 22)
  • Nom -- Label lisible pour identifier l'hote dans l'interface
  • Chemin cle SSH -- Chemin vers la cle privee (ed25519, RSA, ECDSA)
  • Mot de passe -- Alternative a la cle SSH
  • Passphrase -- Si votre cle SSH est protegee par une passphrase
Strategie multi-cles SSH. Si aucun chemin de cle n'est specifie, Docker Visualizer tente automatiquement les cles presentes dans le repertoire ~/.ssh/ de l'utilisateur serveur : id_ed25519, id_rsa, id_ecdsa.

Lancer une collecte

Selectionnez un hote dans le selecteur central du header, puis cliquez sur Collecter. La progression s'affiche en temps reel grace au protocole SSE :

  1. Connexion SSH a l'hote
  2. Collecte des conteneurs (docker inspect)
  3. Collecte des reseaux (docker network inspect)
  4. Collecte des volumes (docker volume inspect)
  5. Collecte des statistiques (docker stats --no-stream)
  6. Collecte des infos systeme (docker system info)
  7. Sauvegarde du snapshot

Dashboard

Le dashboard presente une synthese de l'hote selectionne en quatre cartes :

CarteContenu
ConteneursNombre total + repartition par statut (running, exited, paused, restarting, created)
ReseauxNombre de reseaux Docker configures
ImagesNombre d'images uniques utilisees par les conteneurs
Ports exposesListe des ports publies avec mapping hote:conteneur
localhost:4000/ -- Dashboard

Topologie reseau

Le panneau de droite affiche un graphe interactif force-directed representant la topologie reseau de vos conteneurs :

  • Noeuds ronds -- Conteneurs, colores par statut (vert = running, gris = exited, etc.)
  • Noeuds carres -- Reseaux Docker, colores par nom
  • Liens pleins -- Connexion d'un conteneur a un reseau
  • Liens pointilles orange -- Port mappings (publication de ports)
  • Liens pointilles violet -- Dependances (mode graphe de dependances)

Interactions

  • Drag & drop -- Deplacez les noeuds a la souris pour reorganiser le graphe
  • Clic -- Selectionnez un conteneur pour afficher son detail
  • Survol -- Met en surbrillance le noeud et ses connexions directes
  • Touches + / - -- Ajustez la distance parent-enfant du graphe
  • Recentrer -- Remet le graphe dans son cadre d'origine
  • Selecteur -- Basculez entre vue "Reseaux" et vue "Dependances"
localhost:4000/ -- Topologie reseau

Detail des conteneurs

Cliquez sur un conteneur dans la liste ou le graphe pour afficher un panneau de detail avec 5 onglets :

OngletInformations
InfoNom, image, statut, ID, date de creation, date de demarrage, politique de redemarrage
ReseauReseaux connectes, adresses IP, passerelle, adresse MAC, ports publies
VolumesPoints de montage, sources, destinations, mode (lecture seule ou lecture/ecriture)
EnvVariables d'environnement du conteneur
RessourcesUtilisation CPU (%), memoire (usage/limite), E/S reseau et disque, nombre de processus
localhost:4000/ -- Detail conteneur

Analyse des volumes

L'endpoint /api/hosts/:id/volumes fournit une analyse complete :

  • Liste de tous les volumes Docker avec driver, point de montage et date de creation
  • Association volume <-> conteneur(s) utilisateurs
  • Detection des volumes orphelins (non utilises par aucun conteneur)
  • Enrichissement par docker volume inspect pour les details complets

Comptes utilisateurs

Docker Visualizer integre un systeme de gestion de comptes avec trois niveaux de roles :

RoleDroitsDescription
adminCompletGestion des utilisateurs, approbation des inscriptions, toutes les fonctions de l'application
userStandardAjout/modification/suppression de ses propres hotes, collecte, consultation
demoLecture seuleConsultation de donnees fictives uniquement, aucune ecriture autorisee, bouton Collecter desactive

Comptes par defaut

  • admin / admin -- Compte administrateur. Changement de mot de passe obligatoire a la premiere connexion.
  • demo / demo -- Compte demonstration. Affiche sous le formulaire de connexion pour un acces rapide.

Inscription

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.

Isolation des donnees

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
Cloisonnement complet. L'utilisateur A ne peut en aucun cas voir les hotes ou snapshots de l'utilisateur B. Chaque requete API est scopee au compte connecte via un middleware d'injection.

Administration

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.

Fonctions d'administration

  • Voir les demandes en attente -- Liste des inscriptions en statut "pending" avec date d'inscription
  • Approuver un compte -- Change le statut en "active" et attribue le role "user"
  • Rejeter un compte -- Change le statut en "rejected"
  • Supprimer un compte -- Supprime definitivement un compte utilisateur
  • Badge de notification -- Le bouton "Admin" dans le header affiche le nombre de demandes en attente
localhost:4000/ -- Panneau administration

Mode demonstration

Le compte demo / demo est un mode special concu pour evaluer l'application sans aucune configuration reseau :

  • Un hote fictif "Demo Server" (10.0.0.100) est pre-configure
  • 20 conteneurs realistes sont generes (nginx, kong, postgres, redis, rabbitmq, elasticsearch, grafana, prometheus, etc.)
  • 5 reseaux Docker (frontend, backend, monitoring, bridge, storage)
  • 11 volumes Docker avec noms et metadonnees realistes
  • Statistiques CPU/memoire simulees pour chaque conteneur running
  • Systeme info : Ubuntu 22.04, Docker 24.0.7, 8 CPU, 16 Go RAM
Aucune persistance. Les donnees demo sont generees en memoire a chaque connexion. Le bouton "Collecter" est desactive et toute tentative d'ecriture (ajout d'hote, modification) est bloquee par le serveur.

Securite

La securite est un pilier central de Docker Visualizer. Voici le detail des mecanismes en place :

Chiffrement des secrets (AES-256-GCM)

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 :

  • Algorithme : AES-256-GCM (chiffrement authentifie)
  • Cle : 256 bits (32 octets), generee aleatoirement a la premiere utilisation
  • IV : 128 bits (16 octets), unique par operation de chiffrement
  • Auth Tag : 128 bits, garantit l'integrite et l'authenticite des donnees

Format de stockage : enc:<iv_hex>:<authTag_hex>:<ciphertext_hex>

Cle de chiffrement. La cle maitre est stockee dans 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.

Hachage des mots de passe utilisateurs (PBKDF2)

Les mots de passe des comptes utilisateurs ne sont jamais stockes en clair. Le module userStore.js utilise :

  • Algorithme : PBKDF2 (Password-Based Key Derivation Function 2)
  • Iterations : 100 000 (protection contre les attaques brute-force)
  • Digest : SHA-512
  • Longueur de cle : 64 octets (512 bits)
  • Salt : 32 octets aleatoires, unique par utilisateur

Format de stockage : salt_hex:hash_hex

La comparaison utilise crypto.timingSafeEqual() pour prevenir les attaques par timing.

Gestion des sessions

  • Token : 48 octets aleatoires (384 bits) generes par crypto.randomBytes()
  • Duree de vie : 8 heures (configurable)
  • Stockage : En memoire cote serveur (Map JavaScript), jamais dans des cookies
  • Nettoyage : Les sessions expirees sont purgees toutes les 10 minutes
  • Transport : Header HTTP Authorization: Bearer <token>
  • Fallback SSE : Query parameter ?token= pour EventSource (qui ne supporte pas les headers custom)

Stockage des cles SSH

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.

DonneeMethode de protectionLocalisation
Mot de passe SSHAES-256-GCMdata/users/<id>/hosts.json
Passphrase SSHAES-256-GCMdata/users/<id>/hosts.json
Cle privee SSHNon stockee (chemin uniquement)Systeme de fichiers local
Cle de chiffrementFichier protege par permissions OSsrc/config/.secret_key
Mot de passe utilisateurPBKDF2 (100k iter, SHA-512)src/config/users.json
Token de sessionMemoire volatile (Map)Processus Node.js

Protection des endpoints API

  • Toutes les routes /api/* sont protegees par le middleware d'authentification (sauf /api/auth/login, /api/auth/register, /api/health)
  • Les routes d'administration sont restreintes au role admin via le middleware requireRole()
  • Le compte demo ne peut effectuer aucune requete d'ecriture (POST, PUT, DELETE) grace au middleware blockDemoWrites
  • Les fichiers statiques du frontend ne sont pas soumis a l'authentification (verification cote client avec redirection vers /login.html)

Fichiers sensibles exclus du depot

# .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

Architecture

Stack technique

CoucheTechnologieDetails
BackendNode.js + ExpressAPI REST, SSE, serveur de fichiers statiques
SSHssh2Connexion, execution de commandes Docker, multi-key
ChiffrementNode.js cryptoAES-256-GCM, PBKDF2, randomBytes
FrontendVanilla JavaScriptIIFE modules, SVG pour les graphes, aucun framework
StockageFichiers JSONPas de base de donnees, fichiers par utilisateur

Structure du projet

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

Reference API REST

Toutes les reponses suivent le format { success: boolean, data: ..., error?: string }.

Authentification

MethodeEndpointAuthDescription
POST/api/auth/loginNonConnexion, retourne un token Bearer
POST/api/auth/registerNonInscription (statut pending)
POST/api/auth/logoutOuiDeconnexion, invalide le token
GET/api/auth/meOuiInformations du compte connecte
POST/api/auth/change-passwordOuiChangement de mot de passe
GET/api/auth/usersAdminListe tous les utilisateurs
POST/api/auth/users/:id/approveAdminApprouver un compte pending
POST/api/auth/users/:id/rejectAdminRejeter un compte pending
DELETE/api/auth/users/:idAdminSupprimer un compte

Hotes Docker

MethodeEndpointDescription
GET/api/hostsLister les hotes de l'utilisateur connecte
GET/api/hosts/:idDetail d'un hote
POST/api/hostsAjouter un hote
PUT/api/hosts/:idModifier un hote
DELETE/api/hosts/:idSupprimer un hote
POST/api/hosts/:id/testTester la connectivite SSH
POST/api/hosts/:id/collectDeclencher une collecte
GET/api/hosts/:id/collect-streamCollecte avec progression SSE

Donnees Docker

MethodeEndpointDescription
GET/api/:hostId/containersListe conteneurs (filtres: status, image, search)
GET/api/:hostId/containers/:cidDetail d'un conteneur
GET/api/:hostId/network-graphGraphe reseau (noeuds + aretes)
GET/api/:hostId/dependenciesGraphe de dependances
GET/api/:hostId/volumesAnalyse volumes + orphelins
GET/api/:hostId/dashboardSynthese dashboard
GET/api/:hostId/snapshotsHistorique des snapshots
GET/api/healthEtat de sante de l'API (public)