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, затем добавляйте зоны и остальные камеры. Главное — не экономить на диске, не выставлять интерфейс в интернет и не снимать чужие окна.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте