SIRINVIDEO CCTV Документация администратора и пользователя На сайт 2026.08

Установка с нуля: Node

Совмещённый установщик для одного сервера и полная процедура для отдельного сервера ноды — создание, спаривание, лицензия, диски под архив.

Нода — это сервер, который принимает видео с камер, раздаёт его зрителям и пишет архив. Установка идёт одним из двух путей:

  • Plane и нода на одном сервере — один совмещённый установщик, три вопроса, всё связывается автоматически. Рекомендуемый путь для одиночной установки, он описан сразу ниже.
  • Plane и ноды на разных серверах — нода сначала создаётся в Plane, затем её файл конфигурации переносится на сервер ноды. См. Отдельный сервер ноды.

Один сервер: совмещённый установщик#

Ставит контрол-плейн и ноду на этот же хост и связывает их между собой:

sudo installers/hastreamer-cctv-all/install.sh

Установщик спрашивает три вещи (в режиме acme — ещё контакт для Let's Encrypt):

Вопрос Что отвечать
Имя хоста (домен) cctv.example.com — по этому имени будут заходить браузеры
Сертификат для Plane self-signed (по умолчанию), acme, own-cert или http — разбор в TLS и сертификаты
Имя ноды в системе понятное человеку, например sovetskiy-0
Режим own-cert: файлы должны существовать заранее

Установщик спросит пути к цепочке и закрытому ключу и проверит, что файлы читаются, — если их нет, он остановится сразу, а не на середине установки. Положите файлы на сервер до запуска (пути по умолчанию — /etc/hastreamer-cctv/plane-cert.pem и /etc/hastreamer-cctv/plane-key.pem; можно задать заранее через HASTREAMER_PLANE_CERT и HASTREAMER_PLANE_KEY). Остальные три режима подготовки не требуют.

Дальше он делает всё сам: ставит Plane, дожидается его API, создаёт ноду через API, забирает выданный node.conf и раскладывает его, ставит ноду, дожидается спаривания и переключает ноду на сертификат Plane.

Порты выбирать не нужно — они фиксированы:

Компонент Порты Назначение
Plane 443; плюс 80 в режиме acme админка и API; порт 80 — проверка Let's Encrypt
Нода 9443 и 9080 видео и API ноды; 80 и 443 на этом хосте уже заняты Plane

Единственное исключение — режим http (совсем без TLS): тогда Plane слушает 8080, а нода — 9080 без HTTPS.

Сначала план, потом установка

Флаг --dry-run задаёт те же три вопроса, печатает адреса, режим сертификата, порты и имя ноды — и ничего не меняет на хосте (root для него не нужен):

installers/hastreamer-cctv-all/install.sh --dry-run

Убедитесь, что план верный, и запустите тот же скрипт без флага, через sudo.

Установка завершилась успешно

Последние строки установщика:

Готово.
  Админка   : https://cctv.example.com/admin/
  Вход      : admin / SirinVideo   ← смените пароль при первом входе
  Нода      : «sovetskiy-0», медиа на https://cctv.example.com:9443

Откройте админку и убедитесь, что в разделе Ноды нода в состоянии «Активен» и показывает версию.

После установки остаётся четыре действия, и все они — в админке:

  1. Смените пароль администратора: Пользователи и доступ → admin.
  2. Активируйте лицензию ноды — HWID показан в Ноды → нода → Лицензия, порядок ниже в шаге 5.
  3. Подключите диск под архив: Ноды → нода → Хранилища.
  4. Добавьте камеры: Камеры → Новая камера.
Что уже настроено и переделывать не нужно

Адреса ноды в Plane заданы, спаривание выполнено, node.conf лежит в /etc/hastreamer-cctv-node/node.conf. Нода получила рабочий HTTPS и сертификат Plane — тот же файл, с теми же обновлениями, поэтому отдельно выпускать ей сертификат не требуется (в режиме http TLS не поднимается ни у Plane, ни у ноды). Подробности — TLS и сертификаты.

Для автоматической установки все три ответа и код активации задаются переменными окружения:

sudo HASTREAMER_PLANE_HOSTNAME=cctv.example.com \
     HASTREAMER_PLANE_TLS_MODE=acme \
     HASTREAMER_PLANE_ACME_EMAIL=admin@example.com \
     HASTREAMER_NODE_NAME=sovetskiy-0 \
     HASTREAMER_ACTIVATION_CODE='XXXX-XXXX-XXXX-XXXX' \
     installers/hastreamer-cctv-all/install.sh

Дальше на этой странице — установка ноды на отдельный сервер. Если вы воспользовались совмещённым установщиком, переходите сразу к шагу 5 (лицензия) и шагу 6 (диск под архив).

Отдельный сервер ноды#

Порядок принципиально важен: сначала нода создаётся в Plane, и только потом ставится на сервер — Plane выдаёт готовый файл конфигурации с ключами.

Нода не настраивается вручную «с нуля»

Файл node.conf генерирует Plane: в нём идентификатор ноды, адрес контрол-плейна и его открытый ключ. Написать этот файл руками нельзя — нода не спарится. Вручную правятся только системные параметры (порты, TLS, тюнинг) — см. node.conf.

Шаг 0. Проверка сервера ноды#

Требования к ноде строже, чем к Plane: весь видеотрафик идёт через неё.

uname -m                      # x86_64
uname -r                      # ядро ≥ 5.1 — обязательно (io_uring)
ldd --version | head -1       # glibc ≥ 2.31
nproc                         # число ядер: см. раздел «Требования»
df -h /mnt                    # место под архив
io_uring обязателен

Нода использует io_uring для сети и файлового ввода-вывода. Если ядро старше 5.1 или io_uring запрещён политикой, нода не сможет работать. Проверьте, что он не отключён:

sysctl kernel.io_uring_disabled     # должно быть 0

Если значение 1 или 2 — установите kernel.io_uring_disabled=0 в /etc/sysctl.d/ и перезагрузитесь. Установщик кладёт нужные параметры в /etc/sysctl.d/99-hastreamer.conf.

Диски под архив#

Диск для записи должен быть смонтирован до установки и иметь отдельную точку монтирования:

lsblk -o NAME,SIZE,MOUNTPOINT
df -h /mnt/dvr

Рекомендуется отдельный раздел (не корневой) — так переполнение архива не остановит систему. Файловая система: ext4 или XFS.

Шаг 1. Создать ноду в Plane#

  1. Откройте https://cctv.example.com/admin/ → раздел Ноды.
  2. Нажмите Добавить ноду.
  3. Заполните:
    • Имя — понятное человеку, например sovetskiy-0.
    • Public URL — как браузеры будут забирать видео: https://node.example.com.
    • Control URL — по какому адресу Plane управляет нодой; оставьте пустым, если он совпадает с Public URL.
  4. Скачайте выданный файл node.conf.
Указывайте https:// сразу

Схема адреса управления (Control URL, а если он пуст — Public URL) — это единственное, из чего Plane выводит остальное: увидев https://, он выдаёт стартовую конфигурацию с TLS-слушателем и самоподписанным сертификатом на настоящее имя ноды, и нода поднимается по HTTPS с первой секунды. Plane принимает такой сертификат осознанно: нода удостоверяется выданным ей ключом управления, а не сертификатом.

Обратное сочетание не работает: нода, которая терминирует TLS, перенаправляет обычный HTTP на HTTPS, а при перенаправлении теряется заголовок авторизации — Plane получит 401 и будет считать живую ноду недоступной. Поэтому https:// и указывается сразу.

Что именно получится из адреса управления:

Эффективный адрес управления Слушатели в node.conf Когда так
https://node.example.com http 80; + https 443; и самоподписанный сертификат отдельный сервер ноды
https://cctv.example.com:9443 http 9080; + https 9443; и самоподписанный сертификат нода на одном хосте с Plane: 80 и 443 занял Plane
http://node.example.com:8090 http 8090;, TLS нет впереди прокси, который сам терминирует TLS

То же самое через API:

BASE=https://cctv.example.com
TOKEN=$(curl -sS -X POST "$BASE/api/v1/auth/login" \
  -H 'Content-Type: application/json' \
  -d '{"login":"admin","password":"ВАШ-ПАРОЛЬ"}' \
  | python3 -c 'import sys,json;print(json.load(sys.stdin)["token"])')

curl -sS -X POST "$BASE/api/v1/nodes" \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"name":"sovetskiy-0","public_url":"https://node.example.com"}' \
  | python3 -c 'import sys,json;print(json.load(sys.stdin)["config"])' > node.conf

