Видеонаблюдение — услуга под ключ
Видеонаблюдение (/admin/video/) — продажа и
обслуживание видеонаблюдения как услуги: от заявки до ежемесячной абонплаты.
Модуль ведёт объекты клиента с камерами, воронку монтажных проектов с
документами, пульт оператора охраны, собственный медиа-сервер и архив записей.
Деньги идут через отдельный лицевой счёт объекта, оборудование — через
склад, сделки — общие с CRM.
Шесть шагов работы с модулем на живых экранах: объекты и камеры, проекты, подписки и оплата.
Как устроен модуль

Ядро — объект наблюдения: адрес клиента, на котором стоят камеры. У объекта свой лицевой счёт, поэтому долг за видео блокирует камеры, но не трогает интернет. Всё остальное навешивается на объект:
flowchart LR A["Клиент"] --> B["Объект наблюдения"] B --> C["Камеры"] B --> D["Оборудование"] B --> E["Подписки"] B --> F["Проект (сделка)"] E --> G["Списания billing_worker"] C --> H["Медиа-сервер go2rtc"] H --> I["Архив MediaMTX"] B --> J["Пульт ЧОПа"]
Объект и проект — разные вещи. Объект живёт постоянно (камеры, подписки, архив), проект — это разовая сделка на монтаж или расширение. У одного объекта может быть несколько проектов: первая очередь, вторая, ремонт после грозы.
Объекты и камеры

Список объектов — /admin/video/objects/. Колонка
«В эфире» показывает, сколько камер реально отдают видео из
общего числа: «3 / 4» зелёным — всё в порядке, «0 / 4» красным — объект
молчит. Если медиа-сервер недоступен, вместо счётчика показывается просто
количество камер — система не выдаёт «ноль в эфире» за факт.
Чипы над таблицей отбирают объекты с подписками, заблокированные и должников. Карточка объекта открывается модалкой: клиент, название, тип (частный дом, СМБ, МКД, госучреждение, охраняемый объект ЧОП, другое), организация-владелец и адрес.
Тот же список объектов клиента доступен из его карточки — вкладка «Видео», там же камеры, оборудование и подписки.
Проекты: воронка и документы

Путь проекта от заявки до абонплаты:
flowchart LR L["Заявка"] --> S["Обследование"] S --> D["Проект / КП"] D --> C["Договор"] C --> M["Монтаж"] M --> P["ПНР"] P --> G["Сдан"] G --> V["На сервисе"] D -. "КП, согласие ПДн" .-> DOC["Документы"] C -. "договор" .-> DOC G -. "акт сдачи-приёмки" .-> DOC V --> B["Ежемесячная абонплата"]
Канбан проектов — /admin/video/projects/. Девять стадий: заявка,
обследование, проект/КП, договор, монтаж, ПНР, сдан, на сервисе, отменён. В
шапке колонки — количество сделок и сумма по стадии.
Проект видеонаблюдения — это та же сделка, что в CRM
(deal_type='video'), просто показанная в своём разрезе. Из канбана
есть переход «В CRM», из карточки сделки — задачи, звонки, теги и история
стадий. Отдельная страница карточки видео-сделки сохранена ради генератора
документов.
С карточки проекта печатаются пять документов: акт обследования,
коммерческое предложение, договор, акт сдачи-приёмки и согласие на обработку
персональных данных (152-ФЗ). Тексты редактируются в едином центре документов
/admin/documents/templates/ — шапка с реквизитами, логотип и
печать берутся из брендинга организации.
Сервисные планы и подписки

Как подписка превращается в деньги:
flowchart LR PL["Сервисный план"] --> SUB["Подписка объекта"] SUB --> UU["Периодическая услуга"] UU --> BW["billing_worker раз в месяц"] BW --> ACC["Видео-счёт объекта"] ACC -- "минус" --> BLK["Блокировка камер"] ACC -- "оплачен" --> OK["Камеры работают"]
Видео-счёт отдельный: долг за видеонаблюдение гасит камеры, но интернет клиента продолжает работать. Обратное поведение включается настройкой «Блокировать ещё и интернет».
/admin/video/plans/ — карточки планов обслуживания: диапазон
камер, цена в месяц, срок хранения архива, SLA реакции, квартальный
health-check и услуга каталога, по которой идёт списание.
Подписка привязывает план к объекту и создаёт периодическую услугу
(system_type=20), которую ежемесячно списывает
billing_worker — с отдельного видео-счёта объекта, без скидок
интернет-лояльности.
Каталог оборудования и склад

/admin/video/models/ — справочник моделей: камеры, регистраторы,
PoE-коммутаторы, ИБП, накопители. У модели есть характеристики (мегапиксели,
PTZ, уличная), цена-ориентир для сметы и ссылка на паспорт — она открывается
иконкой прямо из списка.
Модель связывается с позицией склада. Тогда в каталоге видно фото, закупочную цену и остаток, а в карточке сделки считается экономика проекта: смета оборудования и работ против фактической себестоимости списанного со склада, маржа в рублях и процентах. Пока по сделке ничего не списано, маржа не показывается — иначе она равнялась бы всей сумме КП.
Медиа-сервер go2rtc

