Surveillance locale ou cloud propriétaire : pourquoi héberger son NVR
Les solutions de surveillance vidéo en SaaS — Reolink Cloud, Synology Surveillance Station connectée à des relais propriétaires, Amazon Ring — enregistrent vos flux sur des serveurs tiers. En échange d'un abonnement mensuel, vous obtenez une application mobile, du stockage distant et de la détection d'événements. Ce que vous cédez, c'est la maîtrise de ce qui se passe devant vos caméras.
Héberger son propre NVR sur un VPS, c'est inverser la logique : vos flux ne quittent jamais votre infrastructure, la détection d'objets (personnes, véhicules, animaux) tourne localement sans envoyer d'image à un service tiers, et les enregistrements sont stockés sur des volumes que vous contrôlez. Aucun abonnement ne vient indexer cette fonctionnalité.
Frigate NVR est la référence open source dans cette catégorie. Il reçoit les flux RTSP ou RTMP de vos caméras IP, découpe des clips sur les événements détectés, conserve des instantanés et expose une API REST consommable par Home Assistant ou n'importe quelle automatisation. La version 0.18, publiée en septembre 2026, remplace le fichier config.yml obligatoire par une interface graphique complète : vous configurez caméras, zones de détection et seuils depuis un navigateur, sans jamais toucher au YAML si vous ne le souhaitez pas.
Les bénéfices concrets de Frigate self-hosted sur VPS
- Flux vidéo et enregistrements 100 % locaux : aucun tiers n'a accès à vos images.
- Détection d'objets par IA (personnes, véhicules, animaux) tournant sur votre propre CPU, sans quota ni limitation d'API.
- Zéro abonnement récurrent : vous payez votre VPS, pas une licence de détection.
- Intégration native avec Home Assistant via MQTT et l'API REST Frigate.
- Clips d'événements, instantanés et timeline consultables depuis l'interface web Frigate.
- Compatibilité avec la quasi-totalité des caméras IP du marché via le protocole RTSP standard.
- Zones de détection configurables par caméra pour filtrer les fausses alertes (rue, voisin, arbre).
- Configuration entièrement en GUI depuis la v0.18 — le YAML reste possible mais n'est plus obligatoire.
Prérequis chiffrés : dimensionner votre VPS pour Frigate
Frigate est une application CPU-intensive en mode sans accélérateur matériel. La détection d'objets repose sur un modèle TensorFlow Lite qui s'exécute sur chaque image analysée. Les chiffres ci-dessous correspondent au mode CPU-only, le seul disponible sur un VPS standard.
Pour 1 à 2 caméras en 1080p : 2 vCPU et 2 Go de RAM constituent le minimum fonctionnel. La détection tournera, mais avec un délai perceptible sur les événements. Fréquence d'analyse recommandée : 5 images par seconde maximum.
Pour 3 à 5 caméras en 1080p : 4 vCPU et 4 Go de RAM offrent une marge confortable. Frigate peut maintenir une analyse à 5 ips par caméra sans saturation. Le plan VPS Power (4 vCPU / 8 GB Go RAM) constitue un plancher réaliste pour ce cas d'usage.
Pour plus de 5 caméras ou une fréquence d'analyse élevée : 6 à 8 vCPU et 8 Go de RAM ou plus. L'accélération matérielle via un Coral TPU USB (si votre fournisseur autorise le passthrough USB) ou un GPU réduit drastiquement la charge CPU, mais n'est pas disponible sur un VPS hébergé classique.
Stockage : chaque caméra en 1080p génère en moyenne 1 à 3 Go par heure en mode enregistrement continu, selon la compression H.264 ou H.265. Pour 24 h par caméra en mode événementiel (Frigate ne conserve que les clips d'activité), comptez 5 à 15 Go par caméra et par jour selon la fréquence de mouvement. Prévoyez un volume extensible ou un stockage objet monté.
Réseau : chaque flux RTSP entrant consomme entre 1 et 4 Mbit/s selon la résolution et le codec. Une caméra 1080p H.264 tourne typiquement entre 1,5 et 2,5 Mbit/s. Vérifiez la bande passante incluse de votre plan.
Logiciels requis : Docker Engine 24+ et Docker Compose v2, un accès root au VPS, un sous-domaine DNS pointant vers l'IP du serveur pour l'accès HTTPS, et un reverse proxy (Nginx Proxy Manager, Caddy ou Traefik) pour la terminaison TLS.
Déployer Frigate NVR avec Docker Compose
Créer l'arborescence de configuration
Connectez-vous à votre VPS en SSH et créez la structure de répertoires que Frigate utilisera pour sa configuration, ses enregistrements et ses instantanés :
mkdir -p /opt/frigate/{config,storage/recordings,storage/clips,storage/exports} cd /opt/frigateFrigate attend son fichier de configuration dans
/opt/frigate/config/config.yml. Avec la v0.18, ce fichier peut rester minimal au démarrage — la GUI complète la configuration ensuite.Créer une configuration de démarrage minimale
Créez un fichier
/opt/frigate/config/config.ymlavec le contenu suivant. Ce fichier indique à Frigate où stocker les données ; les caméras et les paramètres de détection seront ajoutés via l'interface graphique :mqtt: enabled: false record: enabled: true retain: days: 7 mode: motion snapshots: enabled: true retain: default: 10 detectors: cpu1: type: cpu num_threads: 3La clé
detectorsdéclare un détecteur logiciel sur CPU.num_threadscontrôle la parallélisation : 3 threads est un bon équilibre pour 2 à 4 caméras. Augmentez-le si vous avez davantage de vCPU disponibles.Rédiger le fichier Docker Compose
Créez
/opt/frigate/docker-compose.ymlavec la configuration suivante :services: frigate: container_name: frigate image: ghcr.io/blakeblackshear/frigate:stable restart: unless-stopped shm_size: "256mb" volumes: - /opt/frigate/config:/config - /opt/frigate/storage:/media/frigate - /etc/localtime:/etc/localtime:ro ports: - "5000:5000" - "8554:8554" - "8555:8555/tcp" - "8555:8555/udp" environment: FRIGATE_RTSP_PASSWORD: "changeme" devices: - /dev/dri:/dev/driLes ports exposés : 5000 pour l'interface web et l'API REST, 8554 pour le serveur RTSP interne (repartage des flux traités), 8555 TCP et UDP pour le WebRTC (lecture vidéo en temps réel dans le navigateur). La variable
FRIGATE_RTSP_PASSWORDsera référenceable dans vos URLs de caméra comme{FRIGATE_RTSP_PASSWORD}. Le blocdevicespermet l'accélération GPU sur les VPS qui l'exposent — retirez-le si l'iGPU n'est pas disponible.Démarrer Frigate et vérifier les journaux
Depuis le répertoire
/opt/frigate, lancez le conteneur et surveillez les journaux de démarrage :docker compose up -d docker compose logs -f frigateAu premier démarrage, Frigate télécharge le modèle de détection TensorFlow Lite (~6 Mo) et initialise sa base SQLite. L'opération prend 30 à 90 secondes. Le log doit afficher
Frigate is runninget la résolution de chaque flux déclaré. Si une caméra ne s'ouvre pas, la ligneFailed to connect to cameraidentifiera le flux problématique.Accédez à l'interface à l'adresse
http://<ip-de-votre-vps>:5000pour la vérification initiale (le HTTPS sera configuré à l'étape suivante).Configurer un reverse proxy pour l'accès HTTPS
Frigate ne gère pas TLS nativement. Configurez Nginx comme reverse proxy. Si Nginx est déjà installé sur le VPS, créez
/etc/nginx/sites-available/frigate:server { listen 443 ssl; server_name frigate.yourdomain.com; ssl_certificate /etc/letsencrypt/live/frigate.yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/frigate.yourdomain.com/privkey.pem; location / { proxy_pass http://127.0.0.1:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_read_timeout 86400; } }Obtenez un certificat Let's Encrypt avec
certbot --nginx -d frigate.yourdomain.com. La directiveproxy_read_timeout 86400est nécessaire pour les flux WebRTC longue durée.Ajouter vos caméras via la GUI Frigate v0.18
Ouvrez l'interface Frigate dans votre navigateur. La v0.18 propose un assistant d'ajout de caméra accessible depuis Configuration → Cameras → Add Camera. Renseignez :
- Nom de la caméra (sans espace ni caractère spécial).
- URL RTSP du flux principal, par exemplertsp://admin:[email protected]:554/stream1.
- Résolution détectée automatiquement ou spécifiée manuellement.
- Profil de détection : *Standard* pour un équilibre entre précision et charge CPU, *Lightweight* pour les VPS légers.La GUI génère et valide le bloc YAML correspondant avant de l'appliquer à la configuration — vous pouvez toujours basculer en mode YAML brut via l'onglet Advanced si vous préférez éditer directement.
Vérifier que les enregistrements et la détection fonctionnent
Depuis le tableau de bord Frigate, naviguez vers Events pour confirmer que les événements de détection sont bien générés. Vérifiez l'onglet Recordings pour valider que les fichiers mp4 sont écrits dans
/opt/frigate/storage/recordings/.Sur le VPS, contrôlez la charge CPU en temps réel :
docker stats frigateFrigate affichera l'utilisation CPU du conteneur. En mode CPU-only avec 2 caméras 1080p et 5 ips d'analyse, attendez-vous à 60 à 90 % d'un vCPU. Ajustez le paramètre
fpsdans la configuration de chaque caméra si la charge est trop élevée :detect.fps: 2réduit la fréquence d'analyse sans désactiver la détection.
Configurer les caméras et les zones de détection via la GUI
La nouveauté centrale de Frigate v0.18 est son éditeur visuel de zones de détection. Jusqu'à la v0.14, définir une zone obligeait à calculer manuellement des coordonnées de polygone dans le fichier YAML — une tâche fastidieuse qui décourageait les déploiements.
Depuis la v0.18, l'onglet Zones de chaque caméra affiche l'image en direct et vous permet de tracer des polygones directement à la souris. Chaque zone reçoit un nom (ex : entree, jardin, rue) et des filtres d'objets — vous pouvez indiquer que la zone rue doit ignorer les personnes mais alerter sur les véhicules, ou que la zone entree doit déclencher une notification dès qu'une personne entre dans le périmètre.
Masques de mouvement : la même interface permet de dessiner des masques sur les zones générant trop de faux positifs — un arbre qui bouge dans le vent, un luminaire qui clignote. Le masque empêche Frigate d'analyser ces pixels pour la détection, sans affecter l'enregistrement.
Seuils de confiance : chaque objet détectable (person, car, dog, cat, bird…) dispose d'un seuil de confiance ajustable entre 0 et 1. La valeur par défaut de 0,5 est raisonnable ; descendre à 0,35 augmente la sensibilité au prix de davantage de fausses alertes.
Configuration des notifications : Frigate s'intègre à Home Assistant via MQTT ou son API REST. Sans Home Assistant, vous pouvez envoyer des alertes vers n'importe quel webhook via notify.webhook ou exploiter les clips d'événements directement depuis l'interface.
Durcir l'accès à l'interface web Frigate
L'interface Frigate n'embarque pas de système d'authentification dans sa version stable. Exposée directement sur Internet, elle est accessible sans mot de passe. Trois mesures complémentaires à appliquer avant de rendre le sous-domaine public :
Authentification HTTP Basic via Nginx : ajoutez auth_basic et auth_basic_user_file dans le bloc location du virtual host Nginx. Générez le fichier de mots de passe avec htpasswd -c /etc/nginx/.htpasswd votre_utilisateur.
Restriction IP : si vous accédez à Frigate depuis une IP fixe (bureau, VPN), ajoutez allow 203.0.113.x; deny all; dans le bloc location de Nginx pour bloquer tout accès extérieur.
Accès VPN uniquement : la solution la plus robuste. Déployez WireGuard sur le même VPS (ou un VPS dédié) et ne laissez le port 5000 accessible qu'en local ou via le tunnel VPN. L'interface n'est alors jamais exposée directement sur Internet, et aucun reverse proxy n'est nécessaire pour la protéger.
Dépannage : les erreurs fréquentes
Failed to connect to camera: Connection refused ou timeout au démarrage
Frigate ne peut pas atteindre le flux RTSP. Vérifiez d'abord que l'URL RTSP est correcte en la testant avec ffprobe depuis le VPS : ffprobe -v quiet -print_format json -show_streams rtsp://.... Si la caméra est sur un réseau privé distinct du VPS, elle n'est pas joignable directement — vous avez besoin d'un tunnel ou d'un relais RTSP.
ffmpeg process crashed en boucle dans les logs
Le plus souvent : codec non supporté (H.265 / HEVC sur une installation Docker sans libaries facultatives) ou résolution trop élevée pour la bande passante disponible. Solution : forcer le transcodage en entrée en ajoutant input_args: preset-rtsp-restream dans la configuration de la caméra, ou réduire la résolution côté caméra à 1280×720.
Insufficient shared memory au démarrage du conteneur
Frigate utilise la mémoire partagée Linux pour partager les frames entre ses processus. L'erreur signifie que shm_size est trop faible. Règle générale : 256 Mo pour 2 caméras, 512 Mo pour 4, 1 Go pour 8+. Ajustez la directive shm_size dans docker-compose.yml en conséquence.
Database is locked ou crashs aléatoires
Frigate utilise SQLite, qui supporte mal les volumes réseau (NFS, CIFS). Si vous montez /opt/frigate/storage depuis un stockage réseau, déplacez uniquement la base SQLite sur un volume local : db_path: /tmp/frigate.db dans la configuration. Les enregistrements, eux, peuvent rester sur le volume distant.
La détection ne se déclenche pas malgré des mouvements visibles
Vérifiez d'abord que la zone de détection couvre bien la région d'intérêt dans l'éditeur visuel. Ensuite, consultez l'onglet Debug de la caméra dans la GUI : il superpose les rectangles de détection en temps réel sur le flux. Si aucun rectangle n'apparaît, le modèle tourne mais ne trouve rien — le seuil de confiance est peut-être trop élevé ou les objets trop petits dans le champ de la caméra.
Pour aller plus loin
Frigate NVR transforme un VPS standard en station de surveillance souveraine. La détection d'objets tourne localement, vos enregistrements restent sur vos volumes, et la v0.18 rend cette installation accessible sans expertise YAML.
Si vous étendez votre stack self-hosted, les articles ci-dessous couvrent des services complémentaires que Frigate s'intègre bien à piloter depuis un tableau de bord centralisé : Jellyfin pour votre médiathèque, Pi-hole pour le filtrage DNS et Homepage comme tableau de bord de tous vos services. un VPS Power couvre la majorité des configurations à 3 à 5 caméras en mode CPU-only, avec de la marge pour les autres conteneurs de la stack.