Ноды и флот
Состояние нод, телеметрия, конфигурация, ядра, логи, сертификаты и вывод из эксплуатации.
Нода — сервер, который забирает видео с камер, раздаёт его зрителям и пишет архив. Plane сам видео не передаёт: он хранит конфигурацию, раздаёт права и собирает телеметрию, а браузер оператора обращается за потоком напрямую к ноде. Поэтому состояние нод — первое, что смотрят при жалобах на видео.
Раздел Узлы (/admin/infrastructure/nodes) доступен только суперадмину. Админ организации и
оператор пункта меню не видят, а прямой переход даёт «Страница не найдена». Рядом, на той же странице,
вкладка «Туннельные агенты» — это отдельная сущность для камер за NAT, см.
Камеры за NAT: туннели.

Список узлов#
Вверху четыре плитки: «Узлов во fleet» (настроенные медиасерверы), «Доступны» (из скольких настроенных), «Профилей в эфире» (активные основные и дополнительные профили) и «Требуют внимания» (недоступны, отключены или сообщают об ошибках).
| Колонка | Что показывает |
|---|---|
| Название | имя ноды, под ним — её публичный URL |
| Состояние | «Активен», «Выведен из эксплуатации» или «Отключён» плюс «Последний контакт» |
| Стримы и сессии | сколько профилей в эфире из общего числа, сколько с деградацией и с ошибками |
| Нагрузка системы | занятость worker-ядер, число логических CPU хоста и его загрузка |
| Хранилище | по каждому хранилищу ноды: имя, «{n}% свободно» и IOPS записи |
| License | состояние лицензии ноды и разрешённое число потоков |
| Версия | версия сборки ноды |
Клик по строке открывает карточку узла. Кнопка в шапке — «Добавить ноду».
Этот список — не обычная таблица консоли: поиска, фильтров, экспорта CSV и массовых действий здесь нет, потому что нод во флоте единицы или десятки, а не тысячи.
Запись вида 0.80/24 worker-ядер · 24 CPU хоста · 4% загрузки означает: нода использует 0,80 ядра из
24 выделенных ей рабочих ядер, всего на хосте 24 логических CPU, и хост в целом занят на 4 %.
Первое число — потребление процесса ноды, третье — загрузка всего хоста, включая посторонние процессы. Расходятся они закономерно: если загрузка хоста высокая, а worker-ядра почти свободны, процессор ест кто-то другой, а не видео.
Состояние и телеметрия обновляются живым потоком, без перезагрузки страницы. Если поток оборвался, появляется чип «Показаны последние известные данные узлов» — цифры на экране в этот момент устарели. Пока ни одной ноды не заведено, страница показывает «Медиаузлы ещё не настроены» и «Добавьте узел, чтобы получить готовую конфигурацию запуска.».
Добавление ноды#
Порядок обязателен: сначала нода создаётся в Plane, и только потом ставится на сервер. Подсказка формы говорит об этом прямо — «Сначала создайте логическую ноду. Fleet сгенерирует полный конфигурационный файл, который надо положить на сервер.».
| Поле | Обязательность | Смысл |
|---|---|---|
| Название | обязательное | постоянное имя во fleet; используется при размещении камер и в аудите, после создания не меняется |
| Публичный URL | обязательное | адрес медиа и администрирования, доступный браузерам и control plane |
| Control URL | необязательное | адрес, по которому Plane управляет нодой; пусто — «как публичный» |
https:// сразуСхема эффективного адреса управления (Control URL, а если он пуст — Публичный URL) — это
единственное, из чего Fleet выводит стартовую конфигурацию ноды. При https:// в неё попадают
TLS-слушатель и самоподписанный сертификат на настоящее имя ноды, и нода поднимается по HTTPS
с первого запуска; Plane принимает этот сертификат осознанно — нода удостоверяется выданным ей
ключом управления. Прежнего ограничения «при создании только http://» больше нет.
Порты выводятся оттуда же: https://node.example.com → нода слушает 80 и 443;
https://cctv.example.com:9443 → 9080 и 9443 (так ставится нода на одном хосте с Plane, которому
принадлежат 80 и 443); http://node.example.com:8090 → только 8090, без собственного TLS — вариант
для ноды за прокси, который сам терминирует TLS.
После «Создать ноду» появляется тост «Нода создана. Скопируйте её конфигурацию на сервер.» и окно
с готовым файлом node.conf. Полная процедура установки, спаривания и лицензирования — на странице
Установка с нуля: Node.
Конфигурация ноды#
Окно «Конфигурация {имя}» открывается сразу после создания и в любой момент — кнопкой
«Посмотреть конфигурацию» в карточке узла, раздел «Базовая конфигурация». В окне видно
«Поколение» и весь текст node.conf; его можно скопировать в буфер или скачать файлом.
Инструкция под текстом: «Скопируйте весь файл на сервер ноды и запустите hastreamer-cctv-node, передав путь к нему. Листенеры, TLS и тюнинг можно менять локально; стримы и хранилища синхронизирует plane.». Это и есть граница ответственности: системную часть файла правят на сервере руками, рабочую нагрузку приводит в соответствие Plane. Разбор всех директив — node.conf — все директивы.
Кнопка «Перегенерировать ключи» выпускает новую пару ключей управления и повышает поколение конфигурации. Предупреждение в интерфейсе: «Запущенная нода немедленно потеряет доступ к управлению, пока новый конфиг не будет скопирован и нода не будет перезапущена. Видео продолжит работать.».
Старый node.conf перестаёт проходить авторизацию сразу же. До тех пор пока новый файл не положен на
сервер и служба не перезапущена, нода не получает конфигурацию: новые камеры на неё не приедут, а
изменения существующих не применятся. Планируйте ротацию только вместе с доступом к серверу ноды.
Карточка узла#
Адрес — /admin/infrastructure/nodes/<UUID>. Вверху имя ноды, версия и короткий идентификатор,
состояние и возраст телеметрии. Шесть вкладок; каждая имеет собственный адрес через ?tab=.

