Installer Veille
Mettre en place le serveur, fabriquer l’appli caméra et donner aux utilisateurs ce dont ils ont besoin.
Installation rapide
Il te faut une machine avec Docker et Docker Compose : un mini-PC, un NAS, un Raspberry Pi 4 ou un serveur loué.
-
Récupère le projet
Décompresse l’archive sur la machine et place-toi dans le dossier.
-
Configure
Copie le fichier d’exemple et renseigne
DOMAINavec ton nom de domaine ou l’adresse IP locale de la machine.cp .env.example .env -
Démarre
docker compose up -d --buildOuvre
https://suivi de ton domaine ou de ton IP : la page de connexion de Veille s’affiche. -
Fabrique l’appli caméra
cd android ./build.shLe fichier à distribuer est
app/build/outputs/apk/debug/app-debug.apk. -
Transmets les accès
Donne aux utilisateurs l’adresse de Veille, l’adresse pour les caméras, le fichier APK et le manuel utilisateur.
Architecture
Le docker-compose lance deux conteneurs. Caddy reçoit les connexions HTTPS et obtient les certificats. Le conteneur server, en Python avec FastAPI, sert l’appli web, reçoit les extraits et relaie la signalisation du direct. Les données vivent dans un volume Docker.
Les extraits arrivent déjà chiffrés en AES-256-GCM par les caméras. Le serveur ne détient aucune clé : il stocke des fichiers opaques et les supprime après la durée de conservation.
Nom de domaine ou réseau local
Avec un nom de domaine (recommandé)
Fais pointer le domaine vers la machine, ouvre les ports 80 et 443 sur ta box, puis mets ce domaine dans DOMAIN. Caddy obtient et renouvelle le certificat Let’s Encrypt tout seul. Navigateurs et caméras utilisent la même adresse https://, ce qui permet aussi de regarder ses vidéos hors de chez soi. Un domaine gratuit comme ceux de DuckDNS suffit.
Dans ce cas, retire la ligne "8000:8000" du docker-compose.yml : tout passe par Caddy.
Sur le réseau local uniquement
Mets l’adresse IP de la machine dans DOMAIN. Caddy crée alors sa propre autorité de certification, et les navigateurs affichent un avertissement. Récupère le certificat racine et installe-le sur chaque appareil qui regarde les vidéos :
docker compose cp caddy:/data/caddy/pki/authorities/local/root.crt .
L’appli Android ne fait pas confiance à ce certificat. Les caméras passent donc par http://IP:8000, sans HTTPS. Les vidéos restent protégées par leur chiffrement, mais le token circule en clair sur le réseau local.
Le HTTPS n’est pas optionnel pour les navigateurs : sans lui, ils refusent d’exécuter le déchiffrement, et les vidéos ne peuvent pas être lues.
Fabriquer l’appli caméra
Avec Docker
Le script android/build.sh construit une image contenant Java 17, le SDK Android 34 et Gradle, puis compile l’appli. Le cache Gradle est gardé dans un volume, donc les compilations suivantes sont plus rapides.
Avec Android Studio
Ouvre le dossier android, laisse Gradle synchroniser, puis utilise Build, Build APK. Accepte si Android Studio propose de créer le Gradle wrapper.
Distribuer l’APK
Le fichier peut être envoyé par e-mail, déposé sur la page de ton choix ou installé par câble avec adb install app-debug.apk. Il fonctionne à partir d’Android 7.
Ce qu’il faut donner aux utilisateurs
- L’adresse de Veille
https://suivi du domaine ou de l’IP, à ouvrir dans un navigateur.- L’adresse pour les caméras
- La même avec un nom de domaine. En réseau local,
http://IP:8000. L’appli web affiche toujours l’adressehttps://: préviens les utilisateurs qu’ils doivent la remplacer. - Le fichier APK
- À installer sur chaque vieux téléphone.
- Le certificat racine de Caddy
- Uniquement en réseau local, pour les appareils qui regardent les vidéos.
- Le manuel utilisateur
- Disponible à l’adresse
/manuel.htmlde Veille.
Réglages, sauvegarde et mise à jour
Réglages
La durée de conservation se règle caméra par caméra, dans l’appli web : 2 heures, 7, 30 ou 90 jours. Le serveur fait le ménage toutes les 10 minutes, et tout de suite quand une durée est réduite.
Dans .env, DEFAULT_RETENTION_HOURS fixe la durée donnée aux nouvelles caméras, en heures : 2 par défaut, ce qui correspond à l’offre gratuite. Une valeur hors des durées proposées est remplacée par l’offre gratuite. Après toute modification, relance docker compose up -d.
La liste des offres se trouve dans server/main.py, dans RETENTION_PLANS. Les durées sont en heures. Les caméras créées avant le passage aux heures gardent leur durée (24 h pour l’ancienne offre gratuite).
Le paiement n’est pas encore branché : pour l’instant, chaque utilisateur peut choisir librement n’importe quelle durée, y compris 90 jours. Prévois l’espace disque en conséquence.
Sauvegarde
Tout est dans le volume surveillance-data, préfixé du nom du dossier du projet. Trouve son nom exact avec docker volume ls, puis archive-le :
docker run --rm -v NOM_DU_VOLUME:/data -v "$PWD":/backup \
alpine tar czf /backup/veille.tgz -C /data .
Une sauvegarde ne contient que des extraits chiffrés et les comptes. Sans les clés des utilisateurs, elle ne permet de lire aucune vidéo.
Mise à jour
Remplace les fichiers du projet par la nouvelle version, puis :
docker compose up -d --build
Les données sont conservées. Pour l’appli caméra, recompile l’APK et réinstalle-le par-dessus l’ancien : la configuration est gardée.
Sécurité
- Le serveur ne voit jamais de vidéo en clair, mais il voit les métadonnées : quelle caméra, à quelle heure, combien de temps.
- Quiconque détient un token peut lister, envoyer et supprimer les extraits du compte, sans pouvoir les regarder.
- La création de compte est ouverte à toute personne qui accède à l’adresse. Sur un serveur exposé à Internet, garde-le en tête tant qu’il n’y a pas de limite d’inscription.
- Avec un nom de domaine, ferme le port 8000 pour que tout passe en HTTPS.
- Tant que le paiement n’est pas en place, rien n’empêche un utilisateur de choisir 90 jours pour toutes ses caméras. Surveille l’espace disque avec
df -h.
Dépannage
- Voir ce qui se passe
docker compose logs -f serverpour l’appli,docker compose logs -f caddypour le HTTPS et les certificats.- Caddy n’obtient pas de certificat
- Vérifie que le domaine pointe bien vers ton IP publique et que les ports 80 et 443 sont redirigés vers la machine. Let’s Encrypt doit pouvoir la joindre depuis Internet.
- La page refuse de déchiffrer
- L’utilisateur l’a ouverte en
http://, souvent sur le port 8000. Elle doit être ouverte enhttps://, via Caddy. - Les caméras n’envoient rien
- En réseau local, vérifie qu’elles utilisent
http://IP:8000et que ce port est ouvert sur la machine. Teste depuis un autre appareil du réseau aveccurl http://IP:8000/manuel.html. - L’APK ne compile pas
- Relance
./build.shpour voir l’erreur complète. Sur la première compilation, Gradle télécharge beaucoup de dépendances : une coupure réseau suffit à la faire échouer.
Pour l’utilisation au quotidien, voir le manuel utilisateur.