Table of Contents

Frigate NVR Installation

Docker Installation

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 noble 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: (optional)

mv /var/lib/docker /srv/data

Edit the systemd service for Docker:

systemctl edit docker.service (only if moving)

Add the following to the top of the override file:

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

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 restart 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

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
      - /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: "Rd54bRZYghUuDWoXC2SPVr"
      - YOLO_MODELS=yolov7-tiny-416

Create /etc/frigate/config.yml:

version: 0.14

mqtt:
  host: mqtt.scottworld.net
  user: scottbroker
  password: mqtt1

#detectors:
#  coral:
#    type: edgetpu
#    device: usb

detectors:
  tensorrt:
    type: tensorrt
    device: 0

model:
  path: /config/model_cache/tensorrt/yolov7-tiny-416.trt
  input_tensor: nchw
  input_pixel_format: rgb
  width: 416
  height: 416

ffmpeg:
  hwaccel_args: preset-nvidia
  input_args: preset-http-reolink
  output_args:
    record: preset-record-generic-audio-copy

timestamp_style:
  format: '%Y-%m-%d %H:%M:%S'

go2rtc:
  streams:
    FrontCam:
      - ffmpeg:http://frontcam.scottworld.net/flv?port-1935&app=bcs&stream=channel0_main.bcs&user=camera&password=camera#video=copy#audio=copy
    BackCam:
      - ffmpeg:http://backcam.scottworld.net/flv?port-1935&app=bcs&stream=channel0_main.bcs&user=camera&password=camera#video=copy#audio=copy
    Doorbell:
      - ffmpeg:http://doorbell.scottworld.net/flv?port-1935&app=bcs&stream=channel0_main.bcs&user=camera&password=camera#video=copy#audio=copy

cameras:
  FrontCam:
    ffmpeg:
      inputs:
        - path: 
            http://frontcam.scottworld.net/flv?port-1935&app=bcs&stream=channel0_ext.bcs&user=camera&password=camera
          roles:
            - detect
        - path: rtsp://127.0.0.1:8554/FrontCam?video=copy&audio=aac
          input_args: preset-rtsp-restream
          roles:
            - record
    motion:
      mask: 1,0,0,0,0,0.145,0.278,0.057,0.281,0.168,0.515,0.306,0.519,0.168,1,0.433
    objects:
      track:
        - person
        - car
        - bicycle
        - motorcycle
    zones:
      front_drive:
        coordinates: 1,0.447,1,1,0,1,0,0.156,0.27,0.067,0.273,0.18,0.525,0.338,0.527,0.179
        objects:
          - person
          - car
          - bicycle
          - motorcycle
        inertia: 3
        loitering_time: 0
    review:
      alerts:
        required_zones:
          - front_drive

  BackCam:
    ffmpeg:
      inputs:
        - path: 
            http://backcam.scottworld.net/flv?port-1935&app=bcs&stream=channel0_ext.bcs&user=camera&password=camera
          roles:
            - detect
        - path: rtsp://127.0.0.1:8554/BackCam?video=copy&audio=aac
          input_args: preset-rtsp-restream
          roles:
            - record
    motion:
      mask: 1,0,1,0.071,0.57,0.068,0.568,0
    objects:
      track:
        - person
        - cat
        - bird
    zones:
      back_garden:
        coordinates: 0.487,1,0,1,0,0,0.54,0,0.54,0.088,0.797,0.094,1,0.435,0.824,0.775,0.866,1
        objects:
          - person
          - cat
          - bird
        inertia: 3
        loitering_time: 0
    review:
      alerts:
        required_zones:
          - back_garden

  Doorbell:
    ffmpeg:
      inputs:
        - path: 
            http://doorbell.scottworld.net/flv?port-1935&app=bcs&stream=channel0_ext.bcs&user=camera&password=camera
          roles:
            - detect
        - path: rtsp://127.0.0.1:8554/Doorbell?video=copy&audio=aac
          input_args: preset-rtsp-restream
          roles:
            - record
    motion:
      mask: 1,0,1,0.501,1,0.633,0.906,0.591,0.907,0.489,0,0.427,0,0
    objects:
      track:
        - person
    zones:
      front_porch:
        coordinates: 1,1,0,1,0,0.438,1,0.5
        objects: person
        inertia: 3
        loitering_time: 0
    review:
      alerts:
        required_zones:
          - front_porch

birdseye:
  enabled: true
  mode: motion

record:
  sync_recordings: true
  enabled: true
  retain:
    days: 7
    mode: motion
  events:
    retain:
      default: 28
      mode: active_objects

snapshots:
  enabled: true

Start Frigate with:

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

Visit the Frigate interface via:

http://server:5000/

Update the Image with

docker compose -f /etc/frigate/docker-compose.yml down
docker compose -f /etc/frigate/docker-compose.yml pull
docker compose -f /etc/frigate/docker-compose.yml up    (Add the -d option to start with a detach option)

docker image prune
docker container prune 
(on an upgrade)