# --------------------------------------------------------------------------- # Bloc a ajouter a /opt/edge/Caddyfile sur le serveur Hetzner. # # Pourquoi Caddy et pas Nginx + Certbot : le serveur heberge deja cinq autres # domaines derriere un Caddy qui detient les ports 80 et 443. Y demarrer un # second frontal aurait mis les deux en conflit sur les memes ports et coupe # les services existants. Caddy obtient et renouvelle les certificats # Let's Encrypt tout seul - il n'y a pas de Certbot a installer. # # Les deux orthographes sont servies : "seurveillance" est le sous-domaine # effectivement cree, "surveillance" couvre la faute de frappe dans les deux # sens. Caddy demande un certificat pour chaque nom qui resout vers ce serveur. # # Trois destinations derriere un seul domaine : # /webrtc/* -> MediaMTX, signalisation WebRTC (flux video temps reel) # /hls/* -> MediaMTX, repli HLS # le reste -> l'application Spring Boot (console, API, websocket STOMP) # # Le proxy WebSocket n'a rien a declarer : Caddy propage l'upgrade nativement. # --------------------------------------------------------------------------- video-seurveillance.belkacemi.me, video-surveillance.belkacemi.me { header { Strict-Transport-Security "max-age=31536000; includeSubDomains" X-Content-Type-Options "nosniff" X-Frame-Options "SAMEORIGIN" Referrer-Policy "strict-origin-when-cross-origin" -Server } # L'actuator n'a aucune raison d'etre public : health et metriques # renseignent un attaquant sur les versions et l'etat interne. @actuator path /actuator/* respond @actuator 404 # --- Flux video : WebRTC (latence < 1 s) -------------------------------- # flush_interval -1 desactive la bufferisation de la reponse. Sans ca, la # negociation WHEP et les segments basse latence seraient retenus par le # proxy le temps de remplir un tampon - ce qui annule tout l'interet. handle_path /webrtc/* { reverse_proxy iot-alarm-mediamtx:8889 { flush_interval -1 } } # --- Flux video : HLS (repli, ~6 s) ------------------------------------- # Pas de compression ici : les segments video sont deja compresses, gziper # par-dessus ne gagne rien et consomme du CPU sur un serveur a 2 vCPU. handle_path /hls/* { reverse_proxy iot-alarm-mediamtx:8888 { flush_interval -1 # MediaMTX repond d'abord une redirection vers un chemin ABSOLU # (/biblio/index.m3u8?cookieCheck=1), qui ignore le prefixe /hls # retire par handle_path. Sans cette reecriture, le navigateur # suit la redirection vers l'application Spring Boot au lieu du # serveur media - et recoit du JSON la ou il attend une playlist. header_down Location "^/(.*)$" "/hls/${1}" } } # --- Application Spring Boot (console, API, WebSocket STOMP) ------------ handle { encode gzip zstd reverse_proxy iot-alarm-app:8080 } log { output file /var/log/caddy/iot-alarm.log format json } }