Commit graph

3 commits

Author SHA1 Message Date
d70892dce0 Flux video temps reel : l'iPhone pousse, MediaMTX restitue
L'iPhone n'est joignable depuis nulle part - CGNAT operateur en 4G, NAT
de la box sur le WiFi du studio, UPnP indisponible. Le serveur RTSP de
l'application camera est donc inutilisable de l'exterieur. Seule une
connexion sortante traverse les deux NAT : c'est le telephone qui pousse.

- MediaMTX en conteneur : SRT/RTMP en entree, WebRTC (WHEP) et HLS en
  sortie. La video ne traverse jamais la JVM - 800 kbps continus dans
  Spring Boot couteraient un thread par spectateur sans rien apporter.
- SRT privilegie sur RTMP : RTMP est du TCP, un paquet perdu sur un lien
  mobile bloque tout le flux. SRT retransmet selectivement en UDP.
- Lecture publique (choix assume), publication authentifiee : sans ca
  n'importe qui pousserait sa propre video sur le flux "biblio".
- Console : client WHEP maison avec repli HLS automatique, et mise en
  pause quand l'onglet passe en arriere-plan.

Correction d'un bug trouve en deployant : le @ExceptionHandler(Exception)
avalait les exceptions que Spring sait deja traduire, si bien que toute
URL inconnue renvoyait 500 au lieu de 404 - ce qui noyait les vraies
pannes au milieu des 500 provoques par les crawlers. Test de regression
ajoute.

35 tests au vert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 18:08:34 +02:00
94e893af97 Deploiement Hetzner : script de redeploiement et generation sure du .env
- deploy/deploy.sh : rsync + build distant + attente du healthcheck.
  Le build tourne sur le serveur, la machine de dev n'a pas besoin d'un
  JDK 21 et la difference d'architecture arm64/x86_64 disparait.

- .env.example : la procedure recommandait un `sed -i s/CHANGEME/.../`
  global. Le motif apparaissant aussi dans le commentaire au-dessus, le
  mot de passe genere s'y recopiait en clair. Remplace par un append
  cible sur la seule ligne DB_PASSWORD.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 17:41:05 +02:00
63ead8a966 Systeme d'alarme IoT evenementiel : hexagonal, CQRS, Kafka
Backend d'un systeme de video-surveillance dont le capteur est un iPhone
recycle. Le probleme est simple, la structure est le sujet :

- domain/ sans aucun import de framework (verifie par 7 regles ArchUnit
  qui tournent aussi pendant le docker build)
- CQRS strict : write et read ne partagent ni modele ni port
- AlarmDecision en sealed interface -> switch exhaustif verifie a la
  compilation, plutot qu'une chaine de if
- Kafka en KRaft (Zookeeper est supprime depuis Kafka 4.0), cle de
  partition = deviceId pour garantir l'ordre par capteur
- ErrorHandlingDeserializer + DLQ : un message malforme ne bloque pas
  le flux des evenements suivants
- notification WebSocket differee apres commit, pour ne jamais afficher
  une intrusion qui partirait en rollback

31 tests au vert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-12 17:32:45 +02:00