Перейти к содержимому

Как это работает

Vision — это плоскость управления поверх Cesbo Alta. Alta принимает и раздаёт потоки камер; Vision управляет камерами, пользователями, записями и оповещениями и проксирует видео в браузер.

Сервер — это один бинарный файл на Go со встроенными веб-интерфейсом на Vue 3 и движком базы данных SQLite. Интерфейс встраивается при компиляции через //go:embed, поэтому больше ничего устанавливать не нужно — ни Node.js, ни отдельного веб-сервера, ни внешней базы данных. Состояние хранится в одном файле SQLite (режим WAL); миграции схемы выполняются автоматически при запуске.

Vision обращается к каждому серверу Alta через REST для CRUD-операций с камерами и получения их статуса, а также организует передачу видео в браузер:

sequenceDiagram
    participant B as Browser
    participant V as Vision
    participant A as Cesbo Alta
    B->>V: Open camera
    V->>A: Negotiate stream (signed token)
    B-->>A: WHEP (WebRTC) — low latency
    Note over B,A: falls back to HLS if WebRTC fails
    A-->>B: Live video

Каждый исходящий вызов Alta обёрнут в повторные попытки, circuit breaker и bulkhead, ограничивающий параллелизм. Если сервер Alta становится недоступным, Vision сбрасывает нагрузку только для этого сервера и продолжает обслуживать остальные — деградировавший Alta никогда не обрушит процесс. У потока видео в реальном времени для каждого сервера свой breaker, поэтому всплеск неудачных запросов видео никогда не приостановит PTZ, архив или проверки состояния.

Кратковременный сбой связи или быстрый перезапуск Alta распознаются отдельно от длительного отказа: Vision подтверждает предполагаемый сбой двумя последовательными проверками — а в случае перезапуска ещё и по сообщённому Alta идентификатору экземпляра и времени работы — прежде чем переводить камеры в офлайн. Кратковременные сбои не заставляют камеры «мигать», настоящие отказы обнаруживаются за несколько секунд, а сервер, который многократно переключается между состояниями, помечается как недоступный один раз, а не лавиной событий.

Воспроизведение сначала использует WHEP (WebRTC) для низкой задержки и автоматически переключается на HLS. У камеры может быть второй поток Sub с низким разрешением: Alta получает второй приёмник на том же канале, плотные видеостены воспроизводят Sub, а крупные виды — Main — см. Потоки Main и Sub. Доступ к потокам авторизуется короткоживущими JWT HS256, подписанными отдельно для каждого сервера Alta, поэтому запросы плейлистов и WebRTC нельзя бесконечно использовать повторно.

Работа, которая не должна блокировать запросы, выполняется в worker-ах, каждый из которых деградирует независимо: health_server (статус сервера Alta и обнаружение расхождений конфигурации), health_camera (статус камер), alta_prober (быстрая проверка доступности), clips (экспорт через ffmpeg), alerts, notifications, reconcile (очистка осиротевших ресурсов Alta) и cleanup (срок хранения). Набор включённых worker-ов настраивается.

Ручные снимки экрана запускаются из браузера. Старое имя worker-а screenshots недействительно; io исключён из набора по умолчанию и остаётся только опциональным для совместимости.

Доставка оповещений и уведомлений надёжна: ожидающие доставки сохраняются и повторяются с нарастающей задержкой, а также переживают перезапуск.

Worker reconcile удаляет только тот ресурс, создание которого Vision может доказать — по записи о владении, сделанной при создании, а не по догадке на основе имени ресурса, — поэтому две установки, использующие один сервер Alta, никогда не смогут удалить ресурсы друг друга. Описание для оператора см. в разделе Подключение сервера Alta.

  • Аутентификация с помощью сессий JWT; пароли хэшируются с помощью Argon2id.
  • Ролевое управление доступом — глобальный администратор плюс оператор/наблюдатель для каждой группы.
  • Шифрование данных в хранилище (AES-256-GCM) для чувствительных полей, таких как учётные данные Alta, с поддержкой ротации ключей.
  • Усиление защиты — строгие CSP и HSTS в рабочей среде, ограничение частоты запросов для каждого пользователя и выделенный системный пользователь без права входа при установке в виде службы.

Сервер предоставляет /healthz, /readyz и Prometheus /metrics, ведёт структурированные журналы в формате JSON и передаёт X-Request-ID через каждый запрос и каждый исходящий вызов Alta для сквозной трассировки.