Frigate NVR Setup
Setup
Frigate NVR — Docker Setup Guide
Frigate is a self-hosted NVR (Network Video Recorder) with real-time object detection, face recognition, license plate recognition, and semantic search. This guide covers deploying Frigate via Docker Compose with go2rtc stream rebroadcasting, SMB-mounted NAS storage for footage, and role-based camera access control.
Prerequisites
- Docker and Docker Compose installed on the host
- A dedicated storage path for footage (local or NAS mount — see SMB section below)
- IP cameras with RTSP streams accessible from the host
- Host machine on the same network/VLAN as the cameras
Directory Structure
~/frigate/
├── docker-compose.yml
└── config/
└── config.yml
SMB NAS Mount (fstab)
Footage is stored on a NAS via SMB share, mounted at boot using /etc/fstab. Add the following entry to /etc/fstab:
//YOUR_NAS_IP/share_name /homedata/cameras cifs credentials=/etc/smb-credentials,uid=1000,gid=1000,_netdev,auto 0 0
Create the credentials file:
bash
sudo nano /etc/smb-credentials
username=YOUR_SMB_USER
password=YOUR_SMB_PASSWORD
bash
sudo chmod 600 /etc/smb-credentials
sudo mkdir -p /mnt/nvr/cameras
sudo mount -a
Verify the mount is working before starting Frigate:
bash
df -h | grep cameras
Docker Compose
yaml
services:
frigate:
container_name: frigate
privileged: true
restart: unless-stopped
image: ghcr.io/blakeblackshear/frigate:stable
shm_size: "64mb"
volumes:
- /etc/localtime:/etc/localtime:ro
- ./config:/config
- /mnt/nvr/cameras:/media/frigate # NAS SMB mount
- type: tmpfs
target: /tmp/cache
tmpfs:
size: 1000000000 # 1GB tmpfs for decode cache
ports:
- "5000:5000" # Web UI
- "8971:8971" # go2rtc web UI
- "8554:8554" # RTSP restream feeds
- "8555:8555/tcp" # WebRTC
- "8555:8555/udp" # WebRTC
environment:
- FRIGATE_RTSP_PASSWORD=YOUR_RTSP_PASSWORD
Note:
privileged: trueis required for hardware acceleration access on most setups. If you're not using a Coral TPU or specific GPU passthrough, you can try dropping this and mounting only the devices you need.
config.yml
yaml
version: 0.17-0
go2rtc:
webrtc:
listen: :8555
candidates:
- YOUR_HOST_IP:8555 # LAN IP of the Frigate host
- stun:8555
streams:
camera_name_1:
- rtsp://USER:PASS@CAMERA_IP:554/stream_path
camera_name_2:
- rtsp://USER:PASS@CAMERA_IP:554/stream_path
# Add additional streams as needed
mqtt:
enabled: false # Enable and configure if using Home Assistant or MQTT alerts
# -------------------------------------------------------
# Recording
# -------------------------------------------------------
record:
enabled: true
continuous:
days: 1 # 1 day of continuous footage retention
detections:
retain:
days: 7
mode: motion # Keep only clips with motion
alerts:
retain:
days: 14
mode: motion # Keep alert clips longer
# -------------------------------------------------------
# Auth & Role-Based Camera Access
# -------------------------------------------------------
auth:
enabled: true
roles:
username:
- camera_name_1
- camera_name_2
# List only the cameras this user should have access to
# -------------------------------------------------------
# FFmpeg Global Settings
# -------------------------------------------------------
ffmpeg:
input_args: preset-rtsp-restream
# -------------------------------------------------------
# Object Detection
# -------------------------------------------------------
objects:
track:
- person
- dog
- cat
- car
filters:
person:
threshold: 0.7 # Confidence threshold — tune to reduce false positives
# -------------------------------------------------------
# AI Features
# -------------------------------------------------------
semantic_search:
enabled: true
model_size: small # Options: small, large
face_recognition:
enabled: true
model_size: small
lpr:
enabled: true # License plate recognition
classification:
bird:
enabled: true
# -------------------------------------------------------
# Notifications
# -------------------------------------------------------
notifications:
enabled: true
email: YOUR_EMAIL@domain.com
# -------------------------------------------------------
# Cameras
# -------------------------------------------------------
cameras:
camera_name_1:
enabled: true
ffmpeg:
inputs:
- path: rtsp://127.0.0.1:8554/camera_name_1?video=copy
input_args: preset-rtsp-restream
roles:
- detect
- record
- audio
detect:
enabled: true
width: 896
height: 512
fps: 8
notifications:
enabled: true
camera_name_2:
enabled: true
ffmpeg:
inputs:
# Use separate high-res and sub-stream inputs when available
- path: rtsp://127.0.0.1:8554/camera_name_2_main
input_args: preset-rtsp-restream
roles:
- record
- audio
- path: rtsp://127.0.0.1:8554/camera_name_2_sub
input_args: preset-rtsp-restream
roles:
- detect
live:
height: 360
detect:
enabled: true
width: 1280
height: 360
fps: 8
notifications:
enabled: true
# Camera with ONVIF PTZ support
ptz_camera:
enabled: true
ffmpeg:
inputs:
- path: rtsp://127.0.0.1:8554/ptz_camera?video=copy
input_args: preset-rtsp-restream
roles:
- detect
- record
- audio
detect:
enabled: true
width: 896
height: 512
fps: 8
onvif:
host: CAMERA_IP
port: 80
user: YOUR_USER
password: YOUR_PASSWORD
notifications:
enabled: true
Starting Frigate
bash
cd ~/frigate
docker compose up -d
Check logs:
bash
docker logs -f frigate
Accessing the UI
| Service | URL |
|---|---|
| Frigate Web UI | http://HOST_IP:5000 |
| go2rtc Web UI | http://HOST_IP:8971 |
| RTSP Restreams | rtsp://HOST_IP:8554/camera_name |