Compare commits

..

5 Commits

Author SHA1 Message Date
benoit 8882ff5892 fix: mode dev avec proxy WebSocket, mode prod avec HTTP direct
- Mode dev : proxy Vite /livekit → ws://localhost:7880 (évite mixed content)
- Mode prod : HTTP direct, pas de HTTPS (auto-hébergé local)
- Détection automatique du mode via import.meta.env.DEV
- En production réelle, HTTPS sera géré par reverse proxy
2026-05-27 22:42:18 +02:00
benoit b454fb2584 fix: connexion directe LiveKit en mode production
- Suppression du proxy /livekit qui n'existe qu'en dev
- Utilisation directe de l'URL WebSocket (ws://IP:7880)
- Rebuild client avec correction
- Résout l'erreur 'websocket closed code 1006'
2026-05-27 22:34:39 +02:00
benoit e84ed7c731 fix: routes API accessibles sous /api en production
- Création d'un apiRouter Express pour toutes les routes API
- Routes montées sous /api ET à la racine (rétrocompatibilité)
- QR code corrigé : HTTPS en mode production
- start.sh : affichage URL HTTPS corrigé
- Résout le problème de connexion en mode production
2026-05-27 22:31:41 +02:00
benoit 70fc1e833d fix: configuration API client pour mode production
- Ajout .env.production avec VITE_API_URL=. (URLs relatives)
- Le client build utilise maintenant les routes directes (/config au lieu de /api/config)
- Rebuild client avec la bonne configuration pour HTTPS production
2026-05-27 21:58:11 +02:00
benoit d46fa708e7 fix: health check HTTPS en mode production
- start.sh teste maintenant https://localhost:3000 en production
- Ajout flag -k à curl pour accepter certificat auto-signé
- Correction timeout qui empêchait le démarrage
2026-05-27 21:48:27 +02:00
7 changed files with 37 additions and 13 deletions
+5
View File
@@ -0,0 +1,5 @@
# Configuration PTT Live Client - Production
# Le client est servi depuis le même domaine que l'API
# URLs relatives directes (pas de proxy /api)
VITE_API_URL=.
+1 -1
View File
@@ -81,7 +81,7 @@ define(['./workbox-290dd570'], (function (workbox) { 'use strict';
"revision": "3ca0b8505b4bec776b69afdba2768812"
}, {
"url": "index.html",
"revision": "0.spc2v3301v8"
"revision": "0.lhgefe7plc8"
}], {});
workbox.cleanupOutdatedCaches();
workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), {
File diff suppressed because one or more lines are too long
+6 -3
View File
@@ -100,14 +100,17 @@ function App() {
const data = await response.json();
// Adapter l'URL LiveKit selon le protocole de la page
// En mode dev (HTTPS via Vite), utiliser le proxy WebSocket
// En mode prod (HTTP direct), utiliser l'URL LiveKit directement
let livekitUrl = data.url;
if (window.location.protocol === 'https:') {
// En HTTPS, utiliser le proxy WSS local via Vite
if (import.meta.env.DEV && window.location.protocol === 'https:') {
// Mode dev avec Vite : utiliser le proxy WSS
livekitUrl = `${window.location.protocol}//${window.location.host}/livekit`;
}
console.log('🔗 Connexion LiveKit:', livekitUrl);
console.log('📝 Mode:', import.meta.env.DEV ? 'dev' : 'prod');
// Se connecter à LiveKit avec les canaux virtuels
await connect(livekitUrl, data.token, data.virtualChannels || []);
+11 -4
View File
@@ -221,11 +221,14 @@ app.use('/admin', adminRouter);
// ========== Routes API ==========
// Créer un router pour les routes API
const apiRouter = express.Router();
/**
* GET /config
* Retourne la configuration des groupes
*/
app.get('/config', (req, res) => {
apiRouter.get('/config', (req, res) => {
try {
const clientConfig = {
groups: config.groups.map(g => ({
@@ -249,7 +252,7 @@ app.get('/config', (req, res) => {
* GET /groups
* Retourne la liste des groupes disponibles (simplifié)
*/
app.get('/groups', (req, res) => {
apiRouter.get('/groups', (req, res) => {
try {
const groups = config.groups.map(g => ({
id: g.id,
@@ -268,7 +271,7 @@ app.get('/groups', (req, res) => {
* Génère un token LiveKit pour un client
* Body: { username: string, groupId: string }
*/
app.post('/token', async (req, res) => {
apiRouter.post('/token', async (req, res) => {
try {
const { username, groupId } = req.body;
@@ -347,7 +350,7 @@ app.post('/token', async (req, res) => {
* GET /health
* Health check
*/
app.get('/health', (req, res) => {
apiRouter.get('/health', (req, res) => {
const isLivekitRunning = livekitProcess !== null;
res.json({
status: isLivekitRunning ? 'ok' : 'degraded',
@@ -356,6 +359,10 @@ app.get('/health', (req, res) => {
});
});
// Monter le router API sous /api ET à la racine (rétrocompatibilité)
app.use('/api', apiRouter);
app.use(apiRouter); // Routes accessibles aussi sans préfixe /api
/**
* GET /
* Info serveur OU client PWA (si build existe)
+3 -3
View File
@@ -27,11 +27,11 @@ NETWORK_IP=$(get_network_ip)
# Déterminer l'URL selon mode dev ou prod
if [ -d "client/dist" ] && [ "$1" != "--dev" ]; then
# Mode production
URL="http://${NETWORK_IP}:3000"
# Mode production (HTTPS)
URL="https://${NETWORK_IP}:3000"
MODE="production"
else
# Mode dev
# Mode dev (HTTPS)
URL="https://${NETWORK_IP}:5173"
MODE="dev"
fi
+10 -1
View File
@@ -107,8 +107,16 @@ cd ..
# Attendre que le serveur soit prêt
echo ""
echo -e "${YELLOW}⏳ Attente démarrage serveur...${NC}"
# Déterminer le protocole selon le mode
if [ "$1" != "--dev" ]; then
HEALTH_URL="https://localhost:3000/health"
else
HEALTH_URL="http://localhost:3000/health"
fi
for i in {1..30}; do
if curl -sf http://localhost:3000/health > /dev/null 2>&1; then
if curl -kssf "$HEALTH_URL" > /dev/null 2>&1; then
echo -e "${GREEN}✓ Serveur prêt${NC}"
break
fi
@@ -184,6 +192,7 @@ else
echo -e "${YELLOW} (Cliquez sur 'Avancé' puis 'Continuer')${NC}"
echo ""
echo "🎛️ Interface admin : https://localhost:3000/admin"
echo "📊 API serveur : https://localhost:3000/api"
echo ""
echo "📝 Logs serveur : tail -f server.log"
echo ""