Problème : l'édition et la suppression de groupes ne fonctionnaient pas car les IDs n'étaient pas persistés dans le YAML.
Solution :
- loadConfig() génère maintenant les IDs à chaque chargement (slugify du nom)
- PUT /admin/groups/:id cherche le groupe par nom slugifié au lieu de l'ID
- DELETE /admin/groups/:id idem
- Les IDs ne sont jamais sauvegardés dans config.yaml (source de vérité = nom)
- Rechargement après mise à jour pour renvoyer les IDs corrects au client
Comportement :
- Création : génère l'ID depuis le nom
- Édition : trouve le groupe par son nom slugifié, sauvegarde sans ID, recharge
- Suppression : trouve le groupe par son nom slugifié
- Les IDs restent cohérents entre les rechargements
Simplification majeure de la configuration des groupes :
- Suppression des champs redondants 'id' et 'description'
- Le nom du groupe sert maintenant d'identifiant (converti en slug automatiquement)
- Génération automatique des IDs pour groupes et canaux via fonction slugify()
Backend (server/) :
- Ajout fonction slugify() pour génération d'IDs à partir des noms
- Génération automatique des IDs au chargement de la config (index.js)
- API admin adaptée : POST/PUT /admin/groups génèrent les IDs automatiquement
- Pas besoin de fournir l'ID lors de la création/modification
Frontend (client/src/Admin.jsx + Admin.css) :
- Suppression champs ID et description du formulaire
- Simplification interface : nom + bitrate + canaux
- Mise à jour layout CSS canal (4 colonnes au lieu de 5)
- Cartes de groupe épurées (plus d'affichage d'ID)
Configuration (config.yaml) :
- Format simplifié : groupes avec 'name', 'channels' et 'audioBitrate' optionnel
- Exemple : "Production" au lieu de id/name/description séparés
- Plus lisible et maintenable
Les IDs sont générés dynamiquement :
- Groupe "Production" → id: "production"
- Canal "Principal" → id: "production-principal"
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implémentation complète de l'interface d'administration web :
Backend (server/api/admin.js) :
- Endpoints CRUD pour gestion des groupes (GET/POST/PUT/DELETE /admin/groups)
- Gestion utilisateurs connectés en temps réel (GET/DELETE /admin/users)
- Monitoring statistiques système (GET /admin/stats)
- Affichage logs serveur avec filtrage (GET /admin/logs)
- Configuration audio globale (PUT /admin/config/audio)
- Système de tracking des connexions/déconnexions
- Export fonctions registerUser, unregisterUser, addLog
Frontend (client/src/Admin.jsx + Admin.css) :
- Interface admin complète avec 4 onglets (Groupes, Utilisateurs, Stats, Logs)
- Gestion groupes : création, modification, suppression avec formulaires
- Gestion canaux audio par groupe (inputs/outputs)
- Liste utilisateurs connectés avec déconnexion forcée
- Dashboard statistiques temps réel (connexions, uptime, mémoire)
- Viewer logs avec code couleur par niveau (debug/info/warn/error)
- Rafraîchissement auto toutes les 3s
- Design responsive et mode sombre
Intégration système :
- Routes admin montées sous /admin dans index.js
- Enregistrement automatique des utilisateurs lors de la génération de token
- Logs serveur centralisés dans le système admin
- Routing simple frontend pour /admin (main.jsx)
🎛️ Interface accessible via https://localhost:5173/admin🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Ajout de 3 groupes dans config.yaml : Production, Technique, Sonorisation
- Nouvel endpoint API GET /groups pour lister les groupes disponibles
- Composant GroupSelector.jsx pour changer de groupe pendant la session
- Hook useLiveKit étendu avec fonction switchGroup() pour reconnexion
- Intégration dans App.jsx avec gestion du changement de groupe
- Chaque groupe = 1 room LiveKit distincte
- Qualité audio configurable par groupe (96-128 kbps)
Problème :
Le serveur retournait ws://localhost:7880 aux clients, empêchant
les connexions depuis d'autres appareils sur le réseau.
Solution :
- Ajout détection automatique IP réseau (WiFi/Ethernet)
- Variable LIVEKIT_URL=AUTO pour mode auto-détection
- Fonction getNetworkIP() avec priorité interfaces (en0, en1, eth0, wlan0)
- Affichage IP détectée au démarrage du serveur
- Fallback vers localhost si IP non détectée
Modifications :
- server/index.js : ajout getNetworkIP() et détection AUTO
- server/.env : LIVEKIT_URL=AUTO par défaut
- server/.env.example : documentation modes configuration
- NETWORK_SETUP.md : guide complet configuration réseau et dépannage
Les clients reçoivent maintenant ws://IP_RESEAU:7880 et peuvent
se connecter depuis n'importe quel appareil sur le même réseau WiFi.
Ports utilisés :
- 3000 : API REST
- 7880 : LiveKit WebSocket
- 7882 : LiveKit UDP (RTP)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Support variable PORT en environnement
- Gestion propre de l'erreur EADDRINUSE
- Message d'aide pour utiliser un port alternatif
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implémentation du serveur Node.js avec intégration LiveKit et API REST complète :
- Serveur Express avec API REST (endpoints /config, /token, /health)
- Génération tokens JWT LiveKit pour authentification clients
- Configuration YAML pour groupes et canaux audio
- Support mode cloud LiveKit (pas de binaire requis pour Phase 1)
- Logging structuré avec niveaux configurables
- Gestion propre du lifecycle (SIGTERM, SIGINT)
Endpoints fonctionnels :
- GET /config : retourne configuration groupes/canaux
- POST /token : génère token LiveKit pour un utilisateur/groupe
- GET /health : health check du serveur
- GET / : informations serveur
Phase 1.2 complétée : Infrastructure serveur opérationnelle
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>