Ответ содержит готовый файл конфигурации в поле config — команда выше сразу сохраняет его в node.conf.

Полученный node.conf для отдельной ноды выглядит так (комментарии на русском — пояснения к этой странице, в файле их нет):

# SirinVideo CCTV node bootstrap - generated by Fleet.
# Edit only system-local listeners/TLS/tuning. Streams and storages arrive from plane.
http 80;                         # обычный слушатель: проверка ACME и редирект на HTTPS
https 443;                       # видео, плеер и API ноды поверх TLS
rtsp 8554;                       # порт RTSP-раздачи
cores 0;                         # 0 = использовать все производительные ядра
log_level info;

tls {
  self_signed_names node.example.com;   # самоподписанная пара на настоящее имя ноды
}

cctv {
  id 01a01471-0b1c-75a2-8359-b9b4b5341069;   # идентификатор ноды
  plane_url "https://cctv.example.com";       # адрес контрол-плейна
  generation 1;
  plane_pubkey "-----BEGIN PUBLIC KEY-----

-----END PUBLIC KEY-----
";                                            # открытый ключ Plane: проверка команд
}

Верхнюю часть файла (слушатели, tls, тюнинг) вы правите руками, блок cctv { } — удостоверение ноды, его трогать нельзя. Полный справочник — node.conf.

