Установка с нуля: 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
Откройте админку и убедитесь, что в разделе Ноды нода в состоянии «Активен» и показывает версию.
После установки остаётся четыре действия, и все они — в админке:
- Смените пароль администратора: Пользователи и доступ → admin.
- Активируйте лицензию ноды — HWID показан в Ноды → нода → Лицензия, порядок ниже в шаге 5.
- Подключите диск под архив: Ноды → нода → Хранилища.
- Добавьте камеры: Камеры → Новая камера.
Адреса ноды в 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 для сети и файлового ввода-вывода. Если ядро старше 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#
- Откройте
https://cctv.example.com/admin/→ раздел Ноды. - Нажмите Добавить ноду.
- Заполните:
- Имя — понятное человеку, например
sovetskiy-0. - Public URL — как браузеры будут забирать видео:
https://node.example.com. - Control URL — по какому адресу Plane управляет нодой; оставьте пустым, если он совпадает с Public URL.
- Имя — понятное человеку, например
- Скачайте выданный файл
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
Установщик:
- Проверит систему (x86_64, glibc, ядро с io_uring, systemd, openssl).
- Установит
/usr/local/bin/hastreamer-cctv. - Положит параметры ядра в
/etc/sysctl.d/99-hastreamer.confи применит их. - Установит unit
hastreamer-cctv-node.service. - Спросит код активации лицензии (можно пропустить и добавить позже).
- Сообщит, куда положить
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 …
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 с самоподписанным сертификатом на своё имя, поэтому браузеры получают видео с того же протокола, что и админку.
- Добавьте камеры — Добавление камер.
- Проверьте установку по чек-листу — Проверка после установки.
- Замените самоподписанный сертификат на доверенный, если ноду открывают снаружи и предупреждение браузера недопустимо — TLS и сертификаты. Переустановка для этого не нужна.
Диагностика#
| Симптом | Причина | Решение |
|---|---|---|
Нода в админке 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/ |
| Архив не пишется | Хранилище не инициализировано | Выполните инициализацию, проверьте маркер в каталоге и права |