- Dépendance
ws(v8) : serveur WebSocket monté sur le serveur HTTP Express vianoServer: true GET /api/ws-token(authentifié) : génère un token à usage unique (TTL 30 s) pour l'upgrade WebSocket — évite d'exposer la session cookie sur la connexion WSstreamContainerLogs(name, tail, onData, onEnd)dansdocker.js: stream Dockerfollow: trueavec démultiplexage stdout/stderr viamodem.demuxStream+PassThrough- Gestionnaire
server.on('upgrade', ...): valide et consomme le token one-shot avant d'accepter la connexion WebSocket (401 +socket.destroy()si invalide ou expiré) - Modal "Logs" dans le dashboard : bouton "Logs" sur chaque card container (running et exited), affichage en temps réel dans un
<pre>avec auto-scroll, fermeture via bouton ✕ ou clic sur l'overlay showLogs(name)/closeLogs()dansapp.js: gestion du cycle de vie WebSocket (ouverture, réception, erreur, fermeture propre du stream Docker)
server.js: migration deapp.listen()vershttp.createServer(app)+server.listen()pour supporter l'upgrade WebSocketsessionMiddlewareextrait en variable nommée (préparation au partage avec le handler d'upgrade)- Section "Applications web" : ajout du bouton "Ouvrir →" sur les cards dans
renderWebsites(frontend manquant en 0.4.1)
- Bouton "Ouvrir →" sur chaque card application web du dashboard (connecté) — ouvre l'application dans un nouvel onglet via
target="_blank" - Nouveau style
.card-link: bouton discret monospace cohérent avec le design du dashboard, avec transition hover
home.html: remplacement de la card CineMap — TP Laravel en première position par QW APP (/qw-app/) — CineMap déplacée après Lucky7home.html: footer mis à jour — ajout d'un lien Portfolio (damien-paszkiewicz.vercel.app) aux côtés du lien GitHub, suppression du label "B3 Dev"
- Configuration Nginx : suppression de
root /var/www/home—location /proxifie désormais vershttp://127.0.0.1:3020(vps-monitor) - La homepage statique (
/var/www/home/index.html) est remplacée par l'application dynamique - Toutes les routes existantes (
/saintbarthvolley/,/lucky7/,/cinemap/, etc.) conservées et non impactées
- Toutes les applications accessibles via leurs routes Nginx
- Homepage publique servie par vps-monitor sur
/ - Dashboard accessible après login admin
- Containers
exitedaffichés en rouge, containersrunningen vert globalStatus: OKaprès nettoyage des containers anonymes (docker container prune)
POST /api/container/restart: redémarre un container par nomPOST /api/container/stop: arrête un container par nomPOST /api/container/start: démarre un container arrêté par nom- Authentification par session (
express-session) — login/password via variables d'environnement (AUTH_USER,AUTH_PASS,SESSION_SECRET) POST /auth/login: création de session, durée 8hPOST /auth/logout: destruction de session- Middleware
requireAuthprotégeant toutes les routes/api/* - Page de login (
login.html) avec formulaire et gestion d'erreur - Page publique
home.html: liste des 5 applications avec liens directs, lien "Monitoring" discret en footer - Routing conditionnel sur
GET /: affichehome.htmlsi non connecté, le dashboard si connecté - Boutons
Restart/Stopsur les cards containers running,Startsur les cards exited - Désactivation des boutons pendant l'action en cours
- Redirection automatique vers
/login.htmlsi la session expire (réponse 401) - Bouton "Déconnexion" dans le header
app.js: gestion du 401 surfetchStatusavec redirection vers la page de loginserver.js:requireAuthappliqué uniquement sur les routes/api/*,GET /sert la page publique ou le dashboard selon la session- Tests : variables d'environnement d'auth isolées via
process.envavant import pour éviter la pollution par le.envlocal
api/services/http.js: vérification HTTP des 5 applications web (TP Vue, SaintBarth Volley, Lucky7, College La Boussole, Cinemap)- Checks effectués en parallèle avec
Promise.allviafetchnatif Node.js 20 avec timeout de 5 secondes (AbortController) redirect: 'manual'pour accepter les redirections (302) commeOK— nécessaire pour les apps avec page de loginglobalStatusprend désormais en compte l'état des sites web en plus des containers- Section "Applications web" dans le dashboard avec indicateurs visuels vert/rouge
- Compteur OK/KO global affiché dans le header
- Variable d'environnement
BASE_URLpour configurer l'URL de base des checks HTTP - Fichier
.envpour la configuration locale - Migration de CommonJS (
require) vers ES Modules (import/export) sur l'ensemble du projet - Configuration Jest adaptée pour l'ESM (
--experimental-vm-modules,jest.unstable_mockModule) - Configuration ESLint mise à jour pour l'ESM (
sourceType: 'module')
GET /api/status: le champwebsitesest maintenant rempli (vide en 0.1.0)globalStatuspasse àKOsi un site web est indisponible, pas uniquement les containersserver.js: détection du module principal viaimport.meta.urlau lieu derequire.main
- Backend Node.js + Express servant les fichiers statiques et l'API REST
GET /api/status: liste tous les containers Docker avec nom, statut, image, ports et uptime- Connexion au socket Docker via
dockerode(/var/run/docker.sock) - Calcul du
globalStatusglobal (OK/KO) selon l'état des containers - Frontend statique vanilla (HTML + CSS + JS) sans framework ni build
- Rafraîchissement automatique du dashboard toutes les 5 secondes
- Indicateurs visuels par statut : vert (running), rouge (exited), orange (restarting)
Dockerfilebasé surnode:20-alpine- Intégration dans le
docker-compose.ymldu VPS avec montage du socket Docker - Script
npm run devvianodemonpour le développement local - Pipeline CI GitHub Actions (
ci.yml) : lint ESLint + tests Jest sur toutes les branches et PRs - Pipeline CD GitHub Actions (
staging.yml) : déploiement automatique sur le VPS via SSH au push surstaging - Tests unitaires avec
jest+supertest(mock du socket Docker)