Frigate is a powerful open-source NVR (Network Video Recorder) designed specifically for real-time object detection with IP cameras. Unlike traditional NVRs that constantly record everything, Frigate uses AI models like TensorFlow or the Coral Edge TPU to detect and log only relevant events—like a person or vehicle entering your driveway. This dramatically reduces storage usage and makes finding important footage much easier. It also integrates seamlessly with Home Assistant, making it a favorite for smart home enthusiasts who want privacy, efficiency, and control.
However, setting up Frigate on Proxmox isn't as straightforward as it might seem. Between GPU/TPU passthroughs, hardware acceleration quirks, and storage handling, it can feel like a maze of compatibility issues and trial-and-error. But don’t worry—I'll guide you step-by-step through the process to get Frigate running smoothly on your Proxmox setup.
Component | Recommended Specs |
---|---|
OS | Debian |
CPU | 2–4 cores (depending on camera resolution) |
RAM | 4-6 GB |
Storage (System) | 16–32 GB |
Storage (Media) | Separate virtual disk or passthrough to ZFS/NFS for recordings |
GPU | Optional: iGPU (Intel QuickSync) |
Network | VirtIO NIC, static or DHCP |
We will use a LXC Container for this setup because then it will be more stable and have better compatibility with the Edge TPU-Sticks.
This Tutorial is not showing how to add a TPU-Stick but rather will show the minimal setup. If you want to use a google Coral Stick follow this tutorial and click here to get a second documentation on how to integrate the coral stick into an existing setup.
To install a Debian LXC Template in Proxmox, navigate to your desired node and select a storage location where you'd like to store the CT Template. CLick CT Templates and choose Debian. Then create a LXC Container with the debian image. It is important to make the container privileged.
run
apt-get update && apt-get upgrade -y && apt autoremove -y && apt-get install -y curl tree net-tools
to update your system and install some dependencies.
After that you can install docker with:
curl -fsSL https://get.docker.com | sudo sh
Using the Proxmox shell window can be inconvenient, especially when it comes to copy-paste actions. To make remote management easier, it's a good idea to enable SSH access on your container
Follow these steps to enable SSH login:
sudo nano /etc/ssh/sshd_config
PermitRootLogin yes
Ctrl + X
, then confirm with Y
and Enter
.service sshd restart
Now you can connect to your container from any terminal using:
ssh <username>@<LXC-IP>
If you're using the root account directly, replace <username>
with root
. You'll be prompted for the password you set during installation.
To make your live easier run:
sudo su
After that you will not encounter any access denied problems even if you run the following commands without sudo.
To best way to install frigate is with docker compose. You dont need to install it seperatly because it is already part of docker which was downaloded during the server installation.
But you need to install ffmpeg which is required to process the video files. To do so type:
apt install ffmpeg -y
For this setup I will use the paths below. You can change these if you want to but then you also need to change these in the docker compose file.
To create the mentioned paths run:
mkdir -p ~/frigate/config
mkdir -p /mnt/frigate/media
The first one saves your config files for frigate and the second one saves all the media files which frigate saves and proceeds.
Run the following command to open the nano editor to save the the docker compose file:
nano ~/frigate/docker-compose.yml
In here paste the follwoing code:
services:
frigate:
container_name: frigate
privileged: true
restart: unless-stopped
image: ghcr.io/blakeblackshear/frigate:stable
shm_size: "512mb"
volumes:
- /etc/localtime:/etc/localtime:ro
- ./config:/config
- /mnt/frigate/media:/media/frigate
ports:
- "5000:5000" # http for access to the web ui
- "1935:1935" # RTMP for camera streams from frigate (need to be enabled in the frigate config as well)
environment:
FRIGATE_RTSP_PASSWORD: "a-pasword!"
Feel free to change things so it fits your situation the best.
Hint: This will not enable you to use the coral stick or any gpu. This setup is for cpu processing only.
Before you can start up the container you need to make your own config file for frigate to work properly.
Create the file with the following command:
nano ~/frigate/config/config.yml
In here you need to write a config file. Below is an example for an minimal setup file for one camera which transmitts its stream via rtsp.
mqtt:
enabled: false
cameras:
cam1:
ffmpeg:
inputs:
- path: rtsp://user:pass@your-camera-ip:554/path
roles:
- detect
global_args: -analyzeduration 10000000 -probesize 10000000
detect:
enabled: true
You need to replace your credentials for the camera and maybe need to changer the port, altough 554 is the default port for this protocol. You also need to know the path the camera is streaming on. This strongly differs from model to model. You need to look it up on the internet or in the manual of your product.
For the most reolink cameras the stream is available on:
/h264Preview_01_main → Main stream (highest resolution)
/h264Preview_01_sub → Substream (lower resolution, more perfomant and better for detect)
After all that setup we can finally run frigate!
To do that type:
docker compose up -d
You need to be in the same directory as your compose file.
Wait a few seconds and the run the command below to see the logs of Frigate
docker logs -f frigate
If everything looks fine try to open frigate on VM-IP:5000 in your browser and there you go!
Do no forget to make a backup after everything works fine.
Most likely there will be some errors you will encounter if you start it for the first time. Here are a few things you can watch out for while trouble shooting:
/path
in the config. Maybe you need to try another one.analyzeduration
and probesize
in the config file.ffmpeg -analyzeduration 15000000 -probesize 15000000 -rtsp_transport tcp -i rtsp://<user>:<password>@<ip>/path -f null -
Warnings like Application provided invalid, non monotonically increasing dts to muxer in stream 0: 6 >= X
can be safely ignored. They do not really effect anything and is normal for many cameras especially for the cheaper ones.