how to set up Frigate NVR in proxmox including coral.ai
why
If you see a need to save security camera video the Frigate NVR app will justify your having a ‘home server’. Frigate records, finds and plays the video whenever there’s motion in front of a camera. I use this flexibly to check on bird and pet feeding, to see if the post arrived or if the gutter copes with the rain. A nearby air show flies over us with a mix of interesting and annoying planes that can be worth catching on video.
Frigate can distinguish between specific objects so you can set it to respond to people and cars or ignore birds and cats and dogs as you wish. This requires a lot of processing power such that if you’ve more than one or two cameras you’ll want to offload that effort to a Google coral.ai processor. The coral.ai comes in USB/PCI/M2 versions which are equally fabulous at allowing Frigate to run on a low power computer.
For a first attempt I’d recommend using an old PC or laptop. Later you can move to modern, less power hungry hardware based on an Intel N95 or N355 CPU. (For the record my old system used £12/month of electricity. The new system uses £4 / month).
links to nearby posts about Frigate:
- reasons to have cameras; what Frigate can do; how to set up Frigate on Ubuntu or openmediavault
- how to setup Frigate and get the GPU and Coral working in Proxmox
- how to set up Frigate on Proxmox on an old PC
- example ‘core’ camera setup for Frigate NVR and how to ‘probe’ the stream
- how to start using Proxmox and virtualization
outline: how to put Frigate in proxmox
- install proxmox 8 on any old PC and have >500GB of free space to store your camera ‘feed’ recordings.
- ensure that your security camera can supply a RTSP feed url (in other words rtsp://admin:password@192.168.1.165:554/live/ch1). A ‘cloud camera’ or video doorbell is unlikely to have an accessible RTSP camera feed.
- in proxmox install Docker and portainer in a privileged LXC container. There is a Proxmox Helper script to set up an LXC running Docker with Portainer and I’d start with this.
FRIGATE: create a Docker container running Frigate
- The thing I did (2025) was to install a LXC container with debian linux 12 bookworm and Docker. You do not want to make a Virtual Machine because this would be a ‘full fat’ version needing different instructions and tweaks to those that follow. You’ll find an install script to do an LXC with Docker here.
- when the script runs choose ‘Advanced’.
- choose Debian linux 12 bookworm
- choose 115 for the container ID – it helps me to match it to my IP address 192.168.1.115
- specify the password for root
- say yes to SSH access
- specify an IP address on your home network eg 192.168.1.115/24.
- accept the option to install Portainer.
- In proxmox, run your Docker LXC and immediately login to portainer via the web browser on your PC. The url will be the one you specified plus a 9443 port number. This will be like https://192.168.1.115:9443/ or https://192.168.1.115:9000/. You can only set up portainer’s login details if you access it within a few minutes of starting the LXC container. When you’re ‘in’ a freshly made portainer increase the session length (in authentication); add the IP (eg 192.168.1.115) as the public IP address to local (in environments). Take a look at Containers; Application templates and finally Stacks.
- in proxmox, login to your Docker LXC console as root. Before you install Frigate as a stack in portainer you really must create a config.yml file in this console. The command line will be nano /home/frigate/config.yml See the Frigate docs for an idea of what goes in config.yml – you just need a few lines for now (eg detectors: cpu1: type: cpu). Find the youtube instructions to install Frigate as a stack in portainer.
FRIGATE: passthrough the coral.ai USB to the container eg 115
- if you have a coral.ai processor you need to configure the container to connect with the version that you have. The instructions that I used for my USB coral are on this page. (The instructions for connecting a coral PCI card to this LXC container are very different to those). My 115.conf in the proxmox shell is as follows. If you have issues don’t confuse the solutions for Coral USB / M2 / PCIe.
Which USB bus am I using? Go to the console for the docker/frigate LXC:
apt-get install usbutils
lsusb # this lists the USB devices
ls -la /dev/bus/usb/002/ # this is meant to tell which cgroup has the coral i.e cgroup2.devices.allow (proxmox 8) or cgroup.devices.allow
IN THE PROMOX SHELL enter:
root# nano /etc/pve/lxc/115.conf
arch: amd64
cores: 4
features: fuse=1,nesting=1
hostname: frigate-docker
memory: 4096
mp0: /mnt/nvme0n1p1,mp=/mnt/nvme0n1p1
net0: name=eth0,bridge=vmbr1,gw=192.168.1.1,hwaddr=BC:24:11:17:67:6B,ip=192.168.1.115/24,type=veth
onboot: 1
ostype: debian
rootfs: local-lvm:vm-140-disk-0,size=24G
swap: 512
lxc.cgroup2.devices.allow: a
lxc.cap.drop:
lxc.cgroup2.devices.allow: c 226:0 rwm
lxc.cgroup2.devices.allow: c 226:128 rwm
lxc.cgroup2.devices.allow: c 29:0 rwm
lxc.cgroup2.devices.allow: c 188:* rwm
add a mount point to store FRIGATE recordings outside the container
- In short you need to mkdir a folder in mnt in the proxmox shell and mount your hard disk partition device in this folder. Finally a pct set command in the proxmox shell also copies that mount action into the LXC container. You’ll now be able to see the mounted drive and its files in both the proxmox shell and the container.
IN THE PROMOX SHELL add the mount point to your container ID - mine is 115
pct set 115 -mp0 /mnt/nvme0n1p1,mp=/mnt/nvme0n1p1
FRIGATE example compose.yaml for portainer stack
version: "3.8"
services:
frigate:
container_name: frigate
privileged: true #may not be necessary
restart: unless-stopped
image: ghcr.io/blakeblackshear/frigate:stable
shm_size: "128mb" #based on camera calculation
cap_add:
- CAP_PERFMON #may not be necessary if privileged
devices:
- /dev/bus/usb:/dev/bus/usb # USB Coral
- /dev/dri/renderD128:/dev/dri/renderD128 # hwaccel
volumes:
- /etc/localtime:/etc/localtime:ro
- /home/config/config.yml:/config/config.yml
- /mnt/nvme0n1p1/frigate115:/media/frigate
- /home/config:/config
- type: tmpfs
target: /tmp/cache
tmpfs:
size: 1000000000
ports:
- 5000:5000
- 8554:8554
- 8555:8555/tcp
- 8555:8555/udp
FRIGATE example config.yml
# yaml-language-server: $schema=http://192.168.1.115:5000/api/config/schema
version: 0.14
database:
path: /media/frigate/frigate.db
mqtt:
enabled: false
ffmpeg:
hwaccel_args: preset-vaapi
detectors:
coral:
type: edgetpu
device: usb
model:
width: 320
height: 320
auth:
enabled: False
birdseye:
enabled: false
objects:
track:
- person
- cat
- car
- dog
- sheep
- mouse
detect:
enabled: true
motion:
enabled: true
record:
enabled: True
retain:
days: 2
mode: all
events:
pre_capture: 1
post_capture: 5
retain:
default: 30
mode: motion
objects:
- person
- cat
- car
- dog
- sheep
- mouse
- bicycle
- motorcycle
timestamp_style:
format: '%DDD %d/%m %H:%M:%S'
color:
red: 255
green: 255
blue: 10
go2rtc:
streams:
# --------------------------------
frontbees155reo_sub:
- rtsp://USER:PASSWORD@192.168.1.155:554/h264Preview_01_sub # <--LOWRES stream 1280x720
frontbees155reo:
- rtsp://USER:PASSWORD@192.168.1.155:554/h264Preview_01_main # <--HIGHRES stream 1920x1080
# --------------------------------
cameras:
frontbees155reo: # this config is for starters not optimal
ffmpeg:
inputs:
- path: rtsp://127.0.0.1:8554/frontbees155reo # <-- ip of frigate go2rtc
input_args: preset-rtsp-restream
roles:
- detect
- record
detect:
width: 1920 # camera resolution
height: 1080 # camera resolution
fps: 4
objects:
track:
- person
- car
- dog