- Deleted apps/web/src/utils/optimisticStoreUpdates.ts (unused file) - File was unused - no imports found in codebase - Mutations already use React Query's onMutate pattern - No TypeScript errors after deletion - Actions 4.4.1.2 and 4.4.1.3 complete
224 lines
6.1 KiB
Markdown
224 lines
6.1 KiB
Markdown
# REMÉDIATION APPLIQUÉE - BARE METAL vs INCUS
|
|
**Date:** 2026-01-15
|
|
**Objectif:** Corriger l'erreur React.Children et les erreurs 503 intermittentes
|
|
|
|
---
|
|
|
|
## ✅ CORRECTIONS APPLIQUÉES
|
|
|
|
### 1. Stabilisation Réseau Container Web (Correction 503 Intermittent)
|
|
|
|
**Fichier modifié:** `config/incus/deploy-service-native.sh`
|
|
|
|
**Améliorations:**
|
|
- Script `setup-network.sh` amélioré avec retries (5 tentatives)
|
|
- Vérification de connectivité après configuration
|
|
- Service systemd `veza-network-setup.service` avec:
|
|
- Dépendances réseau correctes (`After=network-online.target`)
|
|
- Restart automatique en cas d'échec
|
|
- Exécution avant Apache pour garantir l'IP
|
|
|
|
**Code ajouté:**
|
|
```bash
|
|
# Script avec retries et vérification
|
|
MAX_RETRIES=5
|
|
configure_network() {
|
|
# ... configuration avec retries
|
|
# Vérification ping vers gateway
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 2. Désactivation Service Worker (Correction React.Children - P0)
|
|
|
|
**Fichiers modifiés:**
|
|
- `apps/web/src/services/pwa.ts`
|
|
- `apps/web/public/sw.js`
|
|
|
|
**Modifications:**
|
|
|
|
#### pwa.ts
|
|
- Service Worker complètement désactivé dans `registerServiceWorker()`
|
|
- Retour immédiat pour éviter toute enregistrement
|
|
- Commentaire explicatif sur la raison (cache conflicts)
|
|
|
|
#### sw.js
|
|
- Event `install`: Supprime tous les caches existants immédiatement
|
|
- Event `activate`: Supprime TOUS les caches (pas seulement les anciens)
|
|
- Prend le contrôle immédiatement avec `clients.claim()`
|
|
|
|
**Code:**
|
|
```typescript
|
|
// pwa.ts
|
|
private async registerServiceWorker(): Promise<void> {
|
|
// CRITICAL FIX: Disable Service Worker completely
|
|
logger.info('[PWA] Service Worker disabled to prevent cache conflicts');
|
|
return;
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 3. Optimisation Build Vite (Ordre des Chunks)
|
|
|
|
**Fichier modifié:** `apps/web/vite.config.ts`
|
|
|
|
**Améliorations:**
|
|
- Plugin `fix-react-loading-order` amélioré
|
|
- Ajout de `modulepreload` pour `vendor-react-core` dans le HTML
|
|
- Garantit que React est chargé avant Zustand
|
|
|
|
**Code:**
|
|
```typescript
|
|
{
|
|
name: 'fix-react-loading-order',
|
|
transformIndexHtml(html) {
|
|
// Ajouter modulepreload pour vendor-react-core
|
|
const reactChunkMatch = html.match(/src="([^"]*vendor-react-core[^"]*\.js)"/);
|
|
if (reactChunkMatch) {
|
|
html = html.replace(
|
|
/<script type="module"/,
|
|
`<link rel="modulepreload" href="${reactChunkMatch[1]}" crossorigin>\n <script type="module"`
|
|
);
|
|
}
|
|
return html;
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 4. Configuration Apache & Cache Busting
|
|
|
|
**Fichier modifié:** `config/incus/apache/veza-web.conf`
|
|
|
|
**Ajouts:**
|
|
- Headers `no-cache` pour `/js/*.js` (tous les chunks JS)
|
|
- Headers `no-cache` pour `/sw.js` (Service Worker)
|
|
- Headers `no-cache` pour `/index.html` (références aux chunks)
|
|
- Cache JavaScript désactivé dans `mod_expires`
|
|
|
|
**Code:**
|
|
```apache
|
|
# CRITICAL FIX: No-cache headers for JS chunks
|
|
<LocationMatch "^/js/.*\.js$">
|
|
Header set Cache-Control "no-cache, no-store, must-revalidate"
|
|
Header set Pragma "no-cache"
|
|
Header set Expires "0"
|
|
</LocationMatch>
|
|
|
|
# CRITICAL FIX: No-cache for Service Worker
|
|
<LocationMatch "^/sw\.js$">
|
|
Header set Cache-Control "no-cache, no-store, must-revalidate"
|
|
Header set Pragma "no-cache"
|
|
Header set Expires "0"
|
|
</LocationMatch>
|
|
|
|
# CRITICAL FIX: No-cache for index.html
|
|
<LocationMatch "^/index\.html$">
|
|
Header set Cache-Control "no-cache, no-store, must-revalidate"
|
|
Header set Pragma "no-cache"
|
|
Header set Expires "0"
|
|
</LocationMatch>
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 COMMANDES DE REBUILD ET DÉPLOIEMENT
|
|
|
|
### 1. Build du Frontend
|
|
```bash
|
|
cd /home/senke/git/talas/veza
|
|
./config/incus/build-native.sh web
|
|
```
|
|
|
|
### 2. Déploiement du Frontend
|
|
```bash
|
|
./config/incus/deploy-service-native.sh web
|
|
```
|
|
|
|
Cette commande va:
|
|
- Copier les fichiers build dans le container
|
|
- Copier la nouvelle configuration Apache
|
|
- Reconfigurer le réseau (IP persistante)
|
|
- Redémarrer Apache
|
|
|
|
### 3. Vérification du Déploiement
|
|
```bash
|
|
./config/incus/verify-deployment.sh web
|
|
```
|
|
|
|
### 4. Test dans le Navigateur
|
|
|
|
**URL:** `https://10.10.10.6`
|
|
|
|
**⚠️ IMPORTANT - Vider le cache avant de tester:**
|
|
1. Ouvrir DevTools (F12)
|
|
2. Application > Storage > Clear site data
|
|
3. Application > Service Workers > Unregister (si présent)
|
|
4. Network > Disable cache (pendant les tests)
|
|
5. Hard refresh: `Ctrl+Shift+R` (ou `Cmd+Shift+R` sur Mac)
|
|
|
|
---
|
|
|
|
## 📊 RÉSULTATS ATTENDUS
|
|
|
|
### Avant les corrections:
|
|
- ❌ Erreur React.Children: `Cannot set properties of undefined (setting 'Children')`
|
|
- ⚠️ Frontend 503 intermittent (container perd IP)
|
|
- ❌ Application ne se charge pas
|
|
|
|
### Après les corrections:
|
|
- ✅ Pas d'erreur React.Children
|
|
- ✅ Frontend accessible (pas de 503)
|
|
- ✅ Application se charge correctement
|
|
- ✅ Chunks JS toujours à jour (pas de cache)
|
|
|
|
---
|
|
|
|
## 🔍 VALIDATION
|
|
|
|
### Tests à effectuer:
|
|
|
|
1. **Test réseau:**
|
|
```bash
|
|
incus exec veza-web -- ip addr show eth0 | grep "10.10.10.5"
|
|
# Doit afficher: inet 10.10.10.5/24
|
|
```
|
|
|
|
2. **Test Apache:**
|
|
```bash
|
|
curl -k -I https://10.10.10.6/ | grep "Cache-Control"
|
|
# Doit afficher: Cache-Control: no-cache, no-store, must-revalidate
|
|
```
|
|
|
|
3. **Test JS chunks:**
|
|
```bash
|
|
curl -k -I https://10.10.10.6/js/vendor-react-core-*.js | grep "Cache-Control"
|
|
# Doit afficher: Cache-Control: no-cache, no-store, must-revalidate
|
|
```
|
|
|
|
4. **Test navigateur:**
|
|
- Ouvrir `https://10.10.10.6`
|
|
- Vérifier la console (F12) - pas d'erreur React.Children
|
|
- Vérifier Network tab - chunks JS chargés avec headers no-cache
|
|
|
|
---
|
|
|
|
## 📝 NOTES IMPORTANTES
|
|
|
|
1. **Service Worker:** Complètement désactivé. Si besoin de réactiver plus tard, il faudra:
|
|
- Réactiver dans `pwa.ts`
|
|
- S'assurer que le cache ne sert jamais d'anciens chunks JS
|
|
- Implémenter une stratégie de cache busting robuste
|
|
|
|
2. **Cache navigateur:** Les headers no-cache forcent le navigateur à toujours récupérer les chunks JS depuis le serveur. Cela garantit que les dernières versions sont toujours utilisées.
|
|
|
|
3. **Réseau:** Le script de setup réseau avec retries garantit que l'IP est toujours configurée, même après un redémarrage du container.
|
|
|
|
4. **Ordre de chargement:** Le modulepreload garantit que React est chargé avant Zustand, évitant l'erreur React.Children.
|
|
|
|
---
|
|
|
|
**Fin du rapport de remédiation**
|