Professional-grade configuration tool for Frigate NVR
Compatible with Frigate 0.14.x, 0.15.x, 0.16.x, and 0.17.x (stable releases)
Frigate is a free, open-source project built by Blake Blackshear and dedicated contributors who work tirelessly to provide the best NVR solution. Their incredible effort makes this software possible for everyone.
If Frigate has helped you secure your home or business, please consider supporting the project:
Your support helps maintain development, add new features, and keep Frigate free for everyone. Thank you! ๐
๐น Main Stream (High Resolution - For Recording)
๐น Sub Stream (Low Resolution - For Detection)
docker-compose.ymlconfig/config.ymlOn first startup, Frigate generates a random admin password. You MUST retrieve it from logs immediately:
Method 1: View logs immediately after starting Frigate
docker logs frigate 2>&1 | grep -i password
Look for a line like:Frigate admin user password: Xh9kL2mP5qR8tY
Method 2: If you missed it, reset the password
config/config.ymlauth:
reset_admin_password: true
docker restart frigatedocker logs frigate 2>&1 | grep -i passwordreset_admin_password: true line from config immediatelyโ ๏ธ SECURITY NOTES:
admin (lowercase)reset_admin_password: true in your config permanentlyMethod 1: Camera Web Interface (Most Reliable)
http://CAMERA_IPMethod 2: Test with VLC Media Player
Method 3: ONVIF Device Manager (Advanced)
Common RTSP URL Formats by Camera Brand:
Hikvision:
rtsp://admin:password@192.168.1.64:554/Streaming/Channels/101 (main stream)rtsp://admin:password@192.168.1.64:554/Streaming/Channels/102 (sub stream)
Dahua / Loryta / Amcrest:
rtsp://admin:password@192.168.1.64:554/cam/realmonitor?channel=1&subtype=0 (main)rtsp://admin:password@192.168.1.64:554/cam/realmonitor?channel=1&subtype=1 (sub)
Reolink:
rtsp://admin:password@192.168.1.64:554/h264Preview_01_main (main stream)rtsp://admin:password@192.168.1.64:554/h264Preview_01_sub (sub stream)
Amcrest (Alternative Format):
rtsp://admin:password@192.168.1.64:554/cam/realmonitor?channel=1&subtype=0
Generic / ONVIF Cameras:
rtsp://admin:password@192.168.1.64:554/stream1 (main)rtsp://admin:password@192.168.1.64:554/stream2 (sub)Also try: /live, /h264, /cam1, /video1, /live/main, /live/sub
Unifi Protect:
rtsp://username:password@192.168.1.64:7447/CAMERA_ID
Note: Unifi cameras require specific format, check Unifi documentation
Troubleshooting RTSP Connection:
?tcp at end of URL to force TCP modeBest Practices for Camera Configuration:
Intel GPU (VAAPI) - RECOMMENDED for Most Users
/dev/dri device passthrough (automatically configured by this tool)Setup Commands (on host machine):
# Add current user to render and video groups
sudo usermod -aG render,video $(whoami)
# Set permissions for DRI devices
sudo chmod -R 777 /dev/dri
# IMPORTANT: Logout and login OR reboot for changes to take effect
sudo reboot
Verify GPU access after reboot:
# Check DRI devices exist
ls -la /dev/dri
# Should see: card0, renderD128, etc.
# Test hardware acceleration (install vainfo if needed)
vainfo
# Should display GPU model and supported codecs
Google Coral Edge TPU - BEST Performance/Watt
Setup for USB Coral:
# Install EdgeTPU runtime on host
echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt update
sudo apt install libedgetpu1-std
# Verify Coral is detected
lsusb | grep "Google"
# Should show: "Global Unichip Corp. Google Coral"
Setup for PCIe/M.2 Coral:
# Install drivers
sudo apt install gasket-dkms libedgetpu1-std
# Load kernel module
sudo modprobe apex
# Verify device
ls /dev/apex_0
# Should exist if detected correctly
โ ๏ธ Note: Coral TPU only supports specific pre-compiled models. Cannot use custom YOLO models without conversion.
NVIDIA GPU - For Dedicated Graphics Cards
Install NVIDIA Container Toolkit (Debian/Ubuntu):
# Add NVIDIA repository
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
# Install toolkit
sudo apt update
sudo apt install -y nvidia-container-toolkit
# Configure Docker
sudo nvidia-ctk runtime configure --runtime=docker
# Restart Docker
sudo systemctl restart docker
Verify GPU access in container:
docker exec frigate nvidia-smi
# Should display GPU stats and memory usage
CPU Only - Universal Compatibility
Optimization tips for CPU-only:
AMD GPU (ROCm) - Experimental
๐ฅ๏ธ Proxmox GPU Sharing Guide
Intel integrated GPUs can be shared between Proxmox host and LXC containers, but NOT with VMs (requires full passthrough for VMs).
Share Intel iGPU with LXC Container (Recommended):
ls -la /dev/dri
# Note the major:minor numbers (usually 226:0 and 226:128)
nano /etc/pve/lxc/103.conf
# GPU passthrough for Frigate
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file
pct start 103
ls -la /dev/dri
# Should see renderD128 and card0
# Install vainfo to test (optional)
apt install -y vainfo
vainfo
# Should display Intel GPU information
usermod -aG render,video root
โ ๏ธ IMPORTANT: VM GPU Passthrough Limitations
You CANNOT share a GPU between Proxmox host + VM + LXC simultaneously.
Full PCI Passthrough to VM (Intel iGPU - Advanced):
nano /etc/default/grub
# Find line: GRUB_CMDLINE_LINUX_DEFAULT="quiet"
# Change to:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
# For AMD CPU, use:
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt"
# Save and update GRUB
update-grub
reboot
lspci -nn | grep VGA
# Example output: 00:02.0 VGA compatible controller [0300]: Intel Corporation [8086:9a49]
# Note the address: 00:02.0
# Inside VM
lspci | grep VGA
# Should show GPU passed through
Troubleshooting Proxmox GPU Issues:
ls -la /dev/dri on hostModels included by default in Frigate:
Additional models (require manual download and configuration):
YOLOv8 Nano - Recommended Upgrade
Advantages: Better accuracy than default, modern architecture, 640ร640 input
mkdir -p /opt/frigate/config/model_cache
cd /opt/frigate/config/model_cache
# Download from Ultralytics GitHub
wget https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n.onnx
# Verify file downloaded
ls -lh yolov8n.onnx
model:
path: /config/model_cache/yolov8n.onnx
input_tensor: nchw
input_pixel_format: bgr
width: 640
height: 640
labelmap_path: /openvino-model/coco_80cl.txt
docker restart frigate
docker logs frigate -f | grep model
YOLOv9 Compact - Better Accuracy
Advantages: Improved detection, especially for small objects, newer architecture
# If you have .pt file, convert to ONNX
pip install ultralytics
python -c "from ultralytics import YOLO; YOLO('yolov9c.pt').export(format='onnx')"
yolov9c.onnx in /opt/frigate/config/model_cache/model:
path: /config/model_cache/yolov9c.onnx
input_tensor: nchw
input_pixel_format: bgr
width: 640
height: 640
YOLOv10 Nano - Newest Generation
Advantages: Latest YOLO architecture, improved speed/accuracy balance
YOLOv11 Nano - Latest Model (Experimental)
Advantages: Cutting-edge performance, may require testing
cd /opt/frigate/config/model_cache
wget [URL_to_yolov11n.onnx] # Check Ultralytics releases
YOLOX Tiny - Lightweight Option
Advantages: Faster than default on some hardware, 416ร416 input
cd /opt/frigate/config/model_cache
wget https://github.com/openvinotoolkit/open_model_zoo/raw/master/models/public/yolox-tiny/FP16/yolox-tiny.xml
wget https://github.com/openvinotoolkit/open_model_zoo/raw/master/models/public/yolox-tiny/FP16/yolox-tiny.bin
model:
path: /config/model_cache/yolox-tiny.xml
input_tensor: nchw
input_pixel_format: bgr
width: 416
height: 416
โ ๏ธ Important Model Considerations:
Model Performance Comparison:
| Model | Input Size | Speed | Accuracy | Best For |
|---|---|---|---|---|
| SSDLite MobileNet v2 | 300ร300 | โกโกโกโก | โญโญโญ | Default, balanced |
| YOLOv8 Nano | 640ร640 | โกโกโก | โญโญโญโญ | Best overall upgrade |
| YOLOv9 Compact | 640ร640 | โกโก | โญโญโญโญโญ | High accuracy needs |
| YOLOX Tiny | 416ร416 | โกโกโกโก | โญโญโญ | Speed priority |
| EdgeTPU (Coral) | 320ร320 | โกโกโกโกโก | โญโญโญ | Max efficiency |
Understanding bitrate encoding modes is CRITICAL for Frigate stability.
โ CBR (Constant Bitrate) - STRONGLY RECOMMENDED for Frigate
How it works:
Pros:
Cons:
Recommended bitrates:
โ USE CBR for all Frigate cameras - main and sub streams!
โ ๏ธ VBR (Variable Bitrate) - Use with EXTREME Caution
How it works:
Pros:
Cons (MAJOR ISSUES FOR FRIGATE):
โ Problem scenario: Person walks across frame โ camera lowers bitrate to save bandwidth โ blocky frames โ Frigate misses detection!
Only use VBR if:
How to configure encoding in camera:
Verifying your stream configuration:
# Test with FFmpeg
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name,bit_rate,r_frame_rate,width,height rtsp://admin:pass@192.168.1.64/stream1
# Check bitrate stability over time
ffmpeg -i rtsp://admin:pass@192.168.1.64/stream1 -t 60 -f null - 2>&1 | grep bitrate
Formula for storage calculation:
Storage (GB) = Cameras ร Bitrate (Mbps) ร Hours ร 0.45
The 0.45 factor accounts for H.264 compression efficiency
Example Calculation: 4 cameras, 24/7 recording
Configuration:
Calculation:
Per camera per day:
5 Mbps ร 24 hours ร 0.45 = 54 GB/day
All 4 cameras per day:
54 GB ร 4 cameras = 216 GB/day
Weekly storage:
216 GB ร 7 days = 1,512 GB = 1.5 TB/week
Monthly storage:
216 GB ร 30 days = 6,480 GB = 6.5 TB/month
Yearly storage:
216 GB ร 365 days = 78,840 GB = 79 TB/year
Storage Recommendations by Camera Count:
Storage Best Practices:
Storage Hardware Recommendations:
For Small Setup (1-4 cameras):
For Medium Setup (5-12 cameras):
For Large Setup (12+ cameras):
Monitoring storage usage:
# Check overall storage
df -h /mnt/frigate
# Check per-camera usage
du -sh /mnt/frigate/recordings/*
# Find oldest recordings
find /mnt/frigate/recordings -type f -printf '%T+ %p\n' | sort | head -20
# Check database size
du -sh /opt/frigate/config/frigate.db
On your Linux server (Proxmox/Ubuntu/Debian/Any Linux):
Step 1: Create directory structure
# Create Frigate directories
sudo mkdir -p /opt/frigate/config
sudo mkdir -p /mnt/frigate
# Set permissions (replace 'youruser' with your username)
sudo chown -R youruser:youruser /opt/frigate
sudo chown -R youruser:youruser /mnt/frigate
# Navigate to Frigate directory
cd /opt/frigate
Step 2: Save docker-compose.yml
# Open nano editor
nano docker-compose.yml
# Paste the generated docker-compose.yml from this tool
# (Copy from the green "Copy to Clipboard" button above)
# Save and exit:
# Press Ctrl+O (save)
# Press Enter (confirm filename)
# Press Ctrl+X (exit)
Step 3: Save config.yml
# Open nano editor for config
nano config/config.yml
# Paste the generated config.yml from this tool
# (Copy from the green "Copy to Clipboard" button above)
# Save and exit: Ctrl+O, Enter, Ctrl+X
Step 4: Verify configuration files
# Check docker-compose.yml syntax
cat docker-compose.yml
# Check config.yml syntax
cat config/config.yml
# Verify directory structure
ls -la /opt/frigate/
ls -la /opt/frigate/config/
Step 5: Start Frigate
# Start Frigate container
docker compose up -d
# Verify container is running
docker ps | grep frigate
# Should show: frigate container with status "Up"
Step 6: Get admin password from logs
# Wait 10-15 seconds for Frigate to fully start, then:
docker logs frigate 2>&1 | grep -i password
# Look for line like:
# "Frigate admin user password: Xh9kL2mP5qR8tY"
# COPY THIS PASSWORD IMMEDIATELY!
Step 7: Access Frigate Web UI
http://YOUR_SERVER_IP:8971http://192.168.1.100:8971adminStep 8: Change password immediately
Step 9: Verify everything works
# Check logs for errors
docker logs frigate --tail 100 | grep -i error
# Verify go2rtc streams are working
docker exec frigate curl -s http://127.0.0.1:1984/api/streams
# Should show all your cameras with "producers" field populated
# Check GPU access (if using Intel VAAPI)
docker exec frigate ls -la /dev/dri
# Check GPU access (if using NVIDIA)
docker exec frigate nvidia-smi
# Check Coral TPU (if using)
docker exec frigate ls -la /dev/bus/usb # for USB Coral
docker exec frigate ls -la /dev/apex_0 # for PCIe Coral
Step 10: Monitor Frigate
# Watch logs in real-time
docker logs frigate -f
# Check for any warnings or errors
# Ctrl+C to stop watching
# Check detection FPS (should be close to your configured FPS)
docker logs frigate 2>&1 | grep "detection_fps"
# Check storage usage
df -h /mnt/frigate
โ ๏ธ Common First-Startup Issues:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ FRIGATE NVR ARCHITECTURE โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
๐น IP Cameras (RTSP Streams)
โ
โโโโ Main Stream (1080p/4K @ 15fps, 4-8 Mbps) โโโ
โ โ
โโโโ Sub Stream (720p @ 5fps, 1-2 Mbps) โโโโโโโโโ
โโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โโโโโโโโโโโโโโโโโโโ โ
โ go2rtc โ (Restreaming Engine) โ
โ - RTSP โ WebRTCโ โ
โ - Low latency โ โ
โ - Browser view โ โ
โโโโโโโโโโโโโโโโโโโ โ
โ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ FFmpeg โ
โ - Decode H.264/H.265 โ
โ - Hardware acceleration (VAAPI/NVENC) โ
โ - Frame extraction โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ (Sub stream frames) โ (Main stream)
โ โ
โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
โ Motion Detectionโ โ Recording โ
โ - Frame diff โ โ - Continuous โ
โ - Threshold โ โ - Events only โ
โโโโโโโโโโโโโโโโโโโโ โ - Segments โ
โ โโโโโโโโโโโโโโโโโโโโ
โ (motion detected) โ
โโโโโโโโโโโโโโโโโโโโ โ
โ Object Detector โ ๐พ Disk Storage
โ - OpenVINO GPU โ /mnt/frigate/
โ - Coral TPU โ โโโ recordings/
โ - CPU/NVIDIA โ โโโ clips/
โโโโโโโโโโโโโโโโโโโโ โโโ snapshots/
โ
โ (objects found)
โโโโโโโโโโโโโโโโโโโโ
โ Object Tracking โ
โ - Kalman filter โ
โ - Multi-frame โ
โ - Zones โ
โโโโโโโโโโโโโโโโโโโโ
โ
โ (confirmed objects)
โโโโโโโโโโโโโโโโโโโโ
โ Events โ
โ - Snapshots โ
โ - Clips โ
โ - Metadata โ
โโโโโโโโโโโโโโโโโโโโ
โ
โโโ ๐๏ธ SQLite Database (events, stats)
โ
โโโ ๐ก MQTT Broker
โโโ Home Assistant
โโโ Notifications
โโโ Automations
๐ก go2rtc - The Restreaming Engine
๐ฌ FFmpeg - The Video Processor
๐๏ธ Motion Detection - The First Filter
๐ค Object Detector - The AI Brain
๐ฏ Object Tracking - The Smart Filter
๐ผ Recording Engine - The Storage Manager
๐ธ Snapshots & Clips - The Evidence
๐๏ธ Database - The Event Logger
๐ก MQTT - The Integration Layer
Total time: 8.1 seconds from first detection to complete event logged
Performance varies based on hardware, model, and configuration. Example based on Intel 11th gen CPU with iGPU + OpenVINO detector.
โ Common Bottlenecks:
โ Optimization Checklist:
Get initial admin password:
docker logs frigate 2>&1 | grep -i password
Reset admin password:
# Add to config.yml:
auth:
reset_admin_password: true
# Restart and check logs:
docker restart frigate
docker logs frigate 2>&1 | grep -i password
# REMOVE the line from config after getting new password!
Check for errors in logs:
docker logs frigate 2>&1 | grep -i error
Watch logs in real-time:
docker logs frigate -f
# Press Ctrl+C to stop
Check detection FPS for all cameras:
docker logs frigate 2>&1 | grep "detection_fps"
Check inference speed (detector performance):
docker logs frigate 2>&1 | grep "inference_speed"
View camera stream status:
docker exec frigate curl -s http://127.0.0.1:1984/api/streams | jq
Check Intel GPU access (VAAPI):
# Inside container:
docker exec frigate ls -la /dev/dri
# Should show: card0, renderD128, etc.
# Check GPU info:
docker exec frigate vainfo
# Requires intel-media-va-driver installed in container
Check NVIDIA GPU access:
docker exec frigate nvidia-smi
# Should display GPU name, memory, utilization
Check Google Coral TPU:
# USB Coral:
docker exec frigate ls -la /dev/bus/usb
# PCIe/M.2 Coral:
docker exec frigate ls -la /dev/apex_0
# If not found, check host:
lsusb | grep "Google"
ls /dev/apex_0
Check overall storage usage:
df -h /mnt/frigate
Check storage per camera:
du -sh /mnt/frigate/recordings/*
Find oldest recordings:
find /mnt/frigate/recordings -type f -printf '%T+ %p\n' | sort | head -20
Check database size:
du -sh /opt/frigate/config/frigate.db
Manually clean old recordings (careful!):
# Delete recordings older than 7 days:
find /mnt/frigate/recordings -type f -mtime +7 -delete
# Delete specific camera recordings:
rm -rf /mnt/frigate/recordings/front_door/2025-12-01/
Restart Frigate:
docker restart frigate
Stop Frigate:
docker stop frigate
Start Frigate:
docker start frigate
Update Frigate to latest stable:
cd /opt/frigate
docker compose pull
docker compose up -d
Check Frigate version:
docker exec frigate cat /VERSION
Test camera RTSP stream with FFmpeg:
# Test if stream is accessible:
ffprobe -v error -show_entries stream=codec_name,width,height,r_frame_rate \
rtsp://admin:password@192.168.1.64/stream1
# Test recording 10 seconds:
ffmpeg -i rtsp://admin:password@192.168.1.64/stream1 -t 10 -c copy test.mp4
Validate config.yml syntax:
# Check for YAML syntax errors:
docker run --rm -v /opt/frigate/config:/config \
ghcr.io/blakeblackshear/frigate:stable \
python3 -c "import yaml; yaml.safe_load(open('/config/config.yml'))"
# If no output, syntax is valid!
Check go2rtc stream status:
docker exec frigate curl -s http://127.0.0.1:1984/api/streams
Backup configuration:
tar -czf frigate-config-$(date +%Y%m%d).tar.gz /opt/frigate/config/
Backup database:
# Stop Frigate first for clean backup:
docker stop frigate
# Copy database:
cp /opt/frigate/config/frigate.db /backup/frigate-db-$(date +%Y%m%d).db
# Start Frigate:
docker start frigate
Automated backup script:
#!/bin/bash
# Save as /usr/local/bin/backup-frigate.sh
BACKUP_DIR="/mnt/backups/frigate"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
echo "Backing up Frigate config and database..."
# Backup config
tar -czf "$BACKUP_DIR/config-$DATE.tar.gz" /opt/frigate/config/
# Backup database (with Frigate stopped)
docker stop frigate
sleep 5
cp /opt/frigate/config/frigate.db "$BACKUP_DIR/frigate-$DATE.db"
docker start frigate
# Backup recent clips (last 30 days)
find /mnt/frigate/clips -mtime -30 -type f | \
tar -czf "$BACKUP_DIR/clips-$DATE.tar.gz" -T -
# Delete backups older than 90 days
find "$BACKUP_DIR" -mtime +90 -delete
echo "Backup complete: $BACKUP_DIR"
Schedule daily backups with cron:
crontab -e
# Add this line (runs daily at 3 AM):
0 3 * * * /usr/local/bin/backup-frigate.sh >> /var/log/frigate-backup.log 2>&1
Restore from backup:
# Stop Frigate:
docker stop frigate
# Restore config:
tar -xzf /backup/frigate-config-20251228.tar.gz -C /
# Restore database:
cp /backup/frigate-db-20251228.db /opt/frigate/config/frigate.db
# Start Frigate:
docker start frigate
Create timelapse from recordings:
# 24-hour timelapse at 100x speed:
ffmpeg -pattern_type glob -i '/mnt/frigate/recordings/front_door/2025-12-27/*/*.mp4' \
-vf "setpts=0.01*PTS,fps=30" \
-c:v libx264 -preset fast -crf 23 \
timelapse-front-door-2025-12-27.mp4
# Result: 24 hours compressed to ~14 minutes
Extract specific time range:
# Extract 10 minutes starting from specific time:
ffmpeg -ss 14:30:00 -i /mnt/frigate/recordings/front_door/2025-12-27/14/*.mp4 \
-t 00:10:00 -c copy output.mp4
Convert clip to GIF:
ffmpeg -i /mnt/frigate/clips/front_door-person-20251227.mp4 \
-vf "fps=10,scale=480:-1:flags=lanczos" \
-c:v gif output.gif
Test camera connectivity:
# Ping camera:
ping -c 4 192.168.1.64
# Check if RTSP port is open:
telnet 192.168.1.64 554
# Or with netcat:
nc -zv 192.168.1.64 554
Check Frigate port accessibility:
# From server:
curl http://localhost:8971
# From another computer:
curl http://192.168.1.100:8971
Monitor network bandwidth:
# Install iftop:
sudo apt install iftop
# Monitor traffic:
sudo iftop -i eth0
# Or use docker stats:
docker stats frigate
โ ๏ธ NEVER expose Frigate directly to the internet!
Port forwarding Frigate (port 8971) is a major security risk. Use these methods instead:
Method 1: Tailscale VPN (Recommended - Easiest)
Why it's best: Zero configuration NAT traversal, works behind CGNAT, free for personal use, WireGuard-based encryption
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
http://TAILSCALE_IP:8971tailscale ip -4โ Fully encrypted, zero port forwarding, works everywhere, even on cellular/hotel WiFi
Method 2: WireGuard VPN (Traditional VPN)
When to use: You want full control, already have VPN server, or need to access other services too
sudo apt install wireguard
http://192.168.1.X:8971โ ๏ธ Requires port forwarding (51820) and manual configuration
Method 3: Cloudflare Tunnel (Advanced - No Port Forwarding)
When to use: Behind CGNAT, no port forwarding possible, want HTTPS with custom domain
curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared.deb
cloudflared tunnel logincloudflared tunnel create frigatelocalhost:8971https://frigate.yourdomain.comโ Free, automatic HTTPS, no port forwarding, works behind CGNAT
โ ๏ธ Requires domain name and Cloudflare account, traffic passes through Cloudflare servers
Method 4: Nginx Reverse Proxy + Let's Encrypt (Self-Hosted HTTPS)
When to use: Want full control, already have domain, comfortable with web server administration
sudo apt install nginx certbot python3-certbot-nginx
sudo certbot --nginx -d frigate.yourdomain.com
https://frigate.yourdomain.comโ Full control, self-hosted, professional HTTPS setup
โ ๏ธ Requires domain, port forwarding, and web server knowledge
Method 5: Nebula Mesh VPN (For Tech Enthusiasts)
When to use: Want peer-to-peer mesh network, maximum security, connecting multiple sites
Nebula is a scalable overlay network created by Slack. Similar to Tailscale but self-managed.
Security Best Practices (All Methods):
Frigate integrates seamlessly with Home Assistant via MQTT for powerful automations.
Setup Steps:
http://192.168.1.100:8971Example Automation: Alert on Person Detection
automation:
- alias: "Notify on Person at Front Door"
trigger:
- platform: mqtt
topic: "frigate/front_door/person"
payload: "ON"
condition:
- condition: state
entity_id: alarm_control_panel.home
state: "armed_away"
action:
- service: notify.mobile_app
data:
title: "Person Detected"
message: "Someone is at the front door"
data:
image: "https://frigate.local:8971/api/front_door/person/snapshot.jpg"
actions:
- action: "VIEW_CLIP"
title: "View Clip"
- action: "DISMISS"
title: "Dismiss"
Example: Turn on Lights When Person Detected at Night
automation:
- alias: "Front Porch Light on Person Detection"
trigger:
- platform: mqtt
topic: "frigate/front_door/person"
payload: "ON"
condition:
- condition: sun
after: sunset
before: sunrise
action:
- service: light.turn_on
target:
entity_id: light.front_porch
data:
brightness: 255
- delay: "00:05:00"
- service: light.turn_off
target:
entity_id: light.front_porch
Example: Disable Detection When Home
automation:
- alias: "Disable Frigate When Home"
trigger:
- platform: state
entity_id: person.john
to: "home"
action:
- service: switch.turn_off
target:
entity_id: switch.frigate_front_door_detect
- alias: "Enable Frigate When Away"
trigger:
- platform: state
entity_id: person.john
to: "not_home"
action:
- service: switch.turn_on
target:
entity_id: switch.frigate_front_door_detect
Available Entities in Home Assistant:
Zones allow you to only trigger events when objects enter specific areas.
Example: Only alert when person enters "porch" zone
cameras:
front_door:
zones:
porch:
coordinates: 100,200,300,200,300,400,100,400
objects:
- person
driveway:
coordinates: 400,300,800,300,800,600,400,600
objects:
- person
- car
objects:
filters:
person:
mask: 50,50,150,50,150,150,50,150 # Exclude neighbor's yard
min_area: 2000 # Minimum 2000 pixels (filters out distant people)
max_area: 100000 # Maximum size (filters out vehicles misclassified as person)
min_score: 0.6 # 60% confidence minimum
threshold: 0.7 # 70% for tracking
min_ratio: 0.2 # Aspect ratio filter (prevents horizontal blobs)
max_ratio: 5.0
How to create zones:
Filtering Best Practices:
stationary object filter with threshold parameter.min_area to separate cats/dogs from people. People are typically 5000+ pixels, pets 1000-3000 pixels at typical camera distance.improve_contrast in camera config. Lower detection sensitivity near walls where shadows frequently appear.min_frames from 3 to 5 or 10 for objects that must be present longer before alerting (reduces birds, reflections).Official Mobile Access Methods:
http://YOUR_IP:8971 in mobile browser. Works great, fully responsive!Progressive Web App (PWA) - Best Mobile Experience:
โ PWA gives app-like experience without app store, updates automatically
๐ Remember to support the project:
Frigate is free and open source thanks to Blake Blackshear and contributors. If it saves you money or time, please consider donating or subscribing to Frigate+ to ensure continued development!