video-surveillance-app/deploy/Caddyfile.snippet

74 lines
3.1 KiB
Text
Raw Permalink Normal View History

# ---------------------------------------------------------------------------
# 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
}
}