Aller au contenu

📝 Changelog - Configuration WebSocket Frontend

Date : 01/10/2025 Type : Configuration Scope : Frontend React - WebSocket URL


🎯 OBJECTIF

Configurer correctement l'URL WebSocket frontend pour utiliser wss://api-housing.boaz-study.tech/ws sans aucun hardcoding, en utilisant exclusivement les variables d'environnement.


✅ MODIFICATIONS EFFECTUÉES

1. Variable d'environnement production (frontend/.env)

1
2
- REACT_APP_WS_URL=wss://housing.boaz-study.tech/api/ws
+ REACT_APP_WS_URL=wss://api-housing.boaz-study.tech/ws

Raison : Aligner avec l'URL API backend correcte

2. Variable d'environnement développement (frontend/.env.example)

1
2
3
4
5
6
- REACT_APP_WS_URL=ws://localhost:8000/api/ws
+ REACT_APP_WS_URL=ws://localhost:8001/ws

+ # Documentation ajoutée :
+ # Local dev: ws://localhost:8001/ws
+ # Production: wss://api-housing.boaz-study.tech/ws

Raison : Corriger le port (8001 au lieu de 8000) et documenter les valeurs

3. Service WebSocket (frontend/src/services/websocketService.js)

Avant :

1
2
const wsUrl = process.env.REACT_APP_WS_URL || 'wss://housing.boaz-study.tech/api/ws';
//const wsUrl = 'wss://api-housing.boaz-study.tech/ws';  // ligne commentée

AprĂšs :

1
2
3
4
5
6
7
8
// URL depuis variable d'environnement uniquement (NO HARDCODING)
const wsUrl = process.env.REACT_APP_WS_URL;

if (!wsUrl) {
  console.error('❌ WebSocket - REACT_APP_WS_URL non dĂ©finie dans .env');
  this.isConnecting = false;
  return;
}

AmĂ©liorations : - ✅ Suppression du fallback hardcodĂ© (masquait les erreurs) - ✅ Suppression de la ligne commentĂ©e inutile - ✅ Validation stricte de la prĂ©sence de la variable - ✅ Message d'erreur explicite en cas de manque


đŸ—ïž ARCHITECTURE

Configuration finale

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Frontend (React App)
├── .env
│   └── REACT_APP_WS_URL=wss://api-housing.boaz-study.tech/ws
│
├── websocketService.js
│   └── const wsUrl = process.env.REACT_APP_WS_URL
│       └── Validation stricte
│
└── Composants
    ├── StatistiquesSection (useSouscriptionUpdates)
    ├── HistoriqueSection (useSouscriptionUpdates)
    └── LogementList (useLogementUpdates)

Backend compatible

1
2
3
4
5
6
Backend FastAPI
└── /ws (route WebSocket)
    ├── Écoute sur port 8001
    ├── Gestion connexions (ConnectionManager)
    ├── Broadcast notifications (notify_data_change)
    └── Ping/Pong heartbeat

📋 VÉRIFICATIONS EFFECTUÉES

✅ Configuration fichiers

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Variable .env correcte
✅ cat frontend/.env | grep REACT_APP_WS_URL
   → REACT_APP_WS_URL=wss://api-housing.boaz-study.tech/ws

# Service utilise bien la variable
✅ grep "process.env.REACT_APP_WS_URL" frontend/src/services/websocketService.js
   → Ligne 18 : const wsUrl = process.env.REACT_APP_WS_URL;

# Aucun hardcoding résiduel
✅ grep -r "wss://housing" frontend/src/
   → Aucun rĂ©sultat (nettoyĂ©)

✅ Architecture backend

1
2
3
4
5
6
7
# Route WebSocket existe
✅ grep "@router.websocket" backend/app/routers/websocket.py
   → Ligne 50 : @router.websocket("/ws")

# Router inclus dans app
✅ grep "websocket.router" backend/app/main.py
   → Ligne 79 : app.include_router(websocket.router)

✅ Composants frontend

1
2
3
4
5
6
7
# Tous utilisent les hooks centralisés
✅ StatistiquesSection.js → useSouscriptionUpdates
✅ HistoriqueSection.js → useSouscriptionUpdates
✅ LogementList.js → useLogementUpdates

# Aucun import direct de websocketService
✅ Tous passent par hooks/useWebSocket.js

🚀 DÉPLOIEMENT

