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é.

  1. Récupère le projet

    Décompresse l’archive sur la machine et place-toi dans le dossier.

  2. Configure

    Copie le fichier d’exemple et renseigne DOMAIN avec ton nom de domaine ou l’adresse IP locale de la machine.

    cp .env.example .env
  3. Démarre

    docker compose up -d --build

    Ouvre https:// suivi de ton domaine ou de ton IP : la page de connexion de Veille s’affiche.

  4. Fabrique l’appli caméra

    cd android
    ./build.sh

    Le fichier à distribuer est app/build/outputs/apk/debug/app-debug.apk.

  5. 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 navigateurs passent par Caddy en HTTPS, les caméras par Caddy avec un domaine ou directement par le port 8000 en local, et le serveur range les extraits dans un volume Docker. Navigateurs Caméras Machine avec Docker Caddy ports 80 et 443 server port 8000, appli web et API volume surveillance-data base SQLite et extraits chiffrés HTTPS http, port 8000, réseau local
Avec un nom de domaine, les caméras passent aussi par Caddy et le port 8000 peut être fermé.

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’adresse https:// : 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.html de 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é

Dépannage

Voir ce qui se passe
docker compose logs -f server pour l’appli, docker compose logs -f caddy pour 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 en https://, via Caddy.
Les caméras n’envoient rien
En réseau local, vérifie qu’elles utilisent http://IP:8000 et que ce port est ouvert sur la machine. Teste depuis un autre appareil du réseau avec curl http://IP:8000/manuel.html.
L’APK ne compile pas
Relance ./build.sh pour 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.