| Вкладка | Что внутри |
|---|---|
| Обзор | телеметрия процесса и хоста, графики, тепловая карта ядер, состояние сети |
| Сессии | кто и что смотрит на этой ноде прямо сейчас |
| Хранилища | диски и S3: занятость, IOPS, порог вытеснения, холодный уровень |
| Логи | операционный журнал ноды |
| Лицензия | что нода сообщает о своей лицензии |
| Сеть и TLS | адреса, сертификаты, базовая конфигурация, рабочие ядра, опасные действия |
Обзор#
Четыре плитки: «Доступность» (возраст телеметрии), «CPU хоста», «Память хоста» и «Время работы». Ниже блок «Стримы и сессии» со счётчиками: «Всего», «Live», «Ожидают», «Подключаются», «Деградация», «Ошибки», «Сессии».
Затем четыре графика за последние минуты: «CPU процесса» (с подписью «{n} из {m} сконфигурированных worker-ядер»), «RSS процесса», «CPU хоста» и «Память хоста». Под ними «Ядра CPU» — тепловая карта по каждому логическому ядру, «Наведите на ядро для текущей загрузки».
На здоровой ноде столбики ядер заполнены примерно одинаково. Если одно ядро прижато к потолку, а остальные пусты — работа стянута на один поток; проверьте параметр «Рабочие ядра» ниже на этой странице и раскладку камер по нодам.
Внизу — «Runtime и состояние сети»: «Открытые FD», «Ошибки UDP», «Потери ядра», «Потери очереди», «RX в очереди». Растущие «Потери ядра» и «Потери очереди» означают, что нода не успевает разбирать входящий трафик: это ищут в Производительности, а не в настройках камеры.
Сессии#
Кто смотрит видео с этой ноды: «Стрим», «Протокол», «Клиент», «Субъект», «Исходящий трафик», «Потери», «Джиттер», «Отставание». Есть поиск по стриму, клиенту или пользователю. Подписи «Текущая страница обновляется live» и «Видимые строки обновляются каждые 2 секунды» объясняют, почему числа меняются на глазах: обновляются только видимые строки — так список остаётся дешёвым даже под нагрузкой.
Если в колонке «Субъект» стоит Share · …, поток смотрят по выданной ссылке доступа, а не под учётной
записью.
Хранилища#
Список хранилищ ноды с занятостью, скоростями чтения и записи, IOPS, порогом вытеснения и состоянием холодного уровня S3. Здесь же добавляют диски и выполняют обязательную инициализацию — всё это описано на отдельной странице Хранилища DVR.
Логи#
Операционный журнал ноды. Журнал читается по запросу: у ноды это кольцевой буфер в памяти, фонового сбора нет и после перезапуска записи не сохраняются. Для разбора давнего инцидента берите системный журнал на сервере ноды:
sudo journalctl -u hastreamer-cctv-node --since '2 hours ago' --no-pager
Лицензия#
Что нода сообщает о своей лицензии: «Владелец», «Email», «Макс. потоков», «Истекает», «Обновления до», «HWID». Если нода недоступна или не ответила, показывается «Лицензия недоступна — нода недоступна или не сообщила о ней.».
HWID берут именно отсюда — код активации выпускается под него. Лезть за ним в журнал сервиса не нужно; это остаётся запасным способом для ноды, до которой Plane не достучался. Сам код активации кладётся файлом на сервер ноды — Лицензирование.
Лицензируется именно нода, а не Plane. Нелицензированная нода спаривается, видна в списке и отвечает на запросы, но не отдаёт ни одного кадра видео — при этом над консолью висит красный баннер лицензии. Подробности — Лицензирование.
Сеть и TLS#
Карточки раздела:
- «Адреса ноды» — «Публичный путь воспроизведения и приватный путь управления» плюс кнопка «Изменить».
- «TLS / сертификаты» — кнопка «Управлять TLS».
- «Базовая конфигурация» — кнопка «Посмотреть конфигурацию».
- «Рабочие ядра».
- «Опасные действия» — кнопка «Отключить».
Адреса ноды#
Кнопка «Изменить» в карточке «Адреса ноды» открывает форму «Сетевые адреса ноды» с двумя полями.
| Поле | Кто по нему обращается |
|---|---|
| Публичный URL | браузеры зрителей — за видео, превью и плеером |
| Control URL | Plane — за управлением; пусто означает «как публичный» |
Адреса меняют при переезде ноды на другой домен или порт. Схема при этом должна оставаться согласованной с тем, поднимает ли нода TLS сама.
http://Нода с собственным сертификатом перенаправляет весь обычный HTTP на HTTPS. При таком перенаправлении
теряется заголовок авторизации: Plane получает 401, управление молча перестаёт работать, а
нода при этом выглядит живой — она отвечает браузерам и продолжает раздавать видео, но не
принимает конфигурацию и уходит в offline.
Симптом узнаваемый: видео идёт, новые камеры на ноду не приезжают, изменения не применяются, в списке
нода «мигает» между активной и недоступной. Обычно оба адреса заданы по https:// с момента создания;
если нет — исправьте это здесь, в форме «Сетевые адреса ноды», приведя оба к https://.
Дополнительный эффект: конфигурация с логинами и паролями камер уходит на ноду в шифрованном виде, а не открытым текстом. Разбор вариантов сертификата — TLS и сертификаты.
Слушатели в node.conf выводятся из схемы адреса управления, поэтому после правки адресов заберите
свежий файл кнопкой «Посмотреть конфигурацию» — либо просто поправьте слушатели руками в верхней
части существующего node.conf, если в неё уже внесены свои правки (сертификаты, тюнинг). Порты
применяются только при перезапуске службы; до этого нода продолжает вещать на прежних.
TLS ноды#
Кнопка «Управлять TLS» открывает окно «TLS / сертификаты». Ключевой выбор — «Владелец сертификата»:
| Значение | Когда применяется |
|---|---|
| Собственный сертификат ноды | «Для удалённых и выделенных нод. Нода сама использует ACME или отдельный загруженный PEM.» |
| Сертификат Plane · тот же хост | «Только для co-located ноды. Локальный синхронизатор копирует сертификат Plane, не передавая приватный ключ удалённым хостам.» |
Второй вариант годится только когда Plane и нода стоят на одном сервере. Состояние синхронизации показывается тут же: «Сертификаты Plane и Node совпадают» либо «Синхронизация сертификата требует внимания» с пояснением «Основной сертификат Node не совпадает с активным сертификатом Plane. Проверьте локальный синхронизатор.».
Ниже — «Активный сертификат Node»: имена сертификата (SAN), центр сертификации, срок действия, серийный номер, SHA-256 fingerprint и «Осталось дней: {n}». Блок «HTTPS и параметры ACME» задаёт «Порт HTTPS», «Каталог ACME» и «Контакт ACME», а «Управляемые сертификаты» позволяет добавить сертификат через «Настроить ACME» либо «Загрузить сертификат» (поля «Имена в сертификате», «Сертификат PEM», «Приватный ключ PEM», «Цепочка CA PEM (необязательно)»).
Проверить, что нода отдаёт именно ожидаемый сертификат, проще всего снаружи:
echo | openssl s_client -connect node.example.com:443 -servername node.example.com 2>/dev/null \ | openssl x509 -noout -issuer -dates
Рабочие ядра#
Карточка «Рабочие ядра» задаёт, сколько ядер CPU нода отдаёт медиапроцессам. Значение
записывается в node.conf директивой cores.
| Значение | Смысл |
|---|---|
| 0 | «Все высокопроизводительные» — каждое P-ядро на гибридных процессорах, все ядра на однородных |
| положительное число | закрепляет ровно указанное число ядер |
0 — это «все ядра», а не «ни одного»Ноль в этом поле означает максимум, а не отключение. Не «нормализуйте» его к единице в собственных
скриптах: значение 1 действительно оставит ноде одно ядро, и весь приём и раздача соберутся на нём.
Изменение применяется не сразу: «Применяется при следующей загрузке конфигурации и перезапуске ноды — число ядер задаётся системно-локально.». После сохранения (тост «Число рабочих ядер обновлено») перезапустите службу на сервере ноды:
sudo systemctl restart hastreamer-cctv-node
Вывод из эксплуатации#
Кнопка «Отключить» в блоке «Опасные действия» переводит ноду в состояние «Выведен из эксплуатации».
Подсказка в интерфейсе: «Отключайте только намеренно выводимую из эксплуатации пустую ноду. Для замены сервера остановите старый экземпляр, скопируйте тот же комплект конфигурации ноды, измените здесь адреса и запустите его на новом хосте.».
Если на ноде остались камеры, операция не выполнится — сначала перенесите их на другую ноду или удалите. Выведенная нода исключается из подбора размещения, её хранилища больше не предлагаются, а записи архива на её дисках становятся недоступны из системы.
Замена сервера — это не вывод из эксплуатации. Меняя железо и оставляя ту же логическую ноду,
сохраните её идентификатор и ключ: положите на новый сервер тот же node.conf (или получите его
заново кнопкой «Посмотреть конфигурацию») и поправьте адреса. Отдельного удаления ноды в системе нет.
Диагностика#
| Симптом | Причина | Решение |
|---|---|---|
| Нода не переходит в «Активен» после установки | Plane не достучался до ноды | проверьте control_url, firewall и что порт слушается: sudo ss -tlnp | grep hastreamer |
| Нода отвечает браузерам, но в списке недоступна | адрес управления http:// у ноды со своим TLS: при редиректе теряется авторизация |
приведите оба адреса к https:// — см. предупреждение выше |
| Красный баннер лицензии, видео нет | нода не лицензирована | вкладка «Лицензия», затем Лицензирование |
| В списке чип «Показаны последние известные данные узлов» | оборвался поток телеметрии | обновите страницу; если чип держится — проверьте доступность Plane и ноды |
| Загрузка хоста высокая, worker-ядра свободны | CPU занят посторонним процессом | посмотрите top на сервере ноды |
| Растут «Потери ядра» и «Потери очереди» | нода не успевает разбирать входящий трафик | Производительность |
| Диска нет в списке при выборе для камеры | диск не инициализирован | Хранилища DVR |
Более широкий разбор симптомов — Диагностика неисправностей. Всё то же самое через API — Ноды и хранилища.