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>
This commit is contained in:
Adam Belkacemi 2026-09-12 18:08:34 +02:00
parent 94e893af97
commit d70892dce0
12 changed files with 827 additions and 13 deletions

View file

@ -105,6 +105,33 @@ services:
# "edge" pour etre joignable par le reverse proxy.
networks: [default, edge]
# ---------------------------------------------------------------------------
# Serveur media - ingestion du flux iPhone, restitution navigateur
#
# L'iPhone POUSSE vers ce service (SRT ou RTMP). Il ne peut pas etre
# interroge : en 4G comme derriere la box du studio, il n'a pas d'adresse
# joignable depuis Internet. Seul un flux sortant traverse le CGNAT.
#
# Les ports d'ingestion sont publies sur l'hote, ce sont les seuls du projet
# a l'etre. Les sorties HTTP (HLS 8888, WebRTC 8889) restent internes et
# passent par Caddy, qui leur apporte le TLS du domaine.
# ---------------------------------------------------------------------------
mediamtx:
image: bluenviron/mediamtx:1.21.0
container_name: iot-alarm-mediamtx
restart: unless-stopped
volumes:
- ./deploy/mediamtx/mediamtx.yml:/mediamtx.yml:ro
ports:
- "1935:1935" # RTMP (TCP) - ingestion, repli
- "8890:8890/udp" # SRT (UDP) - ingestion, a privilegier
- "8189:8189/udp" # WebRTC ICE - media vers les navigateurs
mem_limit: 256m
# Image sans shell (base scratch) : pas de healthcheck par commande.
# La disponibilite se lit sur /actuator du cote applicatif et dans les
# logs du conteneur.
networks: [default, edge]
# ---------------------------------------------------------------------------
# Nginx - profil "standalone" uniquement
#