====== 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: [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 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)