Состояния камеры и что с ними делать:
stateDiagram-v2 [*] --> Заведена_в_биллинге Заведена_в_биллинге --> Не_заведена: потока в go2rtc нет Не_заведена --> В_эфире: кнопка «Завести» В_эфире --> Нет_сигнала: источник молчит Нет_сигнала --> В_эфире: связь восстановилась В_эфире --> Выключена: снят флаг «активна» Выключена --> В_эфире: включили обратно
«Не заведена» и «нет сигнала» — разные неисправности. Первая лечится кнопкой в биллинге, вторая — выездом или проверкой канала: поток создан, но камера не отдаёт картинку.
/admin/video/streams/ — все потоки медиа-сервера и их
сопоставление с камерами биллинга. Для каждого потока видно состояние (онлайн,
оффлайн, не заведён), клиента, объект и наличие архива.
Пароли камер не показываются. В списке и в API строка
источника маскируется (rtsp://user:•••@host). Полный адрес
открывает только администратор — кнопкой в модалке потока, и каждый показ
записывается в аудит.
Если камера заведена в биллинге, но потока в go2rtc нет, строка помечается и предлагает действие «Завести»; кнопка «Завести все» в шапке создаёт потоки для всех таких камер разом.
Архив записей

Архив камеры открывается из списка потоков или карточки объекта. На странице живой поток, шкала суток с сегментами записи и список фрагментов.
- Выбор даты — стрелки день назад и вперёд, поле даты, кнопка «Сегодня». Без выбора показываются последние сутки.
- Шкала — 24 часа с отметками записи: сразу видно, в котором часу записи нет. Клик по сегменту проигрывает фрагмент.
- Кадр — сохранить текущий стоп-кадр камеры.
- Скачать фрагмент — иконка у каждого интервала, файл mp4 отдаёт MediaMTX.
Пульт ЧОПа

Жизненный цикл тревоги — и откуда берётся время реакции:
stateDiagram-v2
[*] --> Новая: сигнал с объекта
Новая --> Принята: оператор нажал «Принять»
Новая --> Ложная: помечена ложной
Принята --> Обработана: выезд завершён
Принята --> Ложная: подтвердилась как ложная
Обработана --> [*]
Ложная --> [*]
note right of Принята
время от «Новой» до «Принята»
и есть время реакции в отчёте SLA
end note
/admin/dispatch/ — рабочее место оператора охраны: стена камер
охраняемых объектов, счётчики и панель тревог. Плитка камеры честно показывает
своё состояние: «в эфире», «нет сигнала» (поток есть, источник молчит), «не
заведена» или «выключена».
У тревоги один жизненный цикл и всегда одно очевидное действие: новая — «Принять», принятая — «Обработана»; отдельной кнопкой можно пометить ложной. Рядом видно, кто принял и когда, а у непринятой тикает счётчик ожидания — это и есть время реакции, которое потом попадает в отчёт по SLA.
На телефоне тревоги стоят первым блоком, выше стены камер: оператор не должен пролистывать десятки плиток, чтобы увидеть тревогу.
Отчётность по SLA

/admin/video/reports/ — отчёт по охраняемым объектам за период
(7 / 30 / 90 дней, год): доступность, простой, тревоги, время реакции и
выручка. Кроме таблиц есть два графика: доступность по дням и тревоги со
средним временем реакции.
Доступность считается по событиям потери и восстановления связи. Если таких событий за период не было, отчёт пишет «нет данных» и ставит прочерк — а не рисует ровные 100 %, которых никто не измерял.
Кнопка «Экспорт CSV» выгружает те же данные для сводных таблиц.
Права и организации
flowchart TD
U["Сотрудник"] --> O{"Его организации"}
O -->|"свои"| VIS["Объекты, камеры, сметы, тревоги"]
O -->|"чужие"| X404["404 даже по прямой ссылке"]
U --> R{"Права разделов"}
R -->|"sec_video"| SV["Раздел «Видеонаблюдение»"]
R -->|"sec_dispatch"| SD["Пульт ЧОПа"]
Раздел скоупится по организациям: сотрудник видит объекты, камеры, сметы и тревоги только своих компаний, а переключатель организации в шапке фильтрует списки. Переход по прямой ссылке на чужой объект отдаёт 404.
Права разведены на два ключа:
sec_video— раздел «Видеонаблюдение»: объекты, проекты, планы, каталог, медиа-сервер, отчётность;sec_dispatch— пульт ЧОПа. Группаsecurity_operatorзаведена для операторов охраны: пульт им нужен, воронка продаж со сметами — нет.
Настраиваются в /admin/settings/permission_settings/.
Настройки модуля

/admin/video/settings/ — четыре группы:
- Основные — включение модуля, отдельный счёт под видео.
- Биллинг и блокировки — блокировать камеры при минусе, блокировать ли заодно интернет (по умолчанию нет), аванс по проекту в процентах, партнёрская услуга реагирования ЧОО.
- Облако VSaaS — провайдер, адрес и ключ API, проверка связи. Пусто означает работу на собственном медиа-сервере.
- Архив записей — запись MediaMTX на диск, дублирование в облачное хранилище и удаление локального сегмента после выгрузки.
Чек-лист запуска
- Включить модуль в
/admin/settings/modules/. - Завести услуги типа «Видеонаблюдение» в каталоге услуг и сервисные планы на их основе.
- Наполнить каталог моделей и связать их с позициями склада — иначе себестоимость проектов не сойдётся.
- Настроить медиа-сервер: адрес go2rtc и публичный URL для плееров.
- Включить архив, если записи хранятся на своей стороне.
- Раздать права:
sec_videoинженерам и продажам,sec_dispatch— операторам пульта. - Завести первый объект, камеру и подписку; проверить, что списание прошло по видео-счёту.