Blog

Auto-héberger Immich et Frigate avec OpenVINO sur un VPS GPU

Faire tourner Immich (recherche photo, reconnaissance faciale) et Frigate NVR (détection d'objets) sur un VPS Linux avec GPU Intel : OpenVINO pour l'IA, VAAPI pour la vidéo, fichiers Docker Compose, accès aux caméras de la maison.

Auto-héberger Immich et Frigate sur un VPS GPU

Immich (un Google Photos auto-hébergé) et Frigate (un enregistreur vidéo pour caméras IP) font tourner des modèles d’IA en permanence : reconnaissance faciale et recherche intelligente pour Immich, détection d’objets pour Frigate. Sur le CPU seul, ça occupe un petit serveur. Les deux projets savent utiliser les GPU Intel via OpenVINO, et VAAPI / Quick Sync pour la vidéo.

Un VPS Linux GPU vous donne exactement ça : un GPU Intel UHD 770 dans votre VM (/dev/dri/renderD128), SSH root et Docker déjà installé. Vous installez et gérez tout vous-même.

Vérifier que le GPU est là

ls -l /dev/dri/            # renderD128 doit exister
vainfo | head -20          # profils VAAPI (H.264, HEVC, décodage AV1…)
clinfo -l                  # périphérique OpenCL, utilisé par OpenVINO

Si renderD128 apparaît, vos conteneurs Docker peuvent utiliser le GPU avec --device /dev/dri/renderD128.

Immich avec OpenVINO

Immich se compose d’un serveur et d’un conteneur de machine learning. Ce dernier existe en image -openvino, qui fait tourner CLIP (recherche intelligente) et la reconnaissance faciale sur le GPU Intel.

Raccourci : notre immich/setup.sh télécharge les fichiers officiels de la dernière version et active les lignes ci-dessous pour vous. À la main : partez des fichiers officiels docker-compose.yml et .env de la version d’Immich que vous installez, puis téléchargez à côté les deux fichiers d’accélération matérielle :

mkdir -p /srv/immich && cd /srv/immich
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
wget https://github.com/immich-app/immich/releases/latest/download/hwaccel.ml.yml
wget https://github.com/immich-app/immich/releases/latest/download/hwaccel.transcoding.yml

Modifiez ensuite deux services dans docker-compose.yml (dans le fichier officiel, ces blocs extends existent déjà, commentés avec service: cpu) :

services:
  immich-server:
    # … gardez les réglages officiels …
    extends:
      file: hwaccel.transcoding.yml
      service: quicksync        # ou : vaapi

  immich-machine-learning:
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}-openvino
    extends:
      file: hwaccel.ml.yml
      service: openvino
    # … gardez les volumes / env_file officiels …
docker compose up -d

Dernière étape, dans l’interface web : Administration → Paramètres → Transcodage vidéo → Accélération matérielle → API d’accélération : Quick Sync, avec le décodage matériel activé. Détection des visages, recherche intelligente et OCR passent alors sur le GPU, et les vidéos sont transcodées avec Quick Sync.

Pour vérifier : docker logs immich_machine_learning doit afficher Setting execution providers to ['OpenVINOExecutionProvider', …] pour chaque modèle, et le journal du serveur Transcoding video … with QSV-accelerated encoding and decoding.

Testé le 04/11/2026 (Immich v3.3.5, VPS Linux GPU, 4 vCPU, 8 Go) : les modèles visages (buffalo_l), CLIP (ViT-B-32__openai) et OCR (PP-OCRv5_mobile) se chargent tous sur OpenVINO sans erreur, le processus ML utilise le moteur de rendu du GPU, les visages sont détectés, la recherche intelligente trouve les bonnes photos (« a monkey » → la photo du babouin), et une vidéo de 80 secondes est transcodée avec Quick Sync en 7 secondes environ.

Pour Immich, la vraie limite est le stockage. Les offres ont 60 Go (Start), 120 Go (Power) ou 240 Go SSD (Pro). Pour une grosse photothèque, gardez les originaux ailleurs (bibliothèque externe, stockage objet) et laissez Immich les indexer.

Frigate avec OpenVINO et VAAPI

Frigate décode le flux de chaque caméra et lance la détection d’objets sur chaque image où quelque chose bouge. Sur un GPU Intel, VAAPI décode la vidéo et OpenVINO fait tourner le détecteur : le CPU reste presque libre.

docker-compose.yml :

