Nettoyage et construction micro services

This commit is contained in:
Christian CUNAT-BRULE
2026-09-13 13:02:10 +02:00
parent d8eb7f4375
commit 941feb3e96
77 changed files with 4477 additions and 8473 deletions
+5 -5
View File
@@ -2,11 +2,11 @@
## Favoris et affichage tactile
La référence actuelle est un écran **10 pouces tactile en paysage**, interprété comme **1200 pixels de large et 1080 de haut**. Le rendu reste adaptatif. Le bouton hamburger replie la barre latérale sans recharger la page ; le choix est enregistré dans ce navigateur. L’en-tête est placé dans le contenu et le pied de page reste visible pour les essais.
La référence actuelle est un écran **10 pouces tactile en paysage**, interprété comme **1200 pixels de large et 1080 de haut**. Le rendu reste adaptatif. Le bouton hamburger replie la barre latérale sans recharger la page ; le choix est enregistré dans ce navigateur. L’en-tête est placé dans le contenu et les informations de pied de page sont regroupées dans les réglages.
Le catalogue se trouve dans Applications (`#apps`). Personnaliser permet de sélectionner jusqu’à quatre favoris, leur ordre, les applications visibles et le mode d’ouverture des services externes. Choisir un favori déjà présent échange les positions. Masquer un favori libère sa place ; cela ne désactive pas une fonction de CARIA et ne met pas la musique en pause. Applications et le logo d’accueil restent accessibles. Les préférences sont propres au navigateur et synchronisées entre ses onglets de même origine.
Le catalogue se trouve dans Applications (`#apps`). Personnaliser permet de sélectionner jusqu’à quatre favoris, leur ordre, les applications visibles et le mode d’ouverture des services externes. Choisir un favori déjà présent échange les positions. Masquer un favori libère sa place ; cela ne désactive pas une fonction de CARIA et ne met pas la musique en pause. Applications reste accessible. Les préférences sont propres au navigateur et synchronisées entre ses onglets de même origine.
Conduite est un favori par défaut pour les essais. Pour son futur écran séparé : `/?display=drive#drive` ouvre directement les instruments et replie la barre. Les grands compteurs ont une base plate sous Vitesse/Régime moteur. Carburant, refroidissement, batterie et extérieur sont visibles rapidement ; Détails du véhicule ouvre les valeurs et leur explication. Toutes ces mesures restent simulées et sont masquées si l’API devient indisponible.
Conduite est un favori par défaut pour les essais. Pour son futur écran séparé : `/?display=drive#drive` ouvre directement les instruments et replie la barre. Les trois styles de compteurs sont conservés : analogique, analogique lumineux et numérique. Carburant et refroidissement sont intégrés sous les grands cadrans ; Détails du véhicule contient les autres mesures et leurs explications. Toutes ces mesures restent simulées et sont masquées si l’API devient indisponible.
## Services Web et lecteurs intégrés
@@ -18,7 +18,7 @@ Les raccourcis externes par défaut sont Jellyfin, Spotify, YouTube, YouTube Mus
| Même onglet | Quitte CARIA ; le bouton Retour permet de revenir. La musique locale et le GPS peuvent être interrompus. |
| Lecteur intégré | Reste dans CARIA, avec un cadre officiel/service compatible et un lien externe de secours. Disponible hors Waze. |
**Jellyfin** : utilise l’adresse configurée dans les réglages. Le serveur et son reverse proxy doivent autoriser l’origine de CARIA à l’afficher dans un cadre. Le contrôle public des en-têtes de `https://media.cunatbrule.fr/web/` a répondu HTTP 200 sans restriction de cadrage explicite dans ces en-têtes au moment du test ; les pages d’authentification, cookies et lectures restent à vérifier avec le compte réel. Aucune configuration de serveur Jellyfin n’a été changée. L’interface CARIA ne peut ni garantir ni inspecter une connexion dans un cadre d’une autre origine.
**Jellyfin** : utilise l’adresse fixe `https://media.cunatbrule.fr/web/` déclarée dans `ui/applications.js`. Le serveur et son reverse proxy doivent autoriser l’origine de CARIA à l’afficher dans un cadre. Le contrôle public des en-têtes de `https://media.cunatbrule.fr/web/` a répondu HTTP 200 sans restriction de cadrage explicite dans ces en-têtes au moment du test ; les pages d’authentification, cookies et lectures restent à vérifier avec le compte réel. Aucune configuration de serveur Jellyfin n’a été changée. L’interface CARIA ne peut ni garantir ni inspecter une connexion dans un cadre d’une autre origine.
**Spotify** : le mode intégré attend un lien de morceau, album, playlist, épisode ou émission, et construit le lecteur officiel `open.spotify.com/embed/...`. Il ne reproduit pas la navigation complète de l’application. La connexion, la durée/possibilité de lecture et les restrictions appartiennent au lecteur Spotify. Voir les [Embeds officiels](https://developer.spotify.com/documentation/embeds).
@@ -32,7 +32,7 @@ Les lecteurs intégrés se chargent après un appui et, pour Spotify/YouTube, ap
Depuis Musique locale, « Vue lecture immersive » ouvre `#now-playing`. La bibliothèque reste disponible et le morceau en cours continue : les deux vues pilotent le même lecteur HTML audio.
L’arc coloré suit le temps réellement lu. La barre de progression permet de déplacer la lecture au tactile ou au clavier ; les commandes proposent lecture/pause, morceau précédent/suivant, recul/avance de 15 secondes, répétition du morceau, volume et silence. Les contrôles de transport sont désactivés sans morceau. Le titre, la durée et les commandes se synchronisent avec le lecteur de la bibliothèque. La sélection des fichiers reste locale et doit encore être refaite après rechargement de la page.
L’arc coloré suit le temps réellement lu. La vue immersive ne comporte plus de barre de recherche ; les commandes proposent lecture/pause, précédent/suivant, aléatoire, répétition du morceau, volume et silence. Un appui sur précédent revient au début ; deux appuis en moins de 600 ms reviennent au morceau précédent. Le halo est animé pendant la lecture et respecte la préférence de réduction des animations. Les contrôles de transport sont désactivés sans morceau. Le titre, la durée et les commandes se synchronisent avec le lecteur de la bibliothèque. La sélection des fichiers reste locale et doit encore être refaite après rechargement de la page.
## Tests et limites
+8
View File
@@ -1,5 +1,13 @@
# Contrat et déploiement
## Services
Le navigateur conserve les mêmes URL. Nginx distribue les requêtes aux services internes : télémétrie (`/api/telemetry`), météo (`/api/weather`) et navigation (`/api/search`, `/api/route`, `/api/map-config`). Chaque conteneur possède son processus, son cache et son contrôle de santé. Les rôles sont définis dans `server/server.mjs` et sélectionnés par `SERVICE_ROLE` ; les autres routes sont refusées. Les API ne publient aucun port sur l’hôte.
Le module des fournisseurs est partagé entre services pour conserver validation, cache borné et temporisations. Le processus de télémétrie n’appelle aucun fournisseur. L’interface peut démarrer même lorsqu’une API est arrêtée. La réponse d’erreur et les indicateurs de perte de données du client restent ceux du cockpit existant.
La commande `npm start` conserve un serveur regroupé pour les tests et le développement. `compose.dev.yaml` ne change que le montage des fichiers UI ; les API restent séparées.
## API de démonstration v1
`GET /api/health` renvoie `{"status":"ok","source":"demo"}`.
-57
View File
@@ -1,57 +0,0 @@
# Audit initial — 12 septembre 2026
## Périmètre
Inventaire de tous les fichiers de travail de CARIA-AUTOMOTIVE, examen du serveur, des interfaces, des scripts de lancement, des modules et scénarios Python et des dépendances. `WebControl/` contient 53 fichiers, environ 2,33 Mo. Le projet comporte aussi `.gitignore`, un README initial minimal et les métadonnées Git. Les binaires, polices, bibliothèques JavaScript/CSS tierces et journaux ont été inventoriés ; ils ne font pas l’objet d’un audit exhaustif de leur contenu. Les certificats n’ont pas été reproduits dans le rapport.
L’application matérielle n’a pas été exécutée : elle initialise les GPIO et le port série et certains scripts commandent les moteurs. Aucune connexion au véhicule n’a été tentée.
## Organisation trouvée
| Dossier / fichier | Rôle |
| --- | --- |
| `WebControl/main.py` | Serveur Bottle, commandes robot, pages, résultats d’accès et commandes système |
| `WebControl/MainCLIControl.py` | Menu CLI de lancement des scénarios/tests |
| `WebControl/templates/` | Administration, accès, page de tests presque vide |
| `WebControl/js/` et `css/` | jQuery, Bootstrap et compteur de vitesse bitmap |
| `WebControl/images/` et `fonts/` | Fond du compteur, aiguille, police LED et Glyphicons |
| `WebControl/modules/AlphaBot.py` | GPIO, moteurs PWM, servo, lidar série, obstacles et journalisation |
| `WebControl/modules/*MFRC522*` | Lecteur RFID et accès SPI |
| `WebControl/apps/` | RFID, scénario de porte, itinéraires, lidar et évitement d’obstacles |
| `WebControl/tests/` | Essais physiques, pas une suite de tests unitaires |
| `WebControl/logs/` | Journaux d’exécution, résultats et trajets JSON |
| `WebControl/install/` | Liste figée de nombreux paquets du poste Raspberry Pi |
| `WebControl/fixs/`, `webcontrol-launch.sh`, `NOTE.txt` | Redémarrage, Motion, RFID, crontab et sudo |
| `WebControl/sendMyIP.py` | Exemple d’envoi d’adresse IP vers un endpoint fictif |
| `WebControl/ssl/` | Certificat et clé présents dans le dépôt historique |
## Constats qui déterminent la nouvelle architecture
1. **Couplage matériel au démarrage** : `main.py` instancie `AlphaBot`, qui ouvre `/dev/ttyAMA0` et initialise les GPIO. L’interface ne peut donc pas être simplement transférée sur un PC ou ODroid sans le matériel et ces bibliothèques.
2. **Chemins et adresses figés** : `/home/christian/WebControl`, adresses `192.168.253.194`, commandes `sudo`, dépendance à Motion. Le nouveau cockpit utilise des URL relatives et une configuration Docker.
3. **Vitesse non mesurée** : le curseur historique pilote un rapport cyclique PWM ; ce n’est pas une vitesse réelle en km/h. Le nouveau compteur est alimenté par des valeurs explicitement simulées. Son mapping d’aiguille couvre directement -130° à +130°.
4. **Distribution des fichiers trop large** : la route générique de Bottle sert depuis `./`, avec en plus des routes vers modules, scripts et templates. Avec le répertoire de lancement prévu, les sources et fichiers SSL peuvent être demandés via HTTP. La nouvelle image web ne copie que ses fichiers publics ; l’ancien dossier est exclu du contexte Docker.
5. **Commandes système et robot accessibles par HTTP sans authentification apparente** : reboot, Motion, scripts et moteurs sont mélangés à l’administration. Ces fonctions ne font pas partie du nouveau cockpit, qui fournit une API en lecture seule.
6. **Dépendances non portables** : le fichier d’installation ressemble à un export complet du système scolaire, incluant GPIO, bureau et paquets anciens. La nouvelle version n’en dépend pas.
7. **Licence globale absente** : certains modules tiers contiennent des notices propres (MFRC522 notamment). Il faudra clarifier les licences avant diffusion publique du dépôt complet.
## Anomalies historiques repérées (non corrigées dans ce lot)
- `js/script.js` associe tous les boutons à `/cmd`, y compris ceux sans lien avec la conduite, et lie plusieurs événements aux curseurs.
- `js/test_status.js` appelle `/test_status`, sans route correspondante dans le serveur lu.
- Le template utilise `testRFIDCarDoor`, alors que le serveur attend `appRFIDCarDoor`.
- `modules/joyit_mfrc522/__init__.py` importe `.SimpleMFRC522`, absent de ce sous-dossier ; un fichier homonyme est au niveau supérieur.
- `itineraire_suivre_emergency_speed.py` attend sur `Ab.vitesse_queue.get()` avant de démarrer le producteur. `execute_maneuver` y a deux paramètres mais plusieurs appels en passent trois.
- `AlphaBot.monitor_obstacle` utilise une variable globale du module, distincte de celle des scénarios ; sa boucle d’attente d’un obstacle ne consulte pas l’événement d’arrêt.
- `AlphaBot.monitor_vitesse` peut boucler sans pause lorsqu’aucune trame n’est disponible.
- Le scénario RFID attribue `scenario successful` puis compare le statut final à `movement successful`.
Ces éléments justifient de conserver le projet scolaire comme référence et de développer l’interface multimédia dans des dossiers dédiés. Ils ne constituent pas une certification du fonctionnement des autres chemins du robot.
## Références DEMO-Interfaces
Inventaire du launcher Python/Tkinter NUC (raccourcis Windows, applications, images, arrière-plans), de sa capture `Interface GUI 2025/interface.png` et des projets Tasker auto/moto (XML, APK et images). Le launcher repose sur des chemins Windows et des exécutables locaux. Inspiration retenue : applications clairement identifiables, grands boutons et thème sombre. La nouvelle interface réinterprète ces principes avec quatre accès latéraux et un accueil central ; les exécutables/APK n’ont pas été lancés et les assets tiers n’ont pas été copiés.
## Livraison de cette étape
`ui/` fournit les vues multimédia et conduite ; `server/` fournit les données de démonstration ; `compose.yaml` sépare les deux services. Le code historique reste inchangé. Voir le README pour les validations exécutées et les limites matérielles restantes.
+27
View File
@@ -0,0 +1,27 @@
# Nettoyage et découpage — 13 septembre 2026
## Périmètre
Quatre services Compose : interface, télémétrie, météo, navigation. L’image Node est partagée mais chaque rôle n’expose que ses routes. Le mode regroupé est conservé pour le développement. Les contrats API et les préférences locales sont conservés.
## Nettoyage réalisé
- Suppression du rendu HTML des anciennes jauges cachées, de leur animation inutile à chaque acquisition et des anciens segments abandonnés dans les styles.
- Extraction des instruments et de la musique depuis le fichier principal ; les icônes ne dépendent plus d’un fragment HTML invisible.
- Retrait des abonnements à l’ancien réglage d’adresse de streaming et des liens multi-écrans supprimés de l’interface.
- Mise en forme des styles, suppression des sélecteurs abandonnés et de 45 déclarations remplacées par des règles ultérieures identiques en sélecteur.
- Icônes lecture/pause et volume reconstruites uniquement quand leur état change, plutôt qu’à chaque mise à jour audio.
- Compression Nginx activée pour les fichiers textuels. Les quatre feuilles de style passent de 14 484 à 12 558 octets après gzip dans la mesure locale (environ 13 %). Ce chiffre n’est pas une mesure CPU/RAM sur ODroid.
- Exclusion explicite des tests et documents des images de production.
- Suppression de l’audit scolaire initial devenu obsolète ; le répertoire WebControl avait déjà été supprimé par le propriétaire. L’historique Git est conservé.
- Aucun autre fichier source entier n’était inutile : les modules, tests et fichiers Leaflet restants sont conservés.
## Vérifications
Comparaison visuelle avec un jeu de 144 captures avant nettoyage : huit vues, trois styles, deux ambiances et trois tailles. Horloge et données figées pour rendre la comparaison déterministe. Les suites navigateur couvrent aussi la navigation, les favoris, les lecteurs intégrés, la musique et quatre formats d’écran. Les tests API vérifient l’isolation des services, leurs contrats et la continuité télémétrie/navigation après arrêt de la météo.
## Limites de validation
Docker/Nginx ne sont pas disponibles sur ce poste. La construction, le routage Nginx réel, les redémarrages Compose et l’usage mémoire de trois processus Node restent à vérifier sur l’hôte de déploiement. Le découpage facilite les redémarrages indépendants mais ajoute deux processus par rapport à l’ancienne architecture ; aucun gain global de RAM n’est revendiqué.
La configuration de développement par volume est optionnelle. L’API et les styles restent modifiables sans bundler ni framework ajouté. Les trois variantes de compteurs et leurs valeurs numériques de test sont conservées.