Архитектура
Из чего состоит система, кто с кем общается, какие порты нужны и что произойдёт при отказе каждого компонента.
Система состоит из двух самостоятельных программ. Они устанавливаются как два независимых сервиса systemd и могут работать как на одном сервере, так и на разных — это рекомендуемый вариант.
Plane — контрол-плейн#
Программа hastreamer-plane. Это «мозг» системы: она не передаёт видео, а управляет всем
остальным.
- Веб-интерфейс администратора и оператора, REST API, страница плеера.
- База данных PostgreSQL: организации, пользователи и права, камеры, ноды, события, аудит.
- Управление нодами (Fleet): хранит желаемую конфигурацию каждой ноды и приводит ноду к ней.
- Выдача прав на видео: подписывает токены доступа, ноды проверяют их по открытому ключу.
- События: системные (нода недоступна, камера offline), приём событий от камер по ONVIF.
- Работа с камерами по ONVIF: поиск в сети, чтение профилей, PTZ-управление.
Обслуживает один сервер. Резервируется на уровне виртуализации или снимками БД (см. Резервное копирование).
Node — стриминговая нода#
Программа hastreamer-cctv. Это «мышцы»: весь тяжёлый трафик проходит через неё.
- Забирает видео с камер (RTSP, в том числе через туннель для камер за NAT).
- Раздаёт зрителям: HLS, MSE-WS (низкая задержка), RTSP, кадры-превью.
- Пишет архив на локальные диски, при необходимости выгружает в S3.
- Отдаёт архив на воспроизведение и экспорт фрагментов.
- Проверяет права доступа зрителя самостоятельно — по ключам, полученным от Plane.
Нод может быть много. Камеры распределяются между ними; каждая камера в каждый момент принадлежит одной ноде. Нода лицензируется (см. Лицензирование).
Браузер получает видео напрямую с ноды, а не через контрол-плейн. Это главное архитектурное решение: Plane не становится узким местом, его канал и процессор не зависят от числа зрителей. Поэтому нода должна быть доступна браузеру по сети и иметь собственный TLS-сертификат — см. TLS и сертификаты.
Как Plane управляет нодой#
- Администратор создаёт ноду в Plane и получает файл
node.conf— в нём адрес Plane, идентификатор ноды и открытый ключ Plane. - Нода запускается с этим файлом и начинает отвечать на команды Plane. Команды подписаны закрытым ключом Plane — подделать их нельзя.
- Plane периодически опрашивает ноду: собирает телеметрию (потоки, сессии, диски, лицензия) и приводит конфигурацию ноды к желаемой — добавляет и убирает камеры, хранилища, права.
- В
node.confпоявляется секция# >>> MANAGED BY cctv-plane— её содержимое полностью принадлежит Plane и перезаписывается при каждой синхронизации.
| Периодичность | Что происходит |
|---|---|
| ~5 секунд | Опрос телеметрии: живость камер, счётчики, состояние дисков и лицензии |
| ~60 секунд | Сверка конфигурации (anti-entropy): нода приводится к желаемому состоянию |
| немедленно | Любое изменение в админке рассылается нодам сразу, не дожидаясь таймера |
Что переживает отказ#
| Отказал компонент | Что продолжает работать | Что перестаёт |
|---|---|---|
| Plane | Видео и запись архива на нодах не прерываются | Вход в админку, выдача новых прав, события, изменение настроек |
| Node | Остальные ноды и их камеры | Видео, архив и запись камер только этой ноды |
| PostgreSQL | Ноды продолжают вещать и писать | Plane не работает полностью |
| Сеть до камеры | Всё остальное | Эта камера: видео нет, в архиве — пропуск, откроется событие |
Ноды переживают перезагрузку Plane без потери видео и записи. Обновлять Plane можно в рабочее время; обновление ноды — это перерыв в видео и записи её камер на время перезапуска (секунды).
Порты#
Полный список с направлениями — в разделе Порты и сеть. Кратко:
| Кто → кому | Порт | Назначение |
|---|---|---|
| Браузер → Plane | 443/TCP | Админка, API, страница плеера |
| Браузер → Node | 443/TCP (или 8090) | Видео: HLS, MSE-WS, архив, превью |
| Plane → Node | 80 или 443/TCP | Управление нодой |
| Node → Plane | 443/TCP | Ключи проверки прав, отзывы, служебные потоки |
| Node → Камера | 554/TCP | Приём RTSP-видео |
| Plane → Камера | 80 / 8000 / 554 | ONVIF: поиск, профили, PTZ, события |
| Plane → PostgreSQL | 5432/TCP | База данных |
| Мир → Plane/Node | 80/TCP | Только для выпуска сертификатов Let's Encrypt |
Масштабирование#
- По камерам — добавляйте ноды и распределяйте камеры между ними. Плейн один.
- По зрителям — зрители нагружают ноду, на которой лежит камера; нагрузка на Plane почти не растёт.
- По архиву — диски добавляются в ноду как отдельные хранилища; глубина архива задаётся на камере, а вытеснение — на хранилище.
Ориентиры по железу под конкретное число камер — в разделе Требования и подбор оборудования.