services:
  frigate:
    image: ghcr.io/blakeblackshear/frigate:stable
    container_name: frigate
    restart: unless-stopped
    shm_size: "256mb"
    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128
    volumes:
      - ./config:/config
      - ./media:/media/frigate
      - type: tmpfs
        target: /tmp/cache
        tmpfs:
          size: 1000000000
    ports:
      - "8971:8971"   # interface web (HTTPS, avec connexion)
      - "8554:8554"   # restream RTSP

config/config.yml, avec le modèle OpenVINO fourni dans l’image Frigate :

mqtt:
  enabled: false

ffmpeg:
  hwaccel_args: preset-vaapi

detectors:
  ov:
    type: openvino
    device: GPU

model:
  width: 300
  height: 300
  input_tensor: nhwc
  input_pixel_format: bgr
  path: /openvino-model/ssdlite_mobilenet_v2.xml
  labelmap_path: /openvino-model/coco_91cl_bkgr.txt

cameras:
  entree:
    ffmpeg:
      inputs:
        - path: rtsp://user:motdepasse@10.8.0.10:554/stream2   # sous-flux
          roles: [detect]
        - path: rtsp://user:motdepasse@10.8.0.10:554/stream1   # flux principal
          roles: [record]
    detect:
      enabled: true     # obligatoire : la détection est désactivée par défaut dans Frigate 0.18
      width: 640
      height: 360
      fps: 5

Les fichiers sont aussi dans LinuxGPU-VPS/examples/frigate, avec un montage de test qui diffuse une vidéo comme fausse caméra RTSP.

docker compose up -d, récupérez le premier mot de passe admin avec docker logs frigate 2>&1 | grep -i password et ouvrez https://<serveur>:8971. System metrics affiche le temps d’inférence OpenVINO et l’usage du GPU.

Testé le 04/11/2026 (Frigate 0.18.2, VPS Linux GPU, 4 vCPU, 8 Go), une caméra 768×576 à 5 images/s avec des piétons, 15 à 25 détections par seconde :

OpenVINO sur GPUOpenVINO sur CPU
Temps d’inférence7-13 ms5-13 ms
CPU utilisé par le détecteur3-5 %84-95 % d’un cœur
Usage total de l’iGPU10-14 %—

Le décodage vidéo sur le GPU laisse ffmpeg à environ 1 % de CPU, et les piétons sont détectés avec 78 à 96 % de confiance. Sur une caméra, le CPU suit, mais il occupe un cœur entier ; le GPU laisse le CPU libre pour d’autres caméras et l’enregistrement.

Accéder aux caméras de la maison

Vos caméras sont sur le réseau de la maison, le VPS dans un datacenter. Frigate doit lire leurs flux RTSP : il faut un tunnel privé.

  • Tailscale (le plus simple) : installez-le sur le VPS et sur un petit appareil à la maison (routeur, Raspberry Pi), activez le subnet routing pour le réseau des caméras. Ça marche même sans IPv4 publique chez vous.
  • WireGuard : le serveur tourne sur le VPS. Chaque VPS Linux GPU a une IPv6 publique dédiée, votre box peut donc s’y connecter en IPv6 ; si vous n’avez pas d’IPv6 à la maison, prenez l’option IPv4 dédiée ou utilisez Tailscale.

Prévoyez votre débit montant : chaque caméra enregistrée envoie son flux principal en continu (souvent 2 à 4 Mbit/s en 1080p). Utilisez le sous-flux basse résolution pour la détection, comme dans la configuration ci-dessus, et n’enregistrez le flux principal que pour les caméras qui en ont besoin.

N’exposez jamais les ports RTSP sur Internet : seul le tunnel doit y accéder.

Home Assistant

Gardez Home Assistant à la maison (il parle aux appareils Zigbee, Z-Wave et locaux) et reliez-le à Frigate sur le VPS par le même tunnel, avec l’intégration Frigate. Événements, captures et clips apparaissent dans Home Assistant, pendant que la vidéo et l’IA tournent sur le GPU du VPS.

Quelle offre

UsageOffre conseillée
Immich pour une famille, ou Frigate avec 1-2 camérasStart (2 vCPU, 8 Go, 60 Go)
Immich + Frigate ensemble, ou 3-5 camérasPower (4 vCPU, 16 Go, 120 Go)
Grosse photothèque, longue durée d’enregistrementPro (6 vCPU, 24 Go, 240 Go SSD)

Le GPU est le même Intel UHD 770 que dans notre test de charge du GPU partagé et notre benchmark de transcodage Jellyfin. Fichiers Compose, configurations et scripts de vérification : github.com/LinuxGPU-VPS/examples (immich, frigate).