Introduction
If you've ever looked at a $10-a-month cloud camera subscription and thought "I have a whole server sitting in my closet, why am I paying for this," you're exactly who this tutorial is for. Frigate is a free, open-source network video recorder that watches your camera feeds locally and uses AI to tell the difference between "a person walked up to the door" and "a moth flew past the lens at 2 a.m." No cloud, no subscription, no company watching your driveway footage.
This guide walks you through installing Frigate inside an LXC container on Proxmox VE, using the community helper script that most of the homelab world already relies on. You don't need to know Docker, and you don't need to have built an LXC container before. By the end you'll have a working Frigate instance detecting people, cars, and animals on your existing cameras.
What You Will Learn
- What Frigate actually does and why it needs more resources than a typical LXC app
- How to create a Frigate container using the community-scripts installer
- How to find your container's IP address and log into the web interface
- How to add your first camera and confirm detection is working
- What the common install and runtime errors mean, and how to fix them
What Is This Feature?
Frigate is a video recording and analysis tool built specifically for home security cameras. It pulls a live video stream from each of your cameras, feeds it through an object detection model, and only bothers you (or starts recording an "event") when it sees something worth flagging — a person, a car, a package, a dog. Everything runs on hardware you own.
To get there, you need a couple of building blocks explained first. An LXC container is a lightweight, Linux-only virtual environment. Unlike a full VM, it shares the host's kernel instead of emulating its own hardware, so it starts in about two seconds and uses a fraction of the RAM and disk a VM would need for the same job. That makes it a great fit for a single-purpose app like Frigate.
Inside that container, Frigate itself runs as a Docker application. Docker packages an app together with everything it needs to run — libraries, dependencies, the works — into one self-contained unit called a container image, so it behaves the same no matter what's installed on the host underneath it. The community script you'll use in this guide installs Docker inside your new LXC container automatically and then pulls the Frigate image, so you never have to type a single Docker command yourself.
Last piece: the "detector." Frigate needs something to actually run the AI object-detection model — your CPU, a dedicated USB accelerator called a Coral TPU, or an Intel integrated GPU through a project called OpenVINO. A detector is just the piece of hardware doing the math for "is this a person." CPU detection works fine for one or two cameras; anything more and you'll want a Coral stick or an iGPU.
Why Would You Use It?
The honest answer: because you're tired of camera apps phoning home. Cloud-based systems like Ring or Nest work fine, but your footage lives on someone else's server, and the smart features usually sit behind a monthly fee. Frigate flips that. Detection runs locally, footage stays on your storage, and there's no subscription tier gating "person detection" behind a paywall.
It also plugs directly into Home Assistant if you're already running that for smart home automation — a camera event in Frigate can trigger a light, a notification, or an automation instantly, with no round trip to the internet. And because it's just a container, you can throw more or less hardware at it depending on how many cameras you're running, without committing to a proprietary NVR box.
One honest caveat: Frigate is not a "set it and forget it" five-minute install the way something like Uptime Kuma is. It's more resource-hungry, and getting detection tuned well (so it isn't recording every passing cloud shadow) takes a bit of trial and error. Budget an afternoon, not ten minutes.
Prerequisites
Before you start, make sure you have:
- A working Proxmox VE host — this guide was written against Proxmox VE 9.2, but it works fine on any current 8.x or 9.x install
- At least one IP camera that streams RTSP (most modern PoE and Wi-Fi security cameras do; check the camera's manual for its RTSP URL)
- Free CPU headroom — 4 cores and 4 GB of RAM as a starting point for one or two cameras on CPU detection; more if you're adding a Coral TPU or several cameras
- At least 20 GB of free storage for the container, more if you plan to store several days of recordings
- Root or sudo access to the Proxmox VE shell (either through the web GUI's Shell button on the node, or over SSH)
- Basic comfort typing commands into a terminal — you won't need to write any scripts, just run one
Step-by-Step Tutorial
Step 1: Open the Proxmox VE Shell
Log into the Proxmox VE web interface, click your node's name in the left-hand tree (usually named something like pve), then click >_ Shell near the top right. That drops you into a root terminal on the host itself — this is where the container gets created from.
Step 2: Run the Community Script
Paste this command into the shell and press Enter:
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/frigate.sh)"
This pulls a maintained installer script from the community-scripts project (the same group behind most of the one-line LXC installers you'll see recommended on homelab forums) and runs it. It creates a new LXC container, installs Docker inside it, and deploys Frigate — all without you touching a Dockerfile.
Step 3: Walk Through the Installer Prompts
The script asks a handful of questions: whether to use default settings or customize them, how many CPU cores and how much RAM to allocate, and how much disk space to give the container. For a first camera or two, the defaults are a reasonable starting point. If you already know you'll be running four or more cameras, bump the cores up front — resizing later means editing the container's config rather than a quick slider.
It'll also ask whether the container should be privileged or unprivileged. An unprivileged container is more locked-down and is the safer default; only switch to privileged if you run into hardware access issues later (for example, passing through a Coral USB accelerator).
Installation takes roughly 5 to 10 minutes on a typical setup, most of that spent pulling the Frigate Docker image.
Step 4: Find Your Container's IP Address
Once the script finishes, it prints the container's IP address directly in the shell output. If you missed it, go to the Proxmox web UI, click on the new container in the left sidebar (it'll be named something like frigate), and check the Summary tab — the IP is listed under network info. You can also run pct list from the host shell to see every container's ID, then pct exec <ID> -- ip a to see its network details directly.
Step 5: Log Into the Frigate Web UI
Open a browser and go to https://<container-ip>:8971. That's the authenticated interface — Frigate also runs an internal, unauthenticated UI on port 5000, but that one's meant for local integrations (like Home Assistant) rather than for you to browse to directly, so stick to 8971. The first time you load it, Frigate walks you through creating an admin username and password.
Step 6: Add Your First Camera
Frigate is configured through a YAML file rather than a form-based wizard, which trips up a lot of first-timers coming from consumer NVR apps. From the web UI, open Settings > Configuration Editor and add a camera block with your RTSP URL, something like:
cameras:
front_door:
ffmpeg:
inputs:
- path: rtsp://username:password@192.168.1.50:554/stream1
roles:
- detect
detect:
width: 1280
height: 720
fps: 5
Save the config and restart Frigate from the same settings page. Within a few seconds you should see a live thumbnail for that camera on the main dashboard.
Step 7: Verify Detection Is Working
Walk in front of the camera, then check the Events tab in the web UI. You should see a new event appear with a "person" label and a bounding box drawn around you in the saved clip. If nothing shows up after a minute or two, the detector isn't running — jump to the Troubleshooting section below.
Commands Explained
A few commands showed up above, and it's worth knowing what each one is actually doing rather than just copy-pasting blind.
| Command | What it does |
|---|---|
bash -c "$(curl -fsSL <url>)" | Downloads the installer script from GitHub and runs it immediately, without saving a copy to disk. The -fsSL flags make curl fail silently on errors, suppress the progress bar, and follow redirects. |
pct list | Lists every LXC container on the host, along with its ID, status (running or stopped), and name. Run this from the Proxmox shell, not inside a container. |
pct exec <ID> -- ip a | Runs a command inside a specific container from the host, without needing to log into it first. Here it's used to print the container's network interfaces and IP addresses. |
pct enter <ID> | Drops you directly into a root shell inside the container — useful if you need to check Docker logs or restart services by hand. |
Common Errors
| Error | Likely cause | Fix |
|---|---|---|
| "Connection refused" when loading port 8971 | The container is still pulling the Docker image, or Frigate hasn't finished starting yet | Wait another minute, then check progress with pct enter <ID> followed by docker ps |
| Camera stream shows a black tile with no image | The RTSP URL, username, or password is wrong, or the camera only allows one active RTSP connection at a time | Test the RTSP URL first in VLC (Media > Open Network Stream) to confirm it works outside Frigate |
| "ffmpeg exited with code 1" in the logs | Usually a malformed camera URL or an unsupported stream codec | Check for typos in the YAML config, and confirm the camera is streaming H.264 rather than H.265, which some detector configs don't handle well |
| Detection never triggers, even with motion in frame | The detector isn't actually running, often because CPU detection is overloaded | Lower the resolution and fps under the camera's detect block, or add a Coral TPU |
Troubleshooting
Most Frigate problems trace back to one of three things: the camera stream, the detector, or resource limits on the container itself.
Start with the stream. If the live view in the Frigate UI is black or frozen, the problem is almost never Frigate — it's the camera. Pull up the exact RTSP URL in VLC on your desktop first. If it doesn't play there, Frigate was never going to show it either.
If the stream works but detection never fires, check CPU usage on the container. Run pct enter <ID> to get inside, then docker stats to watch resource usage live. CPU-only detection maxes out fast — one 1080p camera at full framerate can pin a core by itself. Dropping the detect resolution to 720p and the fps to 5, like in the example config above, usually fixes this without hurting detection accuracy, since Frigate doesn't need full resolution to spot a person-shaped blob.
If the container itself seems sluggish or unresponsive, check whether it ran out of allocated RAM. Frigate's a heavier app than most things you'd run in an LXC container, and the default resource allocation from the installer script is a starting point, not a guarantee. You can bump CPU and RAM after the fact from the container's Hardware tab in the Proxmox UI — no reinstall required.
Best Practices
Give the container its own dedicated storage for recordings rather than sharing the Proxmox host's boot disk. Continuous recording eats disk space fast, and you don't want a full recordings drive to also take down the container's root filesystem.
Set a retention policy early. Frigate lets you configure how long to keep footage per camera, split between detected events and general timeline recording. Most homelab users keep 7 to 14 days — enough to review something after the fact, without needing a multi-terabyte drive.
If you're running more than two or three cameras, seriously consider a Coral USB or PCIe TPU. It's a roughly $60 accelerator that handles object detection off your CPU entirely, and the difference in how much load the host carries is dramatic.
Don't expose port 8971 directly to the internet through port forwarding. If you need remote access, put it behind a VPN like WireGuard or Tailscale instead — camera footage is exactly the kind of thing you don't want indexed by a random internet scanner.
Frequently Asked Questions
Does Frigate work without a Coral TPU?
Yes. CPU-only detection works fine for one or two cameras at modest resolution — you just won't scale much past that without a dedicated accelerator.
Can I run Frigate in a full VM instead of an LXC container?
You can, but there's no real benefit for most homelab setups. The LXC container starts faster, uses less overhead, and the community script handles the Docker setup for you either way.
Do I need Home Assistant to use Frigate?
No, Frigate works standalone with its own web UI. Home Assistant integration is optional and mainly useful if you want camera events to trigger smart home automations.
Why does the container need so much more RAM than a typical LXC app?
Object detection and video decoding are both memory-hungry by nature. A simple app like Uptime Kuma barely touches RAM; Frigate is processing live video streams continuously.
Is my footage safe if the Proxmox host goes down?
Only as safe as your backup setup. Frigate stores recordings on the container's disk, so back up that container the same way you'd back up any other VM or LXC — with vzdump or Proxmox Backup Server.
Conclusion
Getting Frigate running on Proxmox VE isn't a five-minute job, but it's not far off either — the community script handles the tedious Docker setup, which leaves you to focus on the part that actually matters: pointing it at your cameras and tuning detection until it's catching real events instead of shadows. Start with one camera on CPU detection, get comfortable with the config editor, and expand from there. A Coral TPU can wait until you know you need one.