Frigate NVR na Proxmox — instalacja, konfiguracja i integracja z Home Assistant

Share

Frigate NVR na Proxmox — instalacja i konfiguracja

Architektura Frigate NVR na Proxmox

Cel i kontekst

Frigate to otwartoźródłowy system NVR (Network Video Recorder) z wbudowaną detekcją obiektów opartą na AI. W przeciwieństwie do klasycznych systemów monitoringu, Frigate nie tylko nagrywa obraz, ale aktywnie analizuje go w czasie rzeczywistym — wykrywając osoby, samochody i inne obiekty.

W moim przypadku Frigate zastąpił brak jakiegokolwiek centralnego systemu zarządzania kamerami. Kamery działały samodzielnie, bez możliwości automatycznego nagrywania przy detekcji, powiadomień czy integracji z resztą homelabiu.

Kamery w instalacji:
- Reolink RLC-502A — kamera zewnętrzna przy drzwiach wejściowych
- Akuvox R20A — wideodomofon (planowana integracja)


Wymagania sprzętowe i systemowe

Serwer (host Proxmox)

  • CPU: 2x Intel Xeon E5-2660 v2 (20 rdzeni / 40 wątków łącznie)
  • RAM: 120 GB
  • System: Proxmox VE

Maszyna wirtualna (Frigate)

Parametr Wartość
System Debian 12 (Bookworm)
CPU 6 cores
RAM 6 GB
Dysk 1 (system) 32 GB
Dysk 2 (nagrania) 100 GB, zamontowany jako /media/frigate
Typ CPU host
Sieć VirtIO

Oprogramowanie

  • Docker + Docker Compose
  • Frigate 0.17
  • qemu-guest-agent

Akcelerator detekcji

Brak dedykowanego akceleratora (Coral USB, iGPU). Detekcja obiektów działa na CPU — wystarczające dla 2 kamer z niskim FPS detekcji.

Uwaga: Xeon E5-2660 v2 to architektura Ivy Bridge EP z obsługą AVX ale bez AVX2. Frigate oznacza detektor jako "wolny" powyżej 100ms — przy tym CPU detekcja zajmuje ok. 120ms, co jest ostrzeżeniem ale nie błędem krytycznym. Przy większej liczbie kamer warto rozważyć akcelerator Coral USB (~150 zł używany).

Instalacja

1. Przygotowanie VM w Proxmox

Tworzenie VM przez interfejs webowy Proxmox:
- Template ISO: Debian 12 netinstall
- CPU type: host (ważne dla wydajności)
- Drugi dysk dodany po instalacji systemu

2. Przygotowanie systemu Debian 12

# Aktualizacja systemu
apt update && apt upgrade -y

# Instalacja qemu-guest-agent
apt install -y qemu-guest-agent
systemctl enable --now qemu-guest-agent

# Weryfikacja
systemctl status qemu-guest-agent

3. Przygotowanie dysku na nagrania

# Sprawdzenie dysków
lsblk

# Formatowanie drugiego dysku (100 GB)
mkfs.ext4 /dev/vdb

# Montowanie
mkdir -p /media/frigate
mount /dev/vdb /media/frigate

# Dodanie do fstab (automount po restarcie)
echo '/dev/vdb /media/frigate ext4 defaults 0 2' >> /etc/fstab

# Weryfikacja
df -h | grep frigate

4. Instalacja Dockera

# Instalacja przez oficjalny skrypt
curl -fsSL https://get.docker.com | sh

# Dodanie użytkownika do grupy docker
usermod -aG docker $USER

# Weryfikacja
docker --version
docker compose version

5. Konfiguracja Frigate

Tworzenie katalogu projektu:

mkdir -p /opt/frigate
cd /opt/frigate

docker-compose.yml

services:
  frigate:
    container_name: frigate
    privileged: true
    restart: unless-stopped
    image: ghcr.io/blakeblackshear/frigate:stable
    shm_size: "128mb"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /opt/frigate/config.yml:/config/config.yml
      - /media/frigate:/media/frigate
      - type: tmpfs
        target: /tmp/cache
        tmpfs:
          size: 1000000000
    ports:
      - "5000:5000"
      - "8554:8554"
      - "8555:8555/tcp"
      - "8555:8555/udp"

config.yml

mqtt:
  enabled: false

detectors:
  cpu1:
    type: cpu
    num_threads: 6

record:
  enabled: true
  alerts:
    retain:
      days: 14
  detections:
    retain:
      days: 14
  continuous:
    days: 0
  motion:
    days: 0

objects:
  track:
    - person
    - car

