Centrer la carte sur le GPS du téléphone (HTTPS terminé par le proxy)

Le bouton ⌖ recentre la carte sur la position GPS du téléphone. L'API
Geolocation exige un contexte sécurisé : la webapp sert désormais du HTTP
et le TLS est porté par le reverse proxy (Traefik, labels dans l'override
local) ; le webapp est transparent au proxy (URLs relatives, X-Forwarded-For
pour la restriction LIDAR_REGEN_CIDR). Ajoute le modèle d'override
docker-compose.webapp.override.yml.example, un rebuild d'index à la demande
et met à jour doc/déploiement ; les tuiles sont servies à la demande.
This commit is contained in:
Antoine Jacquin
2026-09-13 19:57:09 +02:00
parent dd1aca3cfe
commit e2533bac48
16 changed files with 407 additions and 279 deletions

53
make-tls-cert.sh Executable file
View File

@ -0,0 +1,53 @@
#!/usr/bin/env bash
# Génère un certificat auto-signé pour servir la webapp en HTTPS.
#
# Pourquoi : l'API Geolocation des navigateurs (bouton ⌖ « centrer sur la
# position GPS du téléphone ») n'est disponible qu'en contexte sécurisé
# (HTTPS). Servir la carte en https://<hôte>:PORT débloque le GPS sur
# téléphone ; le certificat auto-signé affiche un avertissement « non fiable »
# que l'on accepte une fois (l'usage est sur le LAN, pas exposé).
#
# Usage :
# ./make-tls-cert.sh # crée tls/webapp.crt + tls/webapp.key
# ./make-tls-cert.sh --force # régénère même si le certificat existe
#
# Le certificat est monté dans le conteneur (./tls → /app/tls) et activé par
# les variables LIDAR_SSL_CERTFILE / LIDAR_SSL_KEYFILE (cf. serve-webapp.sh
# et docs/DEPLOY_WEBAPP.md).
set -euo pipefail
cd "$(dirname "$0")"
FORCE=0
[ "${1:-}" = "--force" ] && FORCE=1
mkdir -p tls
# Garde-fou : si docker compose a déjà monté ./tls, Docker l'a créé root:root.
# En tant qu'utilisateur (non root), on ne peut pas écrire dedans.
if [ ! -w tls ]; then
echo "Erreur : tls/ n'est pas writable par $(id -un) (souvent créé root par Docker)." >&2
echo "Corriger : sudo chown \"$(id -un)\" tls puis relancer $0" >&2
exit 1
fi
if [ "$FORCE" -eq 0 ] && [ -f tls/webapp.crt ] && [ -f tls/webapp.key ]; then
echo "Certificat auto-signé déjà présent : tls/webapp.crt + tls/webapp.key"
echo "Régénérer : $0 --force"
else
CN="${LIDAR_CERT_CN:-lidar-webapp}"
# SAN : nom local du conteneur + IP générique. Le téléphone se connecte
# par l'IP du Pi ; le SAN IP ne couvre pas cette IP dynamique d'où
# l'avertissement de nom, mais le certificat reste valable (10 ans).
openssl req -x509 -newkey rsa:2048 -nodes -days 3650 \
-keyout tls/webapp.key -out tls/webapp.crt \
-subj "/CN=${CN}" \
-addext "subjectAltName=DNS:${CN},DNS:lidar-webapp,DNS:*.local,IP:0.0.0.0" \
> /dev/null
chmod 600 tls/webapp.key
echo "Certificat auto-signé créé : tls/webapp.crt + tls/webapp.key (valable 10 ans, CN=${CN})"
fi
echo
echo "Activation (webapp.env) :"
echo " LIDAR_SSL_CERTFILE=/app/tls/webapp.crt"
echo " LIDAR_SSL_KEYFILE=/app/tls/webapp.key"
echo "serve-webapp.sh monte ./tls → /app/tls et passe ces variables automatiquement."
echo "Puis : ./serve-webapp.sh restart — la carte répond sur https://<hôte>:PORT."