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).

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

Leave a Reply

Your email address will not be published. Required fields are marked *