Tutoriel

Frigate NVR v0.18 : surveillance IP self-hosted sur VPS

Self-hosting11 min de lecture7 étapes

Frigate NVR est un enregistreur vidéo réseau open source qui associe la gestion des flux de caméras IP à une détection d'objets par intelligence artificielle tournant entièrement sur votre propre infrastructure. La version 0.18 abandonne la configuration YAML obligatoire au profit d'une interface graphique complète, ce qui ouvre le déploiement sur VPS à un public bien plus large que les seuls administrateurs système. Vos enregistrements et vos alertes restent sur votre machine, sans aucun abonnement récurrent.

Sommaire· Surveillance locale ou cloud propriétaire : pourquoi héberger son NVR1/8
  1. 01Surveillance locale ou cloud propriétaire : pourquoi héberger son NVR
  2. 02Les bénéfices concrets de Frigate self-hosted sur VPS
  3. 03Prérequis chiffrés : dimensionner votre VPS pour Frigate
  4. 04Déployer Frigate NVR avec Docker Compose
  5. 05Configurer les caméras et les zones de détection via la GUI
  6. 06Durcir l'accès à l'interface web Frigate
  7. 07Dépannage : les erreurs fréquentes
  8. 08Pour aller plus loin

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

  1. 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/frigate

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

  2. Créer une configuration de démarrage minimale

    Créez un fichier /opt/frigate/config/config.yml avec 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: 3

    La clé detectors déclare un détecteur logiciel sur CPU. num_threads contrôle la parallélisation : 3 threads est un bon équilibre pour 2 à 4 caméras. Augmentez-le si vous avez davantage de vCPU disponibles.

  3. Rédiger le fichier Docker Compose

    Créez /opt/frigate/docker-compose.yml avec 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/dri

    Les 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_PASSWORD sera référenceable dans vos URLs de caméra comme {FRIGATE_RTSP_PASSWORD}. Le bloc devices permet l'accélération GPU sur les VPS qui l'exposent — retirez-le si l'iGPU n'est pas disponible.

  4. 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 frigate

    Au 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 running et la résolution de chaque flux déclaré. Si une caméra ne s'ouvre pas, la ligne Failed to connect to camera identifiera le flux problématique.

    Accédez à l'interface à l'adresse http://<ip-de-votre-vps>:5000 pour la vérification initiale (le HTTPS sera configuré à l'étape suivante).

  5. 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 directive proxy_read_timeout 86400 est nécessaire pour les flux WebRTC longue durée.

  6. 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 exemple rtsp://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.

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

    Frigate 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 fps dans la configuration de chaque caméra si la charge est trop élevée : detect.fps: 2 ré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.

Un VPS pour votre NVR Frigate

Accès root, IPv4 dédiée, choix d'OS — vos flux de caméras traités localement, sans abonnement cloud ni accès fabricant. Plans à partir de 99 DH/mois.

Besoin d'aide ?

Parcourez notre centre d'aide et notre FAQ, ou contactez notre équipe — rappel, WhatsApp ou e-mail. Support en français, anglais et arabe.

Écrire sur WhatsApps'ouvre dans un nouvel onglet