В этой статье мы с вами рассмотрим продвинутую систему видеонаблюдения Frigate NVR на базе Docker решения, которое можно развернуть практически на любом железе.
Я в качестве тестового стенда использую виртуальную машину Ubuntu 24.04LTS на гипервизоре Proxmox.
Содержание статьи
- Возможности решения
- Системные требования
- Подготовка системы
- Установка Docker-Compose
- Создание локальных папок под конфиги и видео архив
- Создание конфигурационного yaml файла
- Запуск Frigate
- Подключение камер
- Режимы записи видео
- Заключение
Возможности решения
- Тесная интеграция с Home Assistant через специальный компонент.
- Разработан для минимизации использования ресурсов и максимизации производительности за счет поиска объектов только тогда и там, где это необходимо.
- Активно использует многопроцессорность с упором на обработку в реальном времени, а не на обработку каждого кадра.
- Использует обнаружение движения с очень низкой высотой над головой, чтобы определить, где запускать обнаружение объекта.
- Обнаружение объектов с помощью TensorFlow выполняется в отдельных процессах для максимального FPS.
- Общается через MQTT для легкой интеграции в другие системы.
- Запись с сохранением по обнаруженным объектам
- Повторная потоковая передача через RTSP для уменьшения количества подключений к вашей камере.
- Динамическое комбинированное представление всех отслеживаемых камер.
Системные требования
Минимальные системные требования следующие:
- Процессор: от 2-х ядер 2 ГГц
- Оперативная память: от 4 ГБ
- Дисковая подсистема: SATA диски 5400rpm желательно WD фиолетовые, достаточно живучие.
Потребляемые ресурсы в режиме простоя:
Подготовка системы
Повышаем наши права в системе:
sudo -s
Настройка сети:
nano /etc/netplan/50-cloud-init.yaml
network:
ethernets:
ens18:
dhcp4: false
addresses:
- 172.30.200.250/16
routes:
- to: default
via: 172.30.200.254
nameservers:
addresses: [172.30.200.201, 172.30.200.202]
version: 2
Сохранить и закрыть:
CTRL+O, CTRL+X
Применяем настройки сети:
netlan apply
Обновляем систему:
apt update -y && apt upgrade -y
Устанавливаем имя нашему серверу:
hostnamectl set-hostname frigate
Устанавливаем временную зону:
timedatectl set-timezone Europe/Moscow
Устанавливаем службу синхронизации времени:
apt install chrony -y
Добавляем службу в автозагрузку:
systemctl enable chrony
Перезагружаем систему:
reboot
Установка Docker
Добавим GPG key от репозитория Docker:
Устанавливаем права на директорию:
install -m 0755 -d /etc/apt/keyrings
Скачиваем ключ репозитория:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
Меняем права на файл ключа репозитория:
chmod a+r /etc/apt/keyrings/docker.asc
Добавим репозиторий Docker:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
Обновим сведения о пакетах в репозиториях:
apt update
Устанавливаем Docker:
apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
Проверяем статус службы Docker:
systemctl status docker
Создание локальных папок под конфиги и видео архив
Создаём папку под наш проект:
mkdir -p /Docker/Frigate
Создаём подпапки под видео архив и конфигурационные файлы Frigate:
mkdir -p /Docker/Frigate/{storage,config}
Создание конфигурационного yaml файла
Перемещаемся в каталог с нашим проектом:
cd /Docker_Frigate
Создаем конфигурационный файл:
nano docker-compose.yml
version: "3.9"
services:
frigate:
container_name: frigate
privileged: true
restart: unless-stopped
image: ghcr.io/blakeblackshear/frigate:stable
shm_size: "64mb"
volumes:
- /etc/localtime:/etc/localtime:ro
- /Docker/Frigate/config:/config
- /Docker/Frigate/storage:/media/frigate
- type: tmpfs
target: /tmp/cache
tmpfs:
size: 1000000000
ports:
- "8971:8971" # Доступ к web панели с авторизацией
- "5000:5000" # Расширенный доступ без авторизации.
- "8554:8554" # RTSP feeds
- "8555:8555/tcp" # WebRTC over tcp
- "8555:8555/udp" # WebRTC over udp
environment:
FRIGATE_RTSP_PASSWORD: "password"
Сохраняем и выходим из редактора:
CTRL+O, CTRL+X
Ниже описываю директории Frigate и что в них хранится:
- /media/frigate/clips: - используется для хранения снимков.
- /media/frigate/recordings: - Хранилище видео архива.
- /media/frigate/frigate.db: - База данных sqlite.
- /tmp/cache: - хранится промежуточные фрагменты видео перед кодировкой, после перемещаются в видео архив.
- /dev/shm: системная папка для декодирования кадров.
- /config/config.yml: - Месторасположение главного конфигурационного файла.
Порты
Запуск Frigate
Развернем и запустим контейнер в фоновом режиме:
docker compose up -d
Видим сообщение, что контейнер запущен
Проверяем статус контейнера вручную:
docker compose ps
Проверяем доступность web панели управления:
https://ip_address:5000
Первым делом идем в настройки и создаем пароль пользователю admin:
Возвращаемся в консоль сервера и правим docker-compose.yml:
nano docker-compose.yml
Комментируем 5000 порт, должно быть так:
version: "3.9"
services:
frigate:
container_name: frigate
privileged: true # this may not be necessary for all setups
restart: unless-stopped
image: ghcr.io/blakeblackshear/frigate:stable
shm_size: "64mb"
volumes:
- /etc/localtime:/etc/localtime:ro
- /Docker_Frigate/config:/config
- /Docker_Frigate/storage:/media/frigate
- type: tmpfs
target: /tmp/cache
tmpfs:
size: 1000000000
ports:
- "8971:8971" # Доступ к web панели с авторизацией
#- "5000:5000" # Расширенный доступ без авторизации.
- "8554:8554" # RTSP feeds
- "8555:8555/tcp" # WebRTC over tcp
- "8555:8555/udp" # WebRTC over udp
environment:
FRIGATE_RTSP_PASSWORD: "password"
Сохраняем и выходим из редактора:
CTRL+O, CTRL+X
Пересоздадим контейнер:
docker compose up -d
Открываем браузер и обращаемся теперь по порту 8971:
https://ip_address:8971/login
Теперь можно добавлять камеры и настраивать запись.
Подключение камер
Настройка подключения камер настраивается в файле config.yaml:
1-й способ в консоли в помощью редактора nano
2-й способ в web панели выбираем пункт Configuration editor
Демонстрирую на примере одной камеры:
nano /Docker_Frigate/config/config.yaml
mqtt: #Брокер соединений, его мы использовать не будем
enabled: false
cameras: #В этом блоке добавляются камеры
camera_1: # название первой камеры
enabled: true
ffmpeg:
inputs:
- path: rtsp://video:password@ip_address:554/stream?mode=real&idc=1&ids=1 # rtsp 1-й поток нашей камеры
roles: # здесь мы добавляем роли, детекцию и запись
- detect # Детекция
version: 0.14
Сохраняем и выходим из редактора:
CTRL+O, CTRL+X
Перезапускаем Frigate:
Дожидаемся запуска и вуаля:
Режимы записи видео
В основном используются 3 варианта конфигурации записи видео:
- Самый затратный по объему, когда ведется непрерывная запись видео например в течении недели, а по истечении недели и до промежутка 3-х месяцев нам нужны те фрагменты событий. Пример такого конфига:
record:
enabled: True
retain:
days: 7 # Цикл записи 7 дней
mode: all # тип записи - непрерывный
events:
retain:
default: 90 # Период хранения видео по событиям
mode: motion # тип записи - по движению
- Оптимальный по объему, запись видео происходит при обнаружении движения и хранится в течении 7 дней, а в промежутке от 7 до 90 дней хранятся видео записанные по событию. Пример такого конфига:
record:
enabled: True
retain:
days: 7
mode: motion
events:
retain:
default: 90
mode: motion
- Минимальный по объему, запись видео происходит только по событию:
record:
enabled: True
retain:
days: 0
mode: all
events:
retain:
default: 30
mode: motion
Мой конфигурационный файл для 4-камер:
nano /Docker_Frigate/config/config.yaml
mqtt:
enabled: false
snapshots:
enabled: True
retain:
default: 30
cameras:
camera_1:
ffmpeg:
inputs:
- path: rtsp://video:password@ip_address:554/stream?mode=real&idc=1&ids=1
roles:
- detect
- record
record:
enabled: true
retain:
days: 30
mode: motion
zones:
work:
coordinates: 0,0.065,0.996,0.071,0.999,0.996,0,0.989
loitering_time: 0
review:
alerts:
required_zones: work
detections:
required_zones: work
camera_2:
ffmpeg:
inputs:
- path: rtsp://video:password@ip_address:554/stream?mode=real&idc=1&ids=1
roles:
- detect
- record
record:
enabled: true
retain:
days: 30
mode: motion
zones:
work:
coordinates: 0,0.069,1,0.067,0.999,0.996,0.002,0.998
loitering_time: 0
review:
alerts:
required_zones: work
detections:
required_zones: work
camera_3:
ffmpeg:
inputs:
- path: rtsp://video:password@ip_address:554/stream?mode=real&idc=1&ids=1
roles:
- detect
- record
record:
enabled: true
retain:
days: 30
mode: motion
zones:
work:
coordinates: 0,0.088,0.998,0.072,1,1,0,1
loitering_time: 0
inertia: 3
review:
alerts:
required_zones: work
detections:
required_zones: work
camera_4:
ffmpeg:
inputs:
- path: rtsp://video:password@ip_address:554/stream?mode=real&idc=1&ids=1
roles:
- detect
- record
record:
enabled: true
retain:
days: 30
mode: motion
zones:
work:
coordinates: 0,0.095,1,0.064,0.999,0.998,0.987,0.998,0.002,1
loitering_time: 0
review:
alerts:
required_zones: work
detections:
required_zones: work
version: 0.14
Заключение
Мне понравилось решение, хоть и не дотягивает до enterprise уровня, но для себя беру его на заметку, чего и вам желаю.