cameras:
  drzwi_wejsciowe:
    enabled: true
    friendly_name: Drzwi wejsciowe
    ffmpeg:
      inputs:
        - path: rtsp://admin:<TWOJE_HASLO>@<IP_KAMERY>:554/Preview_01_main
          roles:
            - record
            - audio
        - path: rtsp://admin:<TWOJE_HASLO>@<IP_KAMERY>:554/Preview_01_sub
          roles:
            - detect
    detect:
      enabled: true
      width: 640
      height: 480
      fps: 2
    live:
      streams:
        Stream 1: drzwi_wejsciowe

version: 0.17-0

go2rtc:
  streams:
    drzwi_wejsciowe:
      - rtsp://admin:<TWOJE_HASLO>@<IP_KAMERY>:554/Preview_01_main

6. Uruchomienie

cd /opt/frigate
docker compose up -d

# Sprawdzenie statusu
docker ps
docker logs frigate --tail 50

Panel webowy dostępny pod: http://IP_VM:5000


Napotkane problemy i rozwiązania

Problem 1: 401 Unauthorized — kamera odrzuca połączenie

Objaw: FFmpeg crashuje w pętli, logi pokazują method DESCRIBE failed: 401 Unauthorized

Przyczyna: Błędne hasło w config.yml po zmianie hasła na kamerze.

Rozwiązanie: Weryfikacja hasła w panelu webowym kamery Reolink i aktualizacja config.yml. Restart kontenera po zmianie.

docker restart frigate

Problem 2: Brak detekcji obiektów

Objaw: Kamera działa, obraz widoczny, ale żadne eventy nie pojawiają się w panelu.

Przyczyna: Brak sekcji detect w konfiguracji kamery w config.yml.

Rozwiązanie: Dodanie sekcji detect z enabled: true do konfiguracji kamery.

Problem 3: Ciągłe nagrywanie mimo wyłączonego continuous

Objaw: Dysk zapełnia się mimo ustawienia continuous: days: 0.

Przyczyna: Parametr motion: days: 7 powoduje nagrywanie przy każdym wykryciu ruchu (nie tylko detekcji obiektów).

Rozwiązanie: Ustawienie motion: days: 0 — nagrywanie tylko przy detekcji person/car.

Schemat rozdzielenia strumieni RTSP

Problem 4: Wysokie użycie CPU przez FFmpeg (~58%)

Przyczyna: Jeden strumień RTSP używany do wszystkich ról (detect + record + audio) — FFmpeg dekoduje go wielokrotnie.

Rozwiązanie: Rozdzielenie na dwa strumienie:
- główny (Preview_01_main) → record + audio
- substream (Preview_01_sub) → detect

Problem 5: Wolny detektor (120ms)

Przyczyna: Xeon E5-2660 v2 bez AVX2 — ograniczona wydajność przy inferencji modelu AI.

Rozwiązanie: Zmniejszenie FPS detekcji z 5 do 2 i zwiększenie num_threads do 6. Detekcja działa poprawnie mimo ostrzeżenia o wolnym detektorze.


Co działa

  • ✅ Podgląd live kamery w panelu webowym
  • ✅ Detekcja obiektów: person, car
  • ✅ Nagrywanie klipów przy detekcji
  • ✅ Przechowywanie nagrań 14 dni
  • ✅ Substream do detekcji (niższe obciążenie CPU)
  • ✅ Panel webowy z podglądem eventów i pobieraniem klipów

Do zrobienia

  • [ ] Dodanie drugiej kamery — Akuvox R20A (wideodomofon)
  • [ ] Wystawienie przez Nginx Proxy Manager → nvr.pckey.pl
  • [ ] Włączenie MQTT i integracja z Home Assistant
  • [ ] Automatyzacje w HA: wykrycie osoby → zapalenie światła
  • [ ] Powiadomienia Telegram ze snapshotem przez n8n
  • [ ] Rozpoznawanie twarzy przez Double-Take + CompreFace
  • [ ] Dodanie streamu RTSP Akuvox do Frigate
  • [ ] Zakup Coral USB gdy liczba kamer wzrośnie

Wnioski

Frigate to solidne rozwiązanie dla homelabowców którzy chcą inteligentny monitoring bez chmury. Instalacja przez Docker jest prosta, konfiguracja YAML czytelna, a integracja z Home Assistant otwiera drzwi do pełnej automatyzacji smart home.

Największą wartością jest detekcja obiektów zamiast detekcji ruchu — kamera przy ruchliwej ulicy nie będzie generować setek fałszywych alertów przy każdym przejeżdżającym samochodzie, lecz precyzyjnie wykryje osobę wchodzącą na posesję.

Przy 2 kamerach i detekcji na CPU E5-2660 v2 system działa stabilnie. Przy rozbudowie do 5+ kamer warto zainwestować w akcelerator Coral USB.