Добавить в корзинуПозвонить
Найти в Дзене
Тюнинг Админа

Видеонаблюдение на Ubuntu 24.04LTS + Frigate NVR

В этой статье мы с вами рассмотрим продвинутую систему видеонаблюдения Frigate NVR на базе Docker решения, которое можно развернуть практически на любом железе. Я в качестве тестового стенда использую виртуальную машину Ubuntu 24.04LTS на гипервизоре Proxmox. Минимальные системные требования следующие: Потребляемые ресурсы в режиме простоя: Повышаем наши права в системе: 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 chro
Оглавление

В этой статье мы с вами рассмотрим продвинутую систему видеонаблюдения Frigate NVR на базе Docker решения, которое можно развернуть практически на любом железе.

Я в качестве тестового стенда использую виртуальную машину Ubuntu 24.04LTS на гипервизоре Proxmox.

Содержание статьи

  • Возможности решения
  • Системные требования
  • Подготовка системы
  • Установка Docker-Compose
  • Создание локальных папок под конфиги и видео архив
  • Создание конфигурационного yaml файла
  • Запуск Frigate
  • Подключение камер
  • Режимы записи видео
  • Заключение

Возможности решения

  • Тесная интеграция с Home Assistant через специальный компонент.
  • Разработан для минимизации использования ресурсов и максимизации производительности за счет поиска объектов только тогда и там, где это необходимо.
  • Активно использует многопроцессорность с упором на обработку в реальном времени, а не на обработку каждого кадра.
  • Использует обнаружение движения с очень низкой высотой над головой, чтобы определить, где запускать обнаружение объекта.
  • Обнаружение объектов с помощью TensorFlow выполняется в отдельных процессах для максимального FPS.
  • Общается через MQTT для легкой интеграции в другие системы.
  • Запись с сохранением по обнаруженным объектам
  • Повторная потоковая передача через RTSP для уменьшения количества подключений к вашей камере.
  • Динамическое комбинированное представление всех отслеживаемых камер.

Системные требования

Минимальные системные требования следующие:

  • Процессор: от 2-х ядер 2 ГГц
  • Оперативная память: от 4 ГБ
  • Дисковая подсистема: SATA диски 5400rpm желательно WD фиолетовые, достаточно живучие.

Потребляемые ресурсы в режиме простоя:

-2

Подготовка системы

Повышаем наши права в системе:

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

-3

Создание локальных папок под конфиги и видео архив

Создаём папку под наш проект:

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: - Месторасположение главного конфигурационного файла.

Порты

-4

Запуск Frigate

Развернем и запустим контейнер в фоновом режиме:

docker compose up -d

-5

Видим сообщение, что контейнер запущен

-6

Проверяем статус контейнера вручную:

docker compose ps

-7

Проверяем доступность web панели управления:

https://ip_address:5000

-8

Первым делом идем в настройки и создаем пароль пользователю admin:

-9
-10
-11

Возвращаемся в консоль сервера и правим 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

-12
-13

Теперь можно добавлять камеры и настраивать запись.

Подключение камер

Настройка подключения камер настраивается в файле 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:

-14

Дожидаемся запуска и вуаля:

-15

Режимы записи видео

В основном используются 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 уровня, но для себя беру его на заметку, чего и вам желаю.