Frigate — открытый видеорегистратор (NVR), который анализирует RTSP-потоки с камер и выделяет объекты: людей, машины, животных. В отличие от облачных сервисов, видео и детектор остаются в вашей сети, а интеграция с Home Assistant идёт через MQTT. Разберём установку в Docker, настройку детектора, зоны, хранение записей и диагностику ошибок.
Как устроен Frigate
Конвейер состоит из четырёх частей. ffmpeg принимает RTSP и декодирует кадры, детектор ищет объекты, рекордер пишет поток на диск, а go2rtc отдаёт видео в браузер и Home Assistant. Детектор — самое узкое место: он работает не со всеми кадрами, а с несколькими в секунду.
Базовый детектор отвечает на вопрос «есть ли в кадре человек или машина», а не «кто это». В версии 0.16 появилось распознавание лиц и номеров, но это отдельные модели и база, их включают осознанно. Для наблюдения за двором они не обязательны.
Железо и потоки
- Детектор. На CPU один поток 640×360 при 5 кадрах в секунду съедает заметную долю ядра. Для 1–2 камер подойдёт N100, для 4+ лучше Coral USB, PCIe Coral или OpenVINO на встроенной графике Intel.
- Потоки. Субпоток камеры — для детекции (640×360 или 1280×720, 5 fps), основной — для записи. Не кормите детектор 4K-потоком: качество не вырастет, а нагрузка вырастет.
- Кодеки. H.264 лучше совместим с браузерами и аппаратным ускорением. H.265 экономит диск, но чаще ломается в WebRTC и на старых GPU.
- Диск. При 4 Мбит/с одна камера даёт около 1,8 ГБ в час, то есть примерно 43 ГБ в сутки. Две камеры за неделю — около 600 ГБ. Считайте до покупки диска.
Запуск в Docker
services:
frigate:
image: ghcr.io/blakeblackshear/frigate:stable
container_name: frigate
restart: unless-stopped
stop_grace_period: 30s
shm_size: "256mb"
devices:
- /dev/bus/usb:/dev/bus/usb
- /dev/dri:/dev/dri
volumes:
- ./config:/config
- ./media:/media/frigate
- /etc/localtime:/etc/localtime:ro
- type: tmpfs
target: /tmp/cache
tmpfs:
size: 1000000000
ports:
- "8971:8971"
- "127.0.0.1:5000:5000"
- "8554:8554"
- "8555:8555/tcp"
- "8555:8555/udp"
environment:
FRIGATE_RTSP_PASSWORD: "change-me"
FRIGATE_MQTT_PASSWORD: "change-me-too"
Порт 8971 — аутентифицированный веб-интерфейс и API, именно его ставьте за обратный прокси. Порт 5000 внутри контейнера не имеет авторизации: в примере он привязан к localhost для локальных интеграций, наружу его выставлять нельзя. /dev/dri передавайте только при наличии Intel или AMD GPU; для Coral достаточно USB-устройства.
Размер shm зависит от разрешения и числа камер. Для 1280×720 ориентир — около 28 МБ на камеру, но на практике ставят 256–512 МБ с запасом. Если контейнер падает с ошибкой разделяемой памяти, увеличьте значение.
Конфигурация камер и детектора
mqtt:
enabled: true
host: 192.168.1.10
user: frigate
password: "{FRIGATE_MQTT_PASSWORD}"
detectors:
coral:
type: edgetpu
device: usb
cameras:
yard:
ffmpeg:
inputs:
- path: rtsp://127.0.0.1:8554/yard_main
roles: [record]
- path: rtsp://127.0.0.1:8554/yard_sub
roles: [detect]
hwaccel_args: preset-intel-qsv-h264
detect:
enabled: true
width: 1280
height: 720
fps: 5
objects:
track: [person, car, dog]
filters:
person:
min_area: 3000
min_score: 0.6
motion:
mask:
- 0,0,1,0,1,0.08,0,0.08
zones:
driveway:
coordinates: 0.35,0.45,0.95,0.45,0.95,0.95,0.35,0.95
objects: [car, person]
record:
enabled: true
retain:
days: 5
mode: motion
alerts:
retain:
days: 14
snapshots:
enabled: true
retain:
default: 14
review:
alerts:
labels: [person, car]
detections:
labels: [dog]
Здесь yard_main и yard_sub — имена потоков в go2rtc, который описан ниже. Если камера отдаёт один поток, используйте его и для записи, и для детекции, но тогда вырастет нагрузка на декодирование.
Зоны задаются в относительных координатах от 0 до 1: пары x,y по часовой стрелке. Маска движения исключает верхнюю полосу, где часто висит дата и качаются деревья. min_area отсекает мелкие срабатывания, min_score — неуверенные детекции.
record.retain.mode: motion пишет только отрезки с движением, all — непрерывно. Блок alerts хранит события с людьми и машинами дольше, чем общий архив. Такой набор экономит диск и упрощает поиск.
go2rtc и прямая трансляция
go2rtc:
streams:
yard_main:
- rtsp://user:pass@192.168.1.61:554/stream1
yard_sub:
- rtsp://user:pass@192.168.1.61:554/stream2
go2rtc встроен в Frigate и умеет переупаковывать поток без перекодирования. Благодаря этому веб-интерфейс показывает видео с малой задержкой, а камера не получает лишние подключения. Для WebRTC нужен порт 8555 по TCP и UDP; если он закрыт, останется HLS с задержкой в несколько секунд.
Доступ, приватность и безопасность
- Не публикуйте
8971в интернет напрямую. Поставьте reverse proxy с TLS и сильным паролем, а лучше оставьте доступ только через локальную сеть. - Смените заводские пароли камер, отключите P2P и облачные сервисы производителя, задайте отдельный VLAN для устройств.
- Не направляйте камеры на окна соседей, общие подъезды и чужие участки. Маска в интерфейсе не отменяет запись — меняйте ракурс.
- Ограничьте срок хранения: 5–14 дней обычно достаточно. Регулярно проверяйте, кто имеет доступ к архиву.
- MQTT-брокер тоже должен быть с паролем. Не используйте анонимный доступ даже в домашней сети.
Диагностика
curl -s http://127.0.0.1:5000/api/stats | python3 -m json.tool
docker logs -f frigate
df -h /media/frigate
du -sh /media/frigate/recordings
В /api/stats смотрите detection_fps, skipped_fps и загрузку детектора. Если skipped_fps растёт, детектор не успевает: снизьте fps или разрешение субпотока.
Перед настройкой полезно проверить, что контейнер видит ускоритель и камеру. vainfo показывает доступные кодеки Intel или AMD, а dmesg — загрузку драйвера Coral.
lsusb | grep -i -E "google|global unichip"
ls -l /dev/dri
docker compose config --quiet
sudo dmesg | grep -i -E "apex|edgetpu"
- Зелёный или розовый экран. Неверное аппаратное ускорение или несовместимый кодек. Уберите
hwaccel_argsи проверьте сpreset-rtsp-restream. - Детекция не работает. Проверьте, что субпоток действительно H.264 и доступен по указанному URL. В логах ищите
Unable to read frames. - Ложные тревоги. Уменьшите зону, поднимите
min_score, замаскируйте деревья и экран телевизора. - Coral не найден. Подключите к порту USB 3.0, проверьте
lsusbи используйте хаб с внешним питанием: порта USB 2.0 часто не хватает по току. - Записи пропадают. Проверьте retention и свободное место: при заполнении диска Frigate удаляет старые сегменты.
- Время на видео не совпадает. Настройте NTP на камерах: рассинхрон ломает поиск и события.
Итог
Frigate даёт домашнее видеонаблюдение без облака: камеры пишут на свой диск, детектор работает локально, а события приходят в Home Assistant. Начните с одной камеры и субпотока 640×360, проверьте /api/stats, затем добавляйте зоны и остальные камеры. Главное — не экономить на диске, не выставлять интерфейс в интернет и не снимать чужие окна.