Application web Streamlit pour l'anticipation des pannes réseau par l'IA Interface simplifiée pour l'aide à la décision et la simulation
Interface web Streamlit pour la gestion et la prédiction de pannes réseau.
â ïž Note: Le frontend a Ă©tĂ© migrĂ© de React vers Streamlit pour une meilleure compatibilitĂ© avec l'environnement Jupyter Lab OVHcloud (pas de Node.js disponible).
Fonctionnalités principales:
- đ Visualiser la topologie rĂ©seau en temps rĂ©el
- đź PrĂ©dire les risques de panne (IA/ML)
- đŻ GĂ©nĂ©rer des plans d'action optimisĂ©s
- đ§Ș Simuler des scĂ©narios de dĂ©faillance (what-if)
- đ Tracer et expliquer les dĂ©cisions ML (explicabilitĂ©)
Points clés:
- â Offline-First : fonctionne sans backend (fixtures locales)
- â Simple : une seule commande pour dĂ©marrer
- â Interactif : visualisations Plotly intĂ©grĂ©es
- â Production-Ready : Docker Compose, prĂȘt pour dĂ©ploiement
- đ DĂ©marrage rapide
- ⚠Fonctionnalités
- đïž Architecture
- đ Mode Offline
- đł Docker
- đ Structure du projet
- đ§ Configuration
- đ Migration React â Streamlit
# Installer les dépendances
pip install -r requirements.txt
# Lancer Streamlit
streamlit run streamlit_app.py
# Ou avec make
make streamlit# Build et run
make streamlit-docker
# Ou manuellement
docker build -t dirisi-frontend:latest -f Dockerfile.streamlit .
docker run -p 3000:3000 dirisi-frontend:latestcd docker
docker-compose up- đ Dashboard: Vue d'ensemble du rĂ©seau et mĂ©triques clĂ©s
- đ Topologie: Visualisation interactive du graphe rĂ©seau avec Plotly
- đź PrĂ©dictions: PrĂ©diction de pannes avec IA
- đ Planification: GĂ©nĂ©ration de plans d'action optimisĂ©s
- đź Simulation: ScĂ©narios What-If
- đ Mode Offline: Utilise les fixtures quand le backend est indisponible
- Streamlit - Framework web Python
- Plotly - Visualisations interactives
- Pandas - Traitement des données
- Requests - Appels API
# URL du backend (défaut: http://localhost:8080)
export VITE_API_BASE=http://localhost:8080
# Ou
export BACKEND_URL=http://localhost:8080# Le backend tourne sur le port 8000 (8080 réservé par Jupyter)
export VITE_API_BASE=http://localhost:8000
streamlit run streamlit_app.py --server.port 3000 --server.address 0.0.0.0 --server.headless trueâââ streamlit_app.py # Application Streamlit principale
âââ requirements.txt # DĂ©pendances Python
âââ Dockerfile.streamlit # Dockerfile Streamlit
âââ src/
â âââ fixtures/ # DonnĂ©es de test (mode offline)
â âââ topology.json
â âââ predictions.json
â âââ plan.json
â âââ simulate.json
âââ docker/
âââ Dockerfile # Dockerfile React (legacy)
âââ docker-compose.yml # Stack complĂšte
| React (ancien) | Streamlit (nouveau) |
|---|---|
| React Router | Sidebar navigation |
| Zustand stores | Session state |
| TypeScript types | Python types |
| Vite + Node.js | Streamlit CLI |
| TailwindCSS | Streamlit native + CSS |
| Caddy server | Streamlit server |
GET /health- Health checkGET /v1/topology- Topologie réseauPOST /v1/predict- PrédictionsPOST /v1/plan- PlanificationPOST /v1/simulate- SimulationGET /v1/explain- ExplicationsGET /v1/metrics- MétriquesPOST /v1/ingest- Ingestion de données
# Tests unitaires (React legacy)
make test
# Tests E2E (React legacy)
make e2edocker build -t dirisi-frontend:latest -f Dockerfile.streamlit .docker run -p 3000:3000 \
-e VITE_API_BASE=http://backend:8080 \
dirisi-frontend:latest- README_STREAMLIT.md - Documentation Streamlit détaillée
- docs/ - Documentation React (legacy)
Voir CONTRIBUTING.md
MIT - Voir LICENSE
- đ Visualiser la topologie rĂ©seau en temps (quasi) rĂ©el
- đź PrĂ©dire les risques de panne (IA/ML)
- đŻ GĂ©nĂ©rer des plans dâaction optimisĂ©s
- đ§Ș Simuler des scĂ©narios de dĂ©faillance (what-if)
- đ Tracer et expliquer les dĂ©cisions ML (explicabilitĂ©)
Points clés
- â Offline-First : fonctionne sans backend (fixtures locales)
- â Performant : bundle < 300 KB gzippĂ©
- â SĂ©curisĂ© : CSP stricte, pas de CDN externe, Caddy durci
- â Explicable : features & rĂšgles visibles
- â Production-Ready : Docker Compose, tests E2E, CI/CD-ready
- đ DĂ©marrage rapide
- đŻ Contexte
- đïž Architecture
- ⚠Fonctionnalités
- đł Docker
- đ§Ș Tests
- đ Mode Offline
- đ SĂ©curitĂ©
- đ Structure du projet
- đ ïž DĂ©veloppement
- đ Pages
- â Inconnues & Actions
- đ Licence & đ„ Ăquipe
# Arborescence requise
DIRISI-Hackathon/
âââ dirisi25-hackathon-frontend/ # Ce repo
âââ dirisi25-hackathon-backend/ # Backend requis
# Lancer tout
cd dirisi25-hackathon-frontend
make dockerLance :
- Frontend Streamlit :
http://localhost:3000 - Backend FastAPI :
http://localhost:8080 - Réseau Docker isolé avec healthchecks
ArrĂȘt propre : Ctrl+C ou docker-compose down
# Installation
pip install -r requirements.txt
# Lancer Streamlit (nécessite backend sur 8080)
streamlit run streamlit_app.py
# Ou avec make
make streamlitLe frontend sera accessible sur http://localhost:8501
# Build
docker build -t dirisi-frontend:latest -f Dockerfile.streamlit .
# Run
docker run -p 3000:3000 \
-e VITE_API_BASE=http://backend:8080 \
dirisi-frontend:latest-
đ Dashboard
- Vue d'ensemble du réseau
- Métriques clés en temps réel
- Indicateurs de santé
-
đ Topologie
- Graphe interactif du réseau (Plotly)
- Visualisation des nĆuds et liens
- Ătat en temps rĂ©el
-
đź PrĂ©dictions
- SĂ©lection de cibles (nĆuds/liens)
- Prédiction de risque de panne (ML)
- Score de risque et ETA
- Explications des prédictions
-
đ Planification
- Génération de plans d'action
- Optimisation multi-objectifs
- Actions recommandées (rerouting, scaling, etc.)
-
đź Simulation
- Scénarios What-If
- Simulation de pannes
- Impact sur le réseau
â L'application fonctionne sans backend grĂące aux fixtures :
- Active automatiquement si le backend est indisponible
- Données de test dans
src/fixtures/ - Switch manuel possible via la sidebar
| Technologie | Version | Usage |
|---|---|---|
| Streamlit | 1.30+ | Framework web |
| Python | 3.11 | Langage |
| Plotly | 5.18+ | Visualisations |
| Pandas | 2.1+ | Traitement données |
| Requests | 2.31+ | Appels API |
| Docker | 24+ | Conteneurisation |
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â Frontend Streamlit (Python 3.11) â
â Pages â Dashboard / Topology / Predict / Plan / Simulateâ
â Services â API calls via requests â
â State â st.session_state (ui, data, mode) â
â Mode ONLINE â Backend API (localhost:8080) â
â Mode OFFLINE â fixtures/*.json (seed 42) â
âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
â
ââââââââââââââââââââ
â Backend FastAPI â
â (port 8080) â
ââââââââââââââââââââ
User â Streamlit UI â Session State
â
Backend Check
â
âââââââââââââŽââââââââââââ
â â
ONLINE Mode OFFLINE Mode
â â
API Call Fixtures
â â
Response â Display
L'application détecte automatiquement si le backend est disponible :
- â Backend disponible : Mode ONLINE (donnĂ©es en temps rĂ©el)
- â Backend indisponible : Mode OFFLINE (fixtures locales)
Fixtures incluses (src/fixtures/) :
topology.json- Structure du rĂ©seaupredictions.json- Exemples de prĂ©dictionsplan.json- Plans d'actionsimulate.json- RĂ©sultats de simulationhealth.json- Ătat de santĂ©
Switch manuel : Bouton dans la sidebar pour forcer le mode
docker/
âââ Dockerfile.streamlit # Image Streamlit
âââ docker-compose.yml # Stack complĂšte
# Lancer la stack complĂšte
cd docker
docker-compose up
# En arriĂšre-plan
docker-compose up -d
# ArrĂȘter
docker-compose down
# Rebuild
docker-compose build
# Logs
docker-compose logs -f frontendServices exposés:
- Frontend :
http://localhost:3000 - Backend :
http://localhost:8080
dirisi25-hackathon-frontend/
âââ streamlit_app.py # Application principale
âââ requirements.txt # DĂ©pendances Python
âââ Dockerfile.streamlit # Image Docker
âââ Makefile # Commandes utiles
âââ src/
â âââ fixtures/ # DonnĂ©es de test (mode offline)
â âââ topology.json
â âââ predictions.json
â âââ plan.json
â âââ simulate.json
â âââ health.json
âââ docker/
â âââ Dockerfile # React legacy (archivĂ©)
â âââ Caddyfile # React legacy
â âââ docker-compose.yml # Stack complĂšte
âââ docs/ # Documentation React legacy
# URL du backend
export VITE_API_BASE=http://localhost:8080
# ou
export BACKEND_URL=http://localhost:8080Créer .streamlit/config.toml :
[server]
port = 3000
address = "0.0.0.0"
headless = true
[theme]
primaryColor = "#3B82F6"
backgroundColor = "#FFFFFF"
secondaryBackgroundColor = "#F3F4F6"
textColor = "#1F2937"# Le backend utilise le port 8000 (8080 réservé)
export VITE_API_BASE=http://localhost:8000
# Lancer Streamlit
streamlit run streamlit_app.py \
--server.port 3000 \
--server.address 0.0.0.0 \
--server.headless true- Compatibilité Jupyter Lab : Pas de Node.js disponible sur l'environnement OVHcloud
- Simplicité : Moins de dépendances, stack Python unifiée
- Rapidité de développement : Moins de code, prototypage rapide
- Visualisations : Plotly intégré nativement
| React (ancien) | Streamlit (nouveau) |
|---|---|
| React Router | Sidebar navigation |
| Zustand stores | st.session_state |
| TypeScript types | Python type hints |
| Vite + npm | Streamlit CLI + pip |
| TailwindCSS | Streamlit native + CSS |
| Caddy server | Streamlit server |
| Plotly.js | Plotly Python |
| axios/fetch | requests |
Toutes les routes API restent identiques :
GET /health- Health checkGET /v1/topology- Topologie réseauPOST /v1/predict- PrédictionsPOST /v1/plan- PlanificationPOST /v1/simulate- SimulationGET /v1/explain- ExplicationsGET /v1/metrics- MétriquesPOST /v1/ingest- Ingestion de données
Le code React original est conservé dans :
src/(composants TypeScript/React)docs/(documentation React)docker/Dockerfile(build React/Caddy)
Voir CONTRIBUTING.md dans le backend
MIT - Voir LICENSE
Hackathon DIRISI 2025 â ThĂšme : « Anticiper les pannes par l'IA »
Application offline-first démontrable sans internet : visualisation en temps réel, prédiction ML, planification optimisée, simulation what-if, et explicabilité des décisions.
Détection auto au boot :
GET /healthtimeout 2s â si Ă©chec : OFFLINE ; si succĂšs : ONLINE
Fixtures locales (src/fixtures/):
health.json âą topology.json âą predictions.json âą plan.json âą simulate.json
UI dégradée : badge OFFLINE, bouton Re-essayer, toutes pages fonctionnelles.
Content-Security-Policy:
default-src 'self';
script-src 'self';
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;
font-src 'self' data: https:;
connect-src 'self' http://localhost:8080 http://127.0.0.1:8080;
object-src 'none';
base-uri 'self';
frame-ancestors 'none';
Headers : X-Content-Type-Options, X-Frame-Options, X-XSS-Protection,
Referrer-Policy, Permissions-Policy.
Principes : No-CDN, no-analytics, no-cookies, no-eval, HTTPS en prod, timeouts API.
dirisi25-hackathon-frontend/
âââ docker/ # Dockerfile, Caddyfile, compose
âââ docs/ # DOCKER_GUIDE, QUICKSTART, etc.
âââ scripts/ # check/start/test docker
âââ src/
â âââ components/ # UI rĂ©utilisable
â âââ routes/ # pages
â âââ services/ # appels backend, logique mĂ©tier
â âââ store/ # Zustand
â âââ types/ # TS types
â âââ fixtures/ # donnĂ©es offline
â âââ lib/ # utils (api, layout, format)
âââ tests/ # unit + e2e
âââ .env.example
âââ .eslintrc.cjs
âââ .prettierrc
âââ playwright.config.ts
âââ vite.config.ts
âââ vitest.config.ts
âââ tailwind.config.js
âââ package.json
âââ Makefile
- Node.js 18+, npm 9+
- Docker & Docker Compose (pour la démo complÚte)
git clone git@github.com:Rqbln/dirisi25-hackathon-frontend.git
cd dirisi25-hackathon-frontend
npm ci
cp .env.example .env
npm run dev # serveur dev (HMR)
npm run build # build prod
npm run preview # preview du build
npm run lint # eslint
npm run format # prettier
npm run type-check # TS noEmit
# équivalents Make
make dev | make build | make preview | make test | make e2e | make lint | make formatConventions
- TypeScript strict (pas de
any) - Functional components + hooks
- Tailwind (purge actif)
- Conventional commits (
feat:,fix:,docs:, âŠ)
/Dashboard : 6 cartes mĂ©triques, alertes triables/topologyCarte : SVG interactif (survol/clic)/predictPrĂ©dictions : horizon, cibles, risk bands + explications/planPlanification : objectifs/contraintes â actions + gains/simulateSimulation : scĂ©narios panne (durĂ©e/intensitĂ©) â impact + plan/aboutĂ propos : contexte, statut, liens docs
Inconnues
- Design tokens Défense : palettes/couleurs officielles ?
- CritÚres UX : interopérabilité, a11y, perf ?
- Sécurité poste : navigateur imposé (Firefox ESR ?), poste isolé ?
- Données réelles : volumétrie/latences (pagination/virtualisation) ?
- Déploiement : intranet Défense / proxys / ports autorisés ?
Plan A (actuel) : UI minimaliste + fixtures + backend local, offline-first Plan B (si autorisĂ©) : polling 5â10s / WebSocket notifications / export PDF / thĂšme DĂ©fense / virtualisation >1000 entitĂ©s
Objectifs perf : bundle < 300 KB, FP < 1s, TTI < 2s, Lighthouse > 90
Licence : MIT â voir LICENSE
Ăquipe : Projet Hackathon DIRISI 2025 â Anticiper les pannes par lâIA
Note déploiement
- Front & back dans le mĂȘme dossier parent (compose)
make dockerlance automatiquement les deux services- En prod : HTTPS dans le Caddyfile + variables dâenvironnement sĂ©curisĂ©es