selfhosted-apps-docker/frigate/readme.md

6.5 KiB

Frigate

guide-by-example

logo

WORK IN PROGRESS
WORK IN PROGRESS
WORK IN PROGRESS

Purpose & Overview

Managing security cameras - recording, detection, notifications.

Frigate is a software NVR - network video recorder.
Simple, clean web-based interface with possible integration in to home assistant and its app.

Frigate offers powerful AI object detection, by using OpenCV and Tensorflow. In contrast to cameras of old time which just detect movement, Frigate can recognize if object in view is a cat, a car or a human.

This detection is cpu heavy and to ease the load, Google Coral TPU is recommended if planning to run multiple cameras with detection.
Recently OpenVINO has been integrated, which should allow use of igpu of intel 6th+ gen cpus as a detector.

Open source, written in Python and JavaScript.

Files and directory structure

/home/
└── ~/
    └── docker/
        └── frigate/
            ├── 🗁 frigate_storage/
            ├── 🗋 .env
            ├── 🗋 config.yml
            └── 🗋 docker-compose.yml
  • frigate_storage/ - configuration
  • transcodes/ - transcoded video storage
  • .env - a file containing environment variables for docker compose
  • docker-compose.yml - a docker compose file, telling docker how to run the containers

You only need to provide the three files.
The directory is created by docker compose on the first run.

docker-compose

This docker compose is based off the official one except few changes.
Using bind mounts instead of volumes, moved variables to the .env file, commented out privileged mode, increased shm_size,...

Nothing special going on here, of note is use of tmpfs for ram temp storage and shm_size.

docker-compose.yml

services:

  frigate:
    image: ghcr.io/blakeblackshear/frigate:stable
    container_name: frigate
    hostname: frigate
    restart: unless-stopped
    env_file: .env
    # privileged: true
    shm_size: "256mb"
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./config.yml:/config/config.yml
      - ./frigate_storage:/media/frigate
      - type: tmpfs # 1GB of memory
        target: /tmp/cache
        tmpfs:
          size: 1000000000
    ports:
      - "5000:5000" # Web GUI
      - "8554:8554" # RTSP feeds
      - "8555:8555/tcp" # WebRTC over tcp
      - "8555:8555/udp" # WebRTC over udp

networks:
  default:
    name: $DOCKER_MY_NETWORK
    external: true

.env

# GENERAL
DOCKER_MY_NETWORK=caddy_net
TZ=Europe/Bratislava

# FRIGATE
FRIGATE_RTSP_USER: "admin"
FRIGATE_RTSP_PASSWORD: "dontlookatmekameras"

All containers must be on the same network.
Which is named in the .env file.
If one does not exist yet: docker network create caddy_net

Reverse proxy

Caddy is used, details here.

Caddyfile

cam.{$MY_DOMAIN} {
    reverse_proxy frigate:5000
}

Configuration - config.yml

Terminology

  • PoE - power over ethernet, camera is powered by the same cat cable that carries data. You want POE(802.3af) or POE+(802.3at), none of the passive poe by mikrotik or ubiquity.
  • onvif - attempt at industry standard for security cameras, nvr,.. regardless of manufacturer
  • rtsp - a protocol for streams
  • ptz - Pan-Tilt-Zoom allows remote movement of a camera
  • mqtt - messaging protocol to communicate with home assistant

Preparation

Connect camera to your network.

Find url of your camera streams, either by googling your model, or theres a handy windows utility - onvif-device-manager. Unfortunately all official urls seem dead, this worked for me and passed virustotal at the time. There are also comments with some links at its sourceforge page.
Camera discovery of onvif-device-manager is almost instant, if the camera requires credentials, set them in the top left corner.
In live view there should be stream url displayed. Like: "rtsp://10.0.19.171:554/stream1"

Ideally your camera has several streams A primary one in full resolution full frame rate for recording, and then secondary one in much smaller resolution and fps for observing.

First basic config

Example bare config that should shows camera stream once frigate is running.
This one has credentails contained in the url - rtsp://username:password@ip:port/url

mqtt:
  enabled: false
cameras:
  C1-Whatever:
    ffmpeg:
      inputs:
        - path: rtsp://{FRIGATE_RTSP_USER}:{FRIGATE_RTSP_PASSWORD}@10.0.19.171:554/stream1

All that is there is disabled mqtt since no home assistant yet and just single camera stream that pulls credentails from the .env file.


Now to also record main stream and detect on substream.

mqtt:
  enabled: false
detectors:
  default_detector_for_all:
    type: cpu
objects:
  track:
    - person
    - cat
    - dog
cameras:
  K1-Brana:
    ffmpeg:
      inputs:
        - path: rtsp://{FRIGATE_RTSP_USER}:{FRIGATE_RTSP_PASSWORD}@10.0.19.171:554/stream1
          roles:
            - record
        - path: rtsp://{FRIGATE_RTSP_USER}:{FRIGATE_RTSP_PASSWORD}@10.0.19.171:554/stream2
          roles:
            - detect
    detect:
      width: 640
      height: 480
      fps: 5
    snapshots:
      enabled: True
      bounding_box: True
    record:
      enabled: True
      retain:
        days: 1
    motion:
        mask:
          - 0,480,186,480,174,226,173,0,0,0

First run

Specifics of my setup

Troubleshooting

Update

Manual image update:

  • docker-compose pull
  • docker-compose up -d
  • docker image prune

Backup and restore

Backup

Restore