Skip to content

Rqbln/dirisi25-hackathon-frontend

Repository files navigation

DIRISI 2025 Hackathon – Frontend Streamlit

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

Streamlit Python Plotly Docker Offline-First


📋 Vue d'ensemble

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

📚 Table des matiùres


🚀 DĂ©marrage Rapide

Développement local

# Installer les dépendances
pip install -r requirements.txt

# Lancer Streamlit
streamlit run streamlit_app.py

# Ou avec make
make streamlit

Avec Docker

# Build et run
make streamlit-docker

# Ou manuellement
docker build -t dirisi-frontend:latest -f Dockerfile.streamlit .
docker run -p 3000:3000 dirisi-frontend:latest

Stack complĂšte (Backend + Frontend)

cd docker
docker-compose up

📋 FonctionnalitĂ©s

  • 📊 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

đŸ› ïž Technologies

  • Streamlit - Framework web Python
  • Plotly - Visualisations interactives
  • Pandas - Traitement des donnĂ©es
  • Requests - Appels API

🔧 Configuration

Variables d'environnement

# URL du backend (défaut: http://localhost:8080)
export VITE_API_BASE=http://localhost:8080

# Ou
export BACKEND_URL=http://localhost:8080

Sur Jupyter Lab OVHcloud

# 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

📂 Structure

├── 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

🔄 Migration React → Streamlit

Correspondance des fonctionnalités

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

Routes API utilisées (identiques)

  • GET /health - Health check
  • GET /v1/topology - Topologie rĂ©seau
  • POST /v1/predict - PrĂ©dictions
  • POST /v1/plan - Planification
  • POST /v1/simulate - Simulation
  • GET /v1/explain - Explications
  • GET /v1/metrics - MĂ©triques
  • POST /v1/ingest - Ingestion de donnĂ©es

đŸ§Ș Tests

# Tests unitaires (React legacy)
make test

# Tests E2E (React legacy)
make e2e

🐳 Docker

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

📖 Documentation

đŸ€ Contribution

Voir CONTRIBUTING.md

📝 License

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

📚 Table des matiùres


🚀 DĂ©marrage rapide

Option 1 – Docker Compose (recommandĂ©)

# Arborescence requise
DIRISI-Hackathon/
├── dirisi25-hackathon-frontend/   # Ce repo
└── dirisi25-hackathon-backend/    # Backend requis

# Lancer tout
cd dirisi25-hackathon-frontend
make docker

Lance :

  • 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

Option 2 – DĂ©veloppement local

# Installation
pip install -r requirements.txt

# Lancer Streamlit (nécessite backend sur 8080)
streamlit run streamlit_app.py

# Ou avec make
make streamlit

Le frontend sera accessible sur http://localhost:8501

Option 3 – Streamlit avec Docker seul

# 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

✹ FonctionnalitĂ©s

Pages principales

  1. 📊 Dashboard

    • Vue d'ensemble du rĂ©seau
    • MĂ©triques clĂ©s en temps rĂ©el
    • Indicateurs de santĂ©
  2. 🌐 Topologie

    • Graphe interactif du rĂ©seau (Plotly)
    • Visualisation des nƓuds et liens
    • État en temps rĂ©el
  3. 🔼 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
  4. 📋 Planification

    • GĂ©nĂ©ration de plans d'action
    • Optimisation multi-objectifs
    • Actions recommandĂ©es (rerouting, scaling, etc.)
  5. 🎼 Simulation

    • ScĂ©narios What-If
    • Simulation de pannes
    • Impact sur le rĂ©seau

Mode Offline

✅ 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

đŸ—ïž Architecture

Stack technique

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

Architecture applicative


┌─────────────────────────────────────────────────────────────┐
│              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)     │
                    └──────────────────┘

Flux de données

User → Streamlit UI → Session State
                ↓
         Backend Check
                ↓
    ┌───────────┮───────────┐
    ↓                       ↓
ONLINE Mode             OFFLINE Mode
    ↓                       ↓
API Call                Fixtures
    ↓                       ↓
Response → Display

