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 GPU | OpenVINO sur CPU | |
|---|---|---|
| Temps d’inférence | 7-13 ms | 5-13 ms |
| CPU utilisé par le détecteur | 3-5 % | 84-95 % d’un cœur |
| Usage total de l’iGPU | 10-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
| Usage | Offre conseillée |
|---|---|
| Immich pour une famille, ou Frigate avec 1-2 caméras | Start (2 vCPU, 8 Go, 60 Go) |
| Immich + Frigate ensemble, ou 3-5 caméras | Power (4 vCPU, 16 Go, 120 Go) |
| Grosse photothèque, longue durée d’enregistrement | Pro (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).