Étapes nĂ©cessaires

  1. Frontend doit ĂȘtre rebuild (variables d'env compilĂ©es au build)

    1
    2
    docker compose build frontend
    docker compose restart frontend
    

  2. Vérifier les logs console navigateur

  3. Tester la connexion

    • CrĂ©er une souscription
    • VĂ©rifier les logs : ✅ WebSocket - Connexion confirmĂ©e
    • VĂ©rifier que les statistiques se mettent Ă  jour automatiquement

📊 IMPACTS

Positifs ✅

  1. Configuration propre

    • Une seule source de vĂ©ritĂ© (.env)
    • Pas de duplication d'URL
    • Facile Ă  modifier par environnement
  2. Maintenabilité

    • Changement d'URL = 1 ligne dans .env
    • Pas de recherche dans tout le code
    • Documentation claire
  3. Sécurité

    • Validation stricte de la config
    • Messages d'erreur explicites
    • Pas de fallback silencieux
  4. Debugging

    • Logs clairs de l'URL utilisĂ©e
    • Erreur visible si config manquante
    • Pas de confusion avec anciennes URLs

NĂ©gatifs / Risques ⚠

  1. Rebuild obligatoire

    • Variables React compilĂ©es au build
    • Modification .env → rebuild frontend
    • Temps de dĂ©ploiement lĂ©gĂšrement augmentĂ©
  2. Erreur visible si env manquante

    • Plus de fallback silencieux
    • Mais c'est voulu ! (meilleure dĂ©tection erreurs)

🐛 PROBLÈMES POTENTIELS

WebSocket ne se connecte pas

Diagnostic :

1
2
3
4
5
6
7
8
9
# 1. Vérifier variable d'env dans container
docker exec boaz-frontend printenv | grep REACT_APP_WS_URL

# 2. Vérifier logs console navigateur
# Chercher : "WebSocket - Tentative de connexion"

# 3. Tester endpoint backend
curl -I https://api-housing.boaz-study.tech/ws
# Devrait retourner 426 Upgrade Required

Solutions :

1
2
3
4
5
6
7
8
# Si variable manquante → Ajouter dans .env
echo "REACT_APP_WS_URL=wss://api-housing.boaz-study.tech/ws" >> frontend/.env

# Si ancienne URL dans logs → Rebuild frontend
docker compose build --no-cache frontend
docker compose restart frontend

# Si erreur backend → VĂ©rifier config Nginx/Ingress pour WebSocket


📚 DOCUMENTATION CRÉÉE

  1. WEBSOCKET_URL_UPDATE.md

    • Documentation technique complĂšte
    • Guide de troubleshooting
    • Exemples de configuration
    • Checklist de dĂ©ploiement
  2. .claude/CHANGELOG_WEBSOCKET.md (ce fichier)

    • RĂ©sumĂ© des modifications
    • Raisons et impacts
    • VĂ©rifications effectuĂ©es

🔄 PROCHAINES ÉTAPES

Immédiatement

  • Rebuild frontend : docker compose build frontend
  • Restart frontend : docker compose restart frontend
  • Tester connexion WebSocket en console navigateur
  • VĂ©rifier notifications temps rĂ©el fonctionnent

Court terme

  • Monitorer logs WebSocket backend
  • VĂ©rifier stabilitĂ© connexions
  • Tester sur diffĂ©rents navigateurs
  • Documenter dans .claude/project-context.md

Long terme

  • Ajouter mĂ©triques WebSocket (nombre connexions actives)
  • ImplĂ©menter reconnexion intelligente
  • Ajouter indicateur visuel statut connexion dans UI

🎓 LEÇONS APPRISES

Bonnes pratiques appliquées

  1. Pas de hardcoding → Variables d'environnement
  2. Validation stricte → Erreurs explicites
  3. Centralisation → Un seul service WebSocket
  4. Documentation → Guide complet + changelog
  5. Architecture propre → Hooks spĂ©cialisĂ©s par type de donnĂ©es

À Ă©viter Ă  l'avenir

  1. ❌ Fallbacks silencieux (masquent les erreurs)
  2. ❌ URLs hardcodĂ©es "temporaires" commentĂ©es
  3. ❌ Duplication de configuration
  4. ❌ Oubli de rebuild aprùs modif env vars

✅ VALIDATION FINALE

Configuration correcte ✅

  • Variable REACT_APP_WS_URL dans .env
  • Variable REACT_APP_WS_URL dans .env.example
  • websocketService.js utilise uniquement la variable
  • Validation stricte si variable manquante
  • Aucun hardcoding rĂ©siduel
  • Backend Ă©coute sur /ws
  • Router WebSocket inclus dans main.py
  • Composants utilisent hooks centralisĂ©s

Documentation créée ✅

  • WEBSOCKET_URL_UPDATE.md - Guide technique
  • .claude/CHANGELOG_WEBSOCKET.md - Ce changelog
  • Commentaires code clarifiĂ©s

Tests Ă  effectuer đŸ§Ș

  • Rebuild + restart frontend
  • Connexion WebSocket rĂ©ussie
  • Logs console corrects
  • Notifications temps rĂ©el fonctionnelles
  • Statistiques se mettent Ă  jour auto
  • StabilitĂ© sur longue durĂ©e

📞 CONTACT

En cas de problÚme : 1. Consulter WEBSOCKET_URL_UPDATE.md (troubleshooting) 2. Vérifier logs backend : docker logs boaz-backend | grep websocket 3. Vérifier logs console navigateur (F12)

Mise à jour contexte projet : - Fichier : .claude/project-context.md - Section : Intégrations tierces > WebSocket - Section : Configuration & Déploiement > Variables d'environnement


Auteur : Équipe Boaz-Housing Dev ValidĂ© par : [À complĂ©ter] Date dĂ©ploiement : [À complĂ©ter aprĂšs rebuild]