You will need to have Mosquitto MQTT setup before using Frigate — fortunately, I have a guide for that already!
https://itbacon.com/2023/08/01/installing-mosquitto-mqtt-in-portainer/
Once you have confirmed Mosquitto is up and running, we can deploy a Frigate stack. This particular stack has a device mapping for a Google Coral A+E key device, as well as using /dev/dri/renderD128 for onboard graphics (Intel, in this case). You’ll want to adjust some things, such as whatever MQTT username and password you created during MQTT setup/install (see the guide for help!), as well as your camera admin username and password. If you use different usernames and passwords for all your cameras, you can specify them individually in your Frigate configuration file after the stack is deployed.
Also in this stack is a configuration for using a Samba/Windows based NAS as a volume for /media/frigate, which is where recordings and snapshots will be saved to. Basically, what I’m saying is, you’ll need to make some changes to the below code after pasting it, in order to have it suit your needs.
The majority of my configuration file was taken from the Full Reference Configuration File which is an excellent reference with comments about the various options in the configuration file.
I had also initially planned to include my nvidia setup/configuration sections, but the machine I just moved Frigate into can only take one full length card, I have used it for something else.
services:
frigate:
container_name: "frigate"
image: "ghcr.io/blakeblackshear/frigate:stable"
hostname: "frigate"
shm_size: 1024mb # increase if getting bus errors
privileged: true
restart: unless-stopped
cap_add:
- CAP_PERFMON
devices:
- /dev/dri/renderD128:/dev/dri/renderD128:ro # onboard video
- /dev/apex_0:/dev/apex_0:ro # coral
environment:
- "TZ=EST5EDT" # your timezone
- "FRIGATE_RTSP_USERNAME=admin" # camera admin username
- "FRIGATE_RTSP_PASSWORD=password" # camera admin password
- "FRIGATE_MQTT_USERNAME=frigate" # mqtt server username
- "FRIGATE_MQTT_PASSWORD=password" # mqtt server password
network_mode: host
volumes:
- /etc/localtime:/etc/localtime:ro
- data:/config
# if you're not using a NAS, change NAS to the path you're using
# e.g. /mnt/frigate:/media/frigate or /any/path:/media/frigate
- NAS:/media/frigate
- type: tmpfs
target: /tmp/cache
tmpfs:
size: 1G
volumes:
data:
mqtt_data:
NAS:
driver_opts:
type: cifs
o: "addr=IP.OF.NAS,username=SAMBA_USERNAME,password=SAMBA_PASSWORD,iocharset=utf8,file_mode=0600,dir_mode=0700"
device: "//IP.OF.NAS/SharedFolder"
networks:
frigate:
Here is my Frigate configuration file. It will be in /var/lib/docker/volumes/frigate_data/_data/config.yml
I know it’s kind of a mess, and there’s probably some redundant things in here, but I just felt bad about not having anything up still after so long. So there’s definitely some useful examples in here I imagine, for Amcrest, Reolink, Hikvision cameras. Examples of how to use separate streams for recording and detection, etc. Unfortunately at the time of writing all of this up tonight, I am extremely tired and must just get it out as is at this point.
Now, admittedly, full on support and assistance with configuring your Frigate NVR is vastly out of the scope of this guide. There is plenty of great documentation already available on the Official Frigate Website. Good luck!
mqtt:
enabled: true
host: 10.1.1.5 # the IP of the computer running MQTT, or localhost
port: 1883
topic_prefix: frigate
client_id: frigate
user: '{FRIGATE_MQTT_USERNAME}'
password: '{FRIGATE_MQTT_PASSWORD}'
stats_interval: 30
detectors:
coral:
type: edgetpu
device: pci
#cuda:
# type: tensorrt
# device: 0
#openvino:
# type: openvino
# device: AUTO
#cpu:
# type: cpu
# num_threads: 2
database:
path: /config/frigate.db
logger:
# Optional: Default log verbosity
default: warning
#default: warning
# Optional: Component specific logger overrides
#logs:
# frigate.nginx: error
# frigate.event: error
birdseye:
enabled: true
restream: true
width: 1280
height: 720
quality: 7
# motion (if motion was detected), objects (if it detected an object), or continuous (always on)
mode: continuous
ffmpeg:
global_args: -hide_banner -loglevel warning -threads 2
#hwaccel_args: preset-vaapi
hwaccel_args: preset-intel-qsv-h264
#hwaccel_args: preset-nvidia-h264
#input_args: preset-rtsp-generic
input_args: preset-rtsp-restream
output_args:
record: preset-record-generic-audio-copy
# default detect settings for all cameras
detect:
enabled: true
width: 704
height: 480
fps: 10
max_disappeared: 50
stationary:
interval: 10
threshold: 50
# default object tracking for all cameras
objects:
track:
- person
#filters:
# person:
# min_area: 100
# max_area: 75000
motion:
threshold: 25
contour_area: 25
delta_alpha: 0.2
frame_alpha: 0.2
frame_height: 75
improve_contrast: false
mqtt_off_delay: 30
# default record settings for all cameras
record:
enabled: true
expire_interval: 60
retain:
days: 15
mode: all
events:
pre_capture: 5
post_capture: 5
objects:
- person
retain:
default: 15
mode: all
snapshots:
enabled: true
clean_copy: true
timestamp: false
bounding_box: true
crop: false
retain:
default: 15
# configure your cameras here
go2rtc:
streams:
# reolink poe doorbell
doorbell:
- ffmpeg:rtsp://{FRIGATE_RTSP_USERNAME}:{FRIGATE_RTSP_PASSWORD}@10.1.5.108:554/h264Preview_01_main#video=copy#audio=copy#audio=opus
doorbell_sub:
- ffmpeg:rtsp://{FRIGATE_RTSP_USERNAME}:{FRIGATE_RTSP_PASSWORD}@10.1.5.108:554/h264Preview_01_sub#video=copy
# amcrest
front:
- rtsp://{FRIGATE_RTSP_USERNAME}:{FRIGATE_RTSP_PASSWORD}@10.1.5.114:554/cam/realmonitor?channel=1&subtype=0
- ffmpeg:back#audio=opus
front_sub:
- rtsp://{FRIGATE_RTSP_USERNAME}:{FRIGATE_RTSP_PASSWORD}@10.1.5.114:554/cam/realmonitor?channel=1&subtype=1
# amcrest
back:
- rtsp://{FRIGATE_RTSP_USERNAME}:{FRIGATE_RTSP_PASSWORD}@10.1.5.107:554/cam/realmonitor?channel=1&subtype=0
- ffmpeg:back#audio=opus
back_sub:
- rtsp://{FRIGATE_RTSP_USERNAME}:{FRIGATE_RTSP_PASSWORD}@10.1.5.107:554/cam/realmonitor?channel=1&subtype=1
# amcrest
porch:
- rtsp://{FRIGATE_RTSP_USERNAME}:{FRIGATE_RTSP_PASSWORD}@10.1.5.106:554/cam/realmonitor?channel=1&subtype=0
- ffmpeg:porch#audio=opus
porch_sub:
- rtsp://{FRIGATE_RTSP_USERNAME}:{FRIGATE_RTSP_PASSWORD}@10.1.5.106:554/cam/realmonitor?channel=1&subtype=1
# amcrest wifi camera
livingroom:
- rtsp://{FRIGATE_RTSP_USERNAME}:{FRIGATE_RTSP_PASSWORD}@10.1.5.112:554/cam/realmonitor?channel=1&subtype=0&authbasic=64
- ffmpeg:livingroom#audio=opus
livingroom_sub:
- rtsp://{FRIGATE_RTSP_USERNAME}:{FRIGATE_RTSP_PASSWORD}@10.1.5.112:554/cam/realmonitor?channel=1&subtype=1&authbasic=64
# hikvision
basement:
- rtsp://{FRIGATE_RTSP_USERNAME}:{FRIGATE_RTSP_PASSWORD}@10.1.5.104:554/Streaming/Channels/101
- ffmpeg:basement#video=copy
#basement_sub:
#- rtsp://{FRIGATE_RTSP_USERNAME}:{FRIGATE_RTSP_PASSWORD}@10.1.5.104:554/Streaming/Channels/102
#- ffmpeg:basement#video=copy
# we use localhost because go2rtc is restreaming them locally based on the names we gave them above
cameras:
doorbell:
enabled: true
ffmpeg:
inputs:
- path: rtsp://localhost:8554/doorbell
roles:
- record
- path: rtsp://localhost:8554/doorbell_sub
roles:
- detect
detect:
enabled: true
width: 640
height: 480
objects:
track:
- person
mqtt:
enabled: true
timestamp: true
bounding_box: true
crop: true
height: 720
quality: 92
live:
height: 720
quality: 7
ui:
order: 1
#motion:
# mask:
# - 640,0,640,309,605,335,482,368,252,366,0,311,0,0
front:
enabled: true
ffmpeg:
inputs:
- path: rtsp://localhost:8554/front
roles:
- record
detect:
enabled: true
record:
events:
#required_zones:
#- FrontYard
retain:
default: 15
objects:
track:
- person
- cat
mqtt:
enabled: true
timestamp: true
bounding_box: true
crop: true
height: 720
quality: 92
live:
height: 720
quality: 7
ui:
order: 2
#motion:
# mask:
# - 704,0,704,202,0,150,0,0
#zones:
# FrontYard:
# coordinates: 650,196,82,136,0,228,0,480,704,480
back:
enabled: true
ffmpeg:
inputs:
- path: rtsp://localhost:8554/back
roles:
- record
- path: rtsp://localhost:8554/back_sub
roles:
- detect
record:
events:
#required_zones:
#- BackYard
retain:
default: 15
objects:
track:
- person
- cat
mqtt:
enabled: true
timestamp: true
bounding_box: true
crop: true
height: 720
quality: 92
live:
height: 720
quality: 7
ui:
order: 3
#motion:
# mask:
# - 291,0,288,41,0,39,0,0
#zones:
# BackYard:
# coordinates: 374,0,600,480,0,480,0,0
porch:
enabled: true
ffmpeg:
inputs:
- path: rtsp://localhost:8554/porch
roles:
- record
- path: rtsp://localhost:8554/porch_sub
roles:
- detect
record:
events:
retain:
default: 15
objects:
track:
- person
- cat
mqtt:
enabled: true
timestamp: true
bounding_box: true
crop: true
height: 720
quality: 92
live:
height: 720
quality: 7
ui:
order: 4
#motion:
# mask:
# - 261,0,270,104,323,223,367,333,480,348,534,76,640,51,640,480,0,480,0,0
livingroom:
enabled: true
ffmpeg:
inputs:
- path: rtsp://localhost:8554/livingroom
roles:
- record
- path: rtsp://localhost:8554/livingroom_sub
roles:
- detect
detect:
enabled: true
record:
events:
objects:
- cat
retain:
default: 15
objects:
track:
- cat
mqtt:
enabled: true
timestamp: true
bounding_box: true
crop: true
height: 720
quality: 92
live:
height: 720
quality: 7
ui:
order: 5
basement:
enabled: true
ffmpeg:
inputs:
- path: rtsp://localhost:8554/basement
roles:
- record
- detect
record:
events:
#required_zones:
#- BasementStairs
objects:
- cat
retain:
default: 15
detect:
enabled: true
width: 1280
height: 720
fps: 10
objects:
track:
- cat
mqtt:
enabled: true
timestamp: true
bounding_box: true
crop: true
height: 720
quality: 92
live:
height: 720
quality: 7
ui:
order: 6
timestamp_style:
position: tl
format: '%m/%d/%Y %H:%M:%S'
color:
red: 255
green: 255
blue: 255
thickness: 1
effect: solid
ui:
live_mode: webrtc
timezone: EST5EDT
use_experimental: false
time_format: 12hour
date_style: short
time_style: medium
strftime_fmt: '%Y/%m/%d %H:%M'
telemetry:
version_check: true