Лицензирование
Файл лицензии, аппаратный отпечаток хоста, онлайн- и офлайн-активация, проверка состояния и что происходит без действующей лицензии.
Лицензирование встроено в исполняемый файл и не настраивается. У него нет ни одной директивы в конфигурации: путь к файлу лицензии, адрес службы активации и сам факт применения ограничений зашиты в сборку. Попытка описать лицензию в конфигурации — обычная ошибка разбора:
parse /etc/hastreamer/hastreamer.conf: line 4: unknown directive "license"
Главное: без лицензии медиа не отдаётся#
Это самая частая причина обращения «сервер установлен, панель открывается, а видео нет».
| Что работает без действующей лицензии | Что не работает |
|---|---|
Панель управления /admin/ |
Раздача и публикация по HTTP: HLS, DASH, MSE-WS, HTTP-TS, WHEP, WHIP — ответ 403 |
REST API /api/v1/* целиком |
Просмотр архива и VoD, превью-кадры |
| Метрики, журнал, события | Приём от источников: сервер не подключается к камерам |
Правка конфигурации, reload, restart |
Раздача по RTSP: буфер пуст, отдавать нечего |
Запрос к любому медиа-адресу получает:
HTTP/1.1 403 Forbidden Content-Type: text/plain license restricted
Приём от источников при этом останавливается: сервер не держит соединения с камерами, пока раздавать всё равно нечего — поэтому пусты и те протоколы раздачи, которые не отвечают кодом HTTP. Как только действующая лицензия появляется, всё восстанавливается автоматически, без перезапуска.
Ограничение снимается само, как только лицензия снова даёт ёмкость. Никаких «сломанных» состояний, которые надо чинить руками, при этом не возникает.
Файл лицензии#
/etc/hastreamer/license.txt
Путь фиксирован. Файл должен принадлежать root и быть читаемым службой (0644 достаточно).
Содержимое — одна строка одного из двух видов:
| Вид | Как выглядит | Когда применяется |
|---|---|---|
| Код активации | короткая строка вида XXXX-XXXX-XXXX-XXXX |
сервер имеет доступ в интернет и активируется онлайн |
| Файл лицензии | длинная строка в base64 (сотни символов) | закрытый контур, активация офлайн |
Сервер различает их сам по длине: до 40 символов — код активации, длиннее — подписанная лицензия.
Аппаратный отпечаток (HWID)#
Лицензия привязывается к хосту. Отпечаток вычисляется по нескольким независимым аппаратным источникам — идентификаторам системной платы, процессора, дисков, сетевых интерфейсов — и сам по себе не раскрывает их значений: каждый источник хешируется.
sudo hastreamer --print-hwid
A1B2c3D4e5F6g7H8i9J0k1L2m3N4
sudoЧасть аппаратных источников читается только под root. Запущенная от обычного пользователя, та
же команда напечатает другой, более короткий отпечаток — и лицензия, выданная на него, не
подойдёт службе, которая работает под root. Проверьте, что перед командой стоит sudo.
Допуск на изменения оборудования. Совпадение не побайтовое: хост считается тем же, пока он сохраняет не менее половины «веса» источников, зафиксированных при выдаче, и совпадают минимум два разных источника. Замена сетевой карты, диска или сброс machine-id лицензию не ломают, а полная замена оборудования или клонирование виртуальной машины — ломают.
Активация онлайн#
-
Запишите полученный код активации в файл лицензии:
printf '%s\n' 'XXXX-XXXX-XXXX-XXXX' | sudo tee /etc/hastreamer/license.txt >/dev/null sudo chmod 0644 /etc/hastreamer/license.txt
-
Перезапустите службу:
sudo systemctl restart hastreamer
-
Убедитесь, что активация прошла:
sudo journalctl -u hastreamer -n 20 --no-pager | grep -i license
hastreamer: NOT LICENSED (enforced) — online activation pending (HWID A1B2c3D4e5F6g7H8i9J0k1L2m3N4) hastreamer: license OK (enforced) — owner="example-customer" streams=50 expires=2027-01-31 updates-until=unlimited
Первая строка — состояние на момент старта, вторая появляется через несколько секунд, когда ответ службы активации получен и проверен.
Что требуется от сети: исходящие HTTPS-соединения (порт 443) к службе активации
license-v1.sirin.cc. Адрес зашит в сборку и не меняется настройками — это защита от подмены
службы активации. Никаких входящих соединений не требуется.
Как ведёт себя онлайн-лицензия дальше#
- Полученное разрешение действует 48 часов и хранится только в памяти процесса — на диск оно не пишется.
- Сервер обновляет его каждые 12 часов, поэтому запас перекрывает несколько неудачных попыток подряд.
- Служба активации недоступна (сеть, обслуживание) — сервер продолжает работать на текущем
разрешении. Ограничение включится только когда пройдут 48 часов с последнего успешного обновления:
activation server unreachable — license expired. - Явный отказ службы активации переводит сервер в ограниченный режим сразу; попытки при этом продолжаются, и после устранения причины всё восстанавливается само.
| Причина отказа в журнале | Что произошло | Что делать |
|---|---|---|
unknown or invalid activation code |
код не найден или введён с ошибкой | сверьте код с выданным, проверьте лишние пробелы в файле |
activation limit reached |
код уже активирован на разрешённом числе хостов | освободите один из хостов или получите дополнительную лицензию |
activation code bound to other hardware |
код привязан к другому отпечатку | активируйте на исходном хосте или запросите перепривязку |
license blocked |
лицензия заблокирована | обратитесь к поставщику лицензии |
license expired |
срок действия истёк | продлите лицензию |
Пока идёт первая активация, сервер не ограничивает медиа: иначе постоянно подключённые источники были бы отброшены до получения ответа. Ограничение включается только по явному отказу или по истечении срока разрешения.
Активация офлайн#
Для контура без доступа в интернет лицензия выдаётся файлом, привязанным к отпечатку хоста.
-
Снимите отпечаток на целевом сервере:
sudo hastreamer --print-hwid
-
Передайте отпечаток поставщику лицензии и получите файл лицензии.
-
Положите его содержимое (одна длинная строка) в файл лицензии и перезапустите службу:
sudo install -o root -g root -m 0644 license.txt /etc/hastreamer/license.txt sudo systemctl restart hastreamer
-
Проверьте состояние:
sudo hastreamer --license-status
Офлайн-лицензия проверяется локально по подписи и не требует ни одного сетевого соединения.
Проверка состояния#
Из командной строки#
sudo hastreamer --license-status
Product: hastreamer HWID: A1B2c3D4e5F6g7H8i9J0k1L2m3N4 Status: licensed Owner: example-customer Max streams: 50 Expires: 2027-01-31 Updates until: unlimited
| Поле | Что означает |
|---|---|
Product |
продукт, для которого выдана лицензия |
HWID |
отпечаток этого хоста |
Status |
licensed, grace (работает, но обновление не проходит) или unlicensed |
Reason |
появляется, когда лицензия не действует, — причина отказа |
Owner |
владелец лицензии |
Max streams |
предельное число одновременных потоков |
Expires |
дата окончания действия; never — бессрочная |
Updates until |
до какой даты выпуска сборок действует лицензия; unlimited — без ограничения |
Команда показывает лицензию как таковую и не требует работающей службы. Для установки без лицензии вывод выглядит так:
Status: unlicensed Reason: no license file at /etc/hastreamer/license.txt Max streams: 0
Через API#
curl -sS "http://media.example.com:8080/api/v1/license" -H "Authorization: Bearer $TOKEN"
{ "state": "licensed", "customer": "example-customer", "expires": "2027-01-31", "max_streams": 50, "hwid": "A1B2c3D4e5F6g7H8i9J0k1L2m3N4" }
Отсутствующие поля опускаются, а не приходят пустыми. Этот же ответ показывает панель управления. Маршрут доступен по сессии администратора и по токенам API — см. Введение и аутентификация.
Ограничение по числу потоков#
Поле max_streams — это предел одновременно работающих потоков. Он проверяется при запуске
потока: поток, оказавшийся сверх лимита, не регистрируется и не появляется в списке потоков.
Перезапуск уже существующего потока лимитом не ограничивается, поэтому при обновлении конфигурации
работающие потоки не теряются.
Значение 0 означает не «без ограничений», а «нет ёмкости»: именно оно включает полный запрет
медиа, описанный в начале страницы.
Срок действия и обновления#
Два разных ограничения по датам, их легко перепутать:
Expires— дата, после которой лицензия перестаёт действовать. Сервер продолжит запускаться, панель и API продолжат работать, но медиа будет запрещено:license expired 2027-01-31.Updates until— дата, до которой действует право на обновления. Лицензия перестаёт действовать, если вы установили сборку, выпущенную позже этой даты:license does not cover builds after 2027-01-31. Сама по себе установленная сборка при этом продолжает работать сколько угодно долго — ограничение касается только перехода на более новую.
Обновление на сборку новее этой даты немедленно останавливает раздачу медиа. Сверьте дату перед обновлением — см. Обновление и удаление.
Один экземпляр на хост#
На одном хосте одновременно работает только один лицензированный экземпляр сервера. Второй
запущенный процесс не получит лицензию и сообщит this host is not licensed. Если вы запускаете
сервер вручную для проверки, сначала остановите службу:
sudo systemctl stop hastreamer
Диагностика#
| Симптом или причина в выводе | Что означает | Что делать |
|---|---|---|
Медиа отвечает 403 license restricted |
лицензии нет либо она не действует | sudo hastreamer --license-status — в поле Reason указана причина |
no license file at /etc/hastreamer/license.txt |
файл отсутствует или пуст | положите код активации или файл лицензии |
invalid license: … |
файл повреждён или это не лицензия этого продукта | запросите файл заново; проверьте, что строка скопирована целиком |
license is not valid for this host |
отпечаток не совпадает с зафиксированным | сравните --print-hwid с отпечатком, на который выдана лицензия; помните про sudo |
license expired 2027-01-31 |
срок действия истёк | продлите лицензию |
license does not cover builds after 2027-01-31 |
установлена сборка новее разрешённой | вернитесь на прежнюю сборку или продлите право на обновления |
system clock error (before license issue date) |
системные часы отстают от даты выдачи | синхронизируйте время на сервере |
this host is not licensed |
сервер уже запущен вторым экземпляром либо среда не проходит проверку | остановите лишний процесс |
Статус grace |
лицензия действует, но обновление не проходит | проверьте исходящий доступ к службе активации; запас — 48 часов |
| Отпечаток изменился «сам» | команда выполнена без sudo либо заменено оборудование |
повторите с sudo; при реальной замене запросите перепривязку |
Что дальше#
- Установка с нуля — установка и первый запуск.
- Обновление и удаление — как обновиться, не потеряв лицензию.
- Диагностика неисправностей — общий разбор проблем.