Frigate NVR

From ScottWiki
Revision as of 20:28, 9 May 2023 by Wikiadmin (talk | contribs)
Jump to navigation Jump to search

Frigate NVR

Docker

Download and save the Docker repository signing key:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Add the Docker repository in /etc/apt/sources.list.d/docker.list:

deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu jammy stable

Allow unattended updates from this repository by add to /etc/apt/apt.conf.d/50unattended-upgrades:

Unattended-Upgrade::Allowed-Origins { 
        // Append to end of existing entries
        "Docker:${distro_codename}";
};

Update the repositories and install the package:

apt update
apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Check all is working with:

docker version

Stop the services:

systemctl stop docker.service
systemctl stop docker.socket
systemctl stop containerd.service

Move the Docker root directory:

mv /var/lib/docker /srv/data

Edit the systemd service for Docker:

systemctl edit docker.service

Add the following to the top of the override file:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -–data-root=/srv/data/docker -H fd:// --containerd=/run/containerd/containerd.sock

Restart Docker:

systemctl daemon-reload
systemctl start docker.service

Check it still works with:

docker run hello-world


GPU Hardware Acceleration

Download and save the NVIDIA repository signing key:

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | gpg --dearmor -o /etc/apt/keyrings/nvidia-container.gpg

Add the Docker repository in /etc/apt/sources.list.d/nvidia-container.list:

deb [signed-by=/etc/apt/keyrings/nvidia-container.gpg] https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/$(ARCH) /

Allow unattended updates from this repository by add to /etc/apt/apt.conf.d/50unattended-upgrades:

Unattended-Upgrade::Origins-Pattern {
        "site=nvidia.github.io";
};

Update the repositories and install the package:

apt update
apt install nvidia-docker2

Restart Docker:

systemctl start docker.service


Frigate

If using ZFS, create a filesystem to store the video recordings (not used currently)

zfs create -o recordsize=1M -o compression=off -o quota=256G data/cctv


Create a configuration directory for Frigate:

mkdir /etc/frigate


If using NVidia TensorRT object detection, download and train the models:


Get the training image

 cd /etc/frigate
 wget https://github.com/blakeblackshear/frigate/raw/master/docker/tensorrt_models.sh
 chmod +x tensorrt_models.sh

Run the script to train.

 docker run --gpus=all --rm -it -e USE_FP16=False -v `pwd`/trt-models:/tensorrt_models -v `pwd`/tensorrt_models.sh:/tensorrt_models.sh nvcr.io/nvidia/tensorrt:22.07-py3 /tensorrt_models.sh

Cleanup the image used to train with this.

 docker image prune -a


Create /etc/frigate/docker-compose.yml:

version: "3.9"
services:
  frigate:
    container_name: frigate
    privileged: true # this may not be necessary for all setups
    restart: unless-stopped
    image: ghcr.io/blakeblackshear/frigate:stable-tensorrt
    network_mode: bridge
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    shm_size: "128mb" # update for your cameras based on calculation above
    devices:
#      - /dev/bus/usb:/dev/bus/usb # passes the USB Coral, needs to be modified for other versions
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/frigate/trt-models:/trt-models:ro
      - /etc/frigate/config.yml:/config/config.yml
      - /srv/cctv:/media/frigate
      - type: tmpfs # Optional: 1GB of memory, reduces SSD/SD Card wear
        target: /tmp/cache
        tmpfs:
          size: 1000000000
    ports:
	  - "5000:5000"
	  - "8554:8554" # RTSP feeds
	  - "8555:8555/tcp" # WebRTC over tcp
	  - "8555:8555/udp" # WebRTC over udp
    environment:
      FRIGATE_RTSP_PASSWORD: "<Strong Password>"

Create /etc/frigate/config.yml:

mqtt:
  host: mqtt.example.net
  user: mqttbr
  password: <Broker Password>

detectors:
  coral:
    type: edgetpu
    device: usb

ffmpeg:
  hwaccel_args: -c:v h264_cuvid
  input_args: -avoid_negative_ts make_zero -fflags nobuffer -flags low_delay -strict experimental -fflags +genpts+discardcorrupt -rw_timeout 5000000 -use_wallclock_as_timestamps 1 -f live_flv

cameras:
  BackGarden:
    ffmpeg:
      inputs:
        - path: rtmp://backgarden.iot.example.net/bcs/channel0_sub.bcs?channel=0&stream=0&user=frigate&password=<Camera Password>
          roles:
            - detect
            - rtmp
        - path: rtmp://backgarden.iot.example.net/bcs/channel0_main.bcs?channel=0&stream=0&user=frigate&password=<Camera Password>
          roles:
            - record
    detect:
      width: 640
      height: 360
      fps: 4

record:
  enabled: True
  retain:
    days: 14
    mode: motion
  events:
    retain:
      default: 90
      mode: active_objects

Start Frigate with:

docker compose -f /etc/frigate/docker-compose.yml up -d

Visit the Frigate interface via:

http://server:5000/