🔌 Mode Offline

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Ă©seau
  • predictions.json - Exemples de prĂ©dictions
  • plan.json - Plans d'action
  • simulate.json - RĂ©sultats de simulation
  • health.json - État de santĂ©

Switch manuel : Bouton dans la sidebar pour forcer le mode


🐳 Docker

Fichiers

docker/
├── Dockerfile.streamlit   # Image Streamlit
└── docker-compose.yml     # Stack complùte

Docker Compose

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

Services exposés:

  • Frontend : http://localhost:3000
  • Backend : http://localhost:8080

📂 Structure du projet

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

🔧 Configuration

Variables d'environnement

# URL du backend
export VITE_API_BASE=http://localhost:8080
# ou
export BACKEND_URL=http://localhost:8080

Configuration Streamlit

Créer .streamlit/config.toml :

[server]
port = 3000
address = "0.0.0.0"
headless = true

[theme]
primaryColor = "#3B82F6"
backgroundColor = "#FFFFFF"
secondaryBackgroundColor = "#F3F4F6"
textColor = "#1F2937"

Déploiement Jupyter Lab OVHcloud

# 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

🔄 Migration React → Streamlit

Raisons de la migration

  1. Compatibilité Jupyter Lab : Pas de Node.js disponible sur l'environnement OVHcloud
  2. Simplicité : Moins de dépendances, stack Python unifiée
  3. Rapidité de développement : Moins de code, prototypage rapide
  4. Visualisations : Plotly intégré nativement

Correspondance des fonctionnalités

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

API Backend (inchangée)

Toutes les routes API restent identiques :

  • GET /health - Health check
  • GET /v1/topology - Topologie rĂ©seau
  • POST /v1/predict - PrĂ©dictions
  • POST /v1/plan - Planification
  • POST /v1/simulate - Simulation
  • GET /v1/explain - Explications
  • GET /v1/metrics - MĂ©triques
  • POST /v1/ingest - Ingestion de donnĂ©es

Code Legacy

Le code React original est conservé dans :

  • src/ (composants TypeScript/React)
  • docs/ (documentation React)
  • docker/Dockerfile (build React/Caddy)

đŸ€ Contribution

Voir CONTRIBUTING.md dans le backend


📝 License

MIT - Voir LICENSE


🎯 Contexte

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.


🔌 Mode Offline

Détection auto au boot :

  • GET /health timeout 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.


🔒 SĂ©curitĂ©

CSP (ex. via Caddy)

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.


📂 Structure du projet

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

đŸ› ïž DĂ©veloppement

Prérequis

  • Node.js 18+, npm 9+
  • Docker & Docker Compose (pour la dĂ©mo complĂšte)

Setup & scripts

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 format

Conventions

  • TypeScript strict (pas de any)
  • Functional components + hooks
  • Tailwind (purge actif)
  • Conventional commits (feat:, fix:, docs:, 
)

📄 Pages

  • / Dashboard : 6 cartes mĂ©triques, alertes triables
  • /topology Carte : SVG interactif (survol/clic)
  • /predict PrĂ©dictions : horizon, cibles, risk bands + explications
  • /plan Planification : objectifs/contraintes → actions + gains
  • /simulate Simulation : scĂ©narios panne (durĂ©e/intensitĂ©) → impact + plan
  • /about À propos : contexte, statut, liens docs

❓ Inconnues & Actions

Inconnues

  1. Design tokens Défense : palettes/couleurs officielles ?
  2. CritÚres UX : interopérabilité, a11y, perf ?
  3. Sécurité poste : navigateur imposé (Firefox ESR ?), poste isolé ?
  4. Données réelles : volumétrie/latences (pagination/virtualisation) ?
  5. 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 & đŸ‘„ Équipe

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 docker lance automatiquement les deux services
  • En prod : HTTPS dans le Caddyfile + variables d’environnement sĂ©curisĂ©es

About

📡 Interface Streamlit d’aide Ă  la dĂ©cision pour les opĂ©rations rĂ©seau, avec visualisation interactive, mode offline-first et intĂ©gration transparente au backend FastAPI.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors