2026-09-12 17:32:45 +02:00
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
# 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.
|
|
|
|
|
#
|
2026-09-12 18:08:34 +02:00
|
|
|
# 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)
|
2026-09-12 17:32:45 +02:00
|
|
|
#
|
|
|
|
|
# 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
|
|
|
|
|
}
|
|
|
|
|
|
2026-09-12 18:08:34 +02:00
|
|
|
# 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
|
|
|
|
|
}
|
|
|
|
|
|
2026-09-12 17:32:45 +02:00
|
|
|
log {
|
|
|
|
|
output file /var/log/caddy/iot-alarm.log
|
|
|
|
|
format json
|
|
|
|
|
}
|
|
|
|
|
}
|