Шаг 2. Установить бинарь на сервер ноды#

Скопируйте каталог установщика на сервер ноды и запустите:

sudo installers/hastreamer-cctv-node/install.sh

Установщик:

  1. Проверит систему (x86_64, glibc, ядро с io_uring, systemd, openssl).
  2. Установит /usr/local/bin/hastreamer-cctv.
  3. Положит параметры ядра в /etc/sysctl.d/99-hastreamer.conf и применит их.
  4. Установит unit hastreamer-cctv-node.service.
  5. Спросит код активации лицензии (можно пропустить и добавить позже).
  6. Сообщит, куда положить node.conf.

Пропустить вопрос о лицензии при автоматизации:

# с кодом активации
sudo HASTREAMER_ACTIVATION_CODE='XXXX-XXXX-XXXX-XXXX' installers/hastreamer-cctv-node/install.sh
# без кода (добавить позже) — установщик не задаст вопрос
sudo installers/hastreamer-cctv-node/install.sh < /dev/null

Шаг 3. Положить конфигурацию и запустить#

sudo install -m 0644 node.conf /etc/hastreamer-cctv-node/node.conf
sudo systemctl restart hastreamer-cctv-node
systemctl is-active hastreamer-cctv-node          # active

Шаг 4. Проверить спаривание#

Проще всего — в админке: раздел Ноды, нода должна перейти в состояние Активен и показать версию. Если состояние не меняется, посмотрите журнал на самой ноде:

sudo journalctl -u hastreamer-cctv-node -n 30 --no-pager

Признаки успешного спаривания:

hastreamer — 0 stream(s) · http :80 (HLS+player+api) · rtsp :8554 · 16 cores
config applied by admin → epoch 2 (68d0b9f93ab3999d)      ← Plane прислал конфигурацию
[authio] jwks: loaded 1 key(s) from https://cctv.example.com   ← ключи проверки прав получены
[authio] revoked: loaded 0 revoked … 
Проверка через API
curl -sS "$BASE/api/v1/nodes" -H "Authorization: Bearer $TOKEN" \
  | python3 -m json.tool | grep -E '"name"|"state"|"version"'

Ожидается "state": "active".

Шаг 5. Лицензия#

Нода — лицензируемый компонент. Без лицензии она спарится с Plane и будет видна в админке, но не отдаст ни одного кадра видео.

Код активации выпускается под HWID — идентификатор оборудования ноды. Смотрите его в админке: Ноды → ваша нода → вкладка «Лицензия» → поле «HWID». Там же видно владельца лицензии, разрешённое число потоков и сроки.

Если админка до ноды не достучалась

Тот же HWID нода пишет в свой журнал при старте, когда лицензии нет:

sudo journalctl -u hastreamer-cctv-node -b | grep -o 'HWID [A-Za-z0-9]*' | tail -1
hastreamer-cctv: NOT LICENSED (enforced) — no license file at /etc/hastreamer-cctv/license.txt
                 (HWID AQKELaPKBFxs2JwF5StOzgZB8TxrByv0yXg)

Полученный код положите на сервер ноды и перезапустите службу — это единственное действие, которое выполняется в консоли:

echo 'ВАШ-КОД-АКТИВАЦИИ' | sudo tee /etc/hastreamer-cctv/license.txt >/dev/null
sudo systemctl restart hastreamer-cctv-node

После перезапуска вкладка Лицензия показывает владельца и срок действия. Подробнее — Лицензирование.

Шаг 6. Диск под архив#

Хранилище добавляется из Plane — нода получит его вместе с конфигурацией. В админке: Ноды → ваша нода → Хранилища → Добавить, укажите путь (например /mnt/dvr), затем нажмите Инициализировать.

Инициализация прошла

На сервере ноды в каталоге появляется файл-маркер:

ls -a /mnt/dvr | head
# .hastreamer-storage-identity   ← маркер: каталог принадлежит этой системе

В админке хранилище перестаёт показывать «Требуется инициализация».

То же самое через API:

NODE_ID=<UUID-ноды>
curl -sS -X POST "$BASE/api/v1/nodes/$NODE_ID/storages" \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"name":"dvr1","arg2":"/mnt/dvr","directives":""}'

curl -sS -X POST "$BASE/api/v1/nodes/$NODE_ID/storages/dvr1/provision" \
  -H "Authorization: Bearer $TOKEN"

Успешная инициализация возвращает "provisioned": true. Подробнее — Хранилища DVR.

Шаг 7. Что дальше#

Нода готова: она уже работает по HTTPS с самоподписанным сертификатом на своё имя, поэтому браузеры получают видео с того же протокола, что и админку.

Диагностика#

Симптом Причина Решение
Нода в админке pending, не переходит в active Plane не может достучаться до ноды Проверьте control_url, firewall, что порт ноды слушается: sudo ss -tlnp | grep hastreamer
Нода отвечает браузерам, но в админке недоступна Адрес управления http:// у ноды, которая терминирует TLS: при редиректе теряется авторизация, нода отвечает Plane 401 Приведите оба адреса к https://: Ноды → нода → Сеть и TLS → Адреса ноды → Изменить
NOT LICENSED (enforced) Нет файла лицензии Положите код в /etc/hastreamer-cctv/license.txt и перезапустите
Камеры добавлены, но видео нет Нода не лицензирована либо не видит камеры по сети Проверьте лицензию; с ноды: nc -vz <IP-камеры> 554
tune: ⚠ host is not optimally tuned io_uring отключён политикой ядра sysctl -w kernel.io_uring_disabled=0 и в /etc/sysctl.d/
Архив не пишется Хранилище не инициализировано Выполните инициализацию, проверьте маркер в каталоге и права