SIRINVIDEO Документация администратора и интегратора На сайт 2026.08

Быстрый старт

От чистого сервера до видео в браузере: установка, лицензия, первый поток и три независимые проверки — панель, плеер, API.

Ниже — один сквозной сценарий без развилок: чистый сервер с Linux превращается в работающий медиасервер, а в браузере играет живое видео. На всё уходит около пятнадцати минут, из которых большая часть — ожидание установщика.

Сначала поток берётся из встроенного синтетического источника — он не требует ни камеры, ни сети, ни диска, поэтому проверка не зависит от чужого оборудования. В конце — второй короткий сценарий: заменить синтетический источник настоящей камерой по RTSP.

Что понадобится:

  • сервер с Linux на x86-64 и доступом по SSH с правами root (или через sudo);
  • каталог установщика из поставки;
  • код активации лицензии — без него сервер запустится, но не отдаст ни одного кадра;
  • браузер на вашем рабочем месте, из которого сервер доступен по сети.
Плейсхолдеры в примерах

media.example.com — адрес вашего сервера, 10.0.0.10 — адрес камеры. Подставляйте свои значения. Исполняемый файл, служба и файл конфигурации называются hastreamer — это внутреннее имя продукта, оно встречается в путях и командах.

Шаг 1. Проверьте, что хост подходит#

Четыре требования, каждое проверяется одной командой:

uname -m                        # архитектура: нужна x86_64
uname -r                        # ядро: нужно 5.1 или новее (io_uring)
ldd --version | head -1         # glibc: нужна 2.31 или новее
systemctl --version | head -1   # systemd обязателен
x86_64
5.15.0-119-generic
ldd (Ubuntu GLIBC 2.35-0ubuntu3.8) 2.35
systemd 249 (249.11-0ubuntu3.12)

Значения у вас будут свои; важно только, чтобы каждое было не ниже указанного минимума.

Установщик проверит то же самое

Если что-то не подходит, install.sh откажется ставиться и назовёт точную причину — например glibc 2.31+ required — host has 2.28. Ставить «через силу» не нужно: сервер на таком хосте не запустится.

Шаг 2. Установите сервер#

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

cd hastreamer          # каталог установщика из поставки
sudo ./install.sh

Установщик задаёт ровно один вопрос — код активации. Введите его; если кода пока нет, оставьте поле пустым и вернитесь к лицензии позже.

:: HASTREAMER installer — v1 (2026.08)
 ✓ host OK: Ubuntu 22.04.4 LTS · kernel 5.15.0-119-generic · glibc 2.35
 ✓ installed /usr/local/bin/hastreamer
 ✓ wrote /etc/hastreamer/hastreamer.conf
Enter the HASTREAMER activation code (blank = add later): <ваш код активации>
 ✓ activation code stored at /etc/hastreamer/license.txt
 ✓ hastreamer.service is active

 ✓ HASTREAMER installed and started (running as root).
  Admin:   http://media.example.com:8080/admin/
  Login:   password  SirinVideo   (change it in Admin → Settings, or edit /etc/hastreamer/hastreamer.conf)

Что появилось на сервере:

Что Куда
Исполняемый файл /usr/local/bin/hastreamer
Конфигурация /etc/hastreamer/hastreamer.conf
Лицензия /etc/hastreamer/license.txt
Каталог архива /var/lib/hastreamer/dvr
Служба hastreamer.service (работает от root)
Сетевые настройки хоста /etc/sysctl.d/99-hastreamer.conf

Установка не трогает уже существующий hastreamer.conf: при повторном запуске установщик напишет hastreamer.conf exists — left unchanged. Подробный разбор всех шагов установки — Установка с нуля.

Шаг 3. Убедитесь, что служба поднялась#

systemctl is-active hastreamer
journalctl -u hastreamer -n 20 --no-pager
active
hastreamer — 0 stream(s) · http :8080 (HLS+player+api) · rtsp :8554 · 8 cores (cpu affinity [0, 1, 2, 3, 4, 5, 6, 7])
hastreamer: NOT LICENSED (enforced) — online activation pending (HWID AQhF3kR7pZmT91…)
hastreamer: /metrics is CLOSED (it was public before 2026.08) — it accepts an admin session bearer only. Set auth.api_read_token to give a scraper its own non-admin credential.
hastreamer: license OK (enforced) — owner="example-customer" streams=50 expires=2027-01-31 updates-until=unlimited

Первая строка про лицензию (NOT LICENSED … activation pending) — нормальная: активация по коду идёт по сети уже после старта. Через несколько секунд появляется license OK (enforced) с вашей ёмкостью и сроком. Если вместо неё в журнале осталась только NOT LICENSED, разберитесь с лицензией сейчас — см. Лицензирование.

Порты, которые нужно открыть в межсетевом экране:

Порт Протокол Зачем
8080/tcp HTTP панель, API, HLS, DASH, MSE-WS, плеер
8554/tcp RTSP раздача по RTSP (плееры, видеостены, регистраторы)
40000/udp WebRTC медиа WebRTC (WHEP и WHIP)
Служба работает

systemctl is-active hastreamer печатает active, а в журнале есть строка license OK (enforced).

Шаг 4. Смените пароль администратора#

Установщик записал в конфигурацию пароль по умолчанию. Он одинаков на всех установках, поэтому меняйте его до того, как сервер станет доступен из сети:

# подставьте свой пароль вместо pridumayte-dlinnyy-parol
sudo sed -i 's/"SirinVideo"/"pridumayte-dlinnyy-parol"/' /etc/hastreamer/hastreamer.conf
sudo hastreamer --validate /etc/hastreamer/hastreamer.conf
/etc/hastreamer/hastreamer.conf: OK (0 streams)

Файл разобран, ошибок нет — применяйте:

sudo systemctl reload hastreamer
Строки tune: — это не ошибки

Перед выводом любой команды сервер печатает в поток ошибок одну-две строки вида tune: fd limit 524288 ✓ — это отчёт о настройке хоста. К разбору конфигурации они отношения не имеют; чтобы их скрыть, добавьте 2>/dev/null.

Проверяйте конфигурацию до перезапуска

--validate разбирает файл, ничего не запуская, и печатает ошибку с номером строки: parse /etc/hastreamer/hastreamer.conf: line 12: unknown stream directive "inpu". Опечатка в конфигурации — это не «настройка проигнорирована», а отказ запуска. Подробнее — Применение изменений.

Шаг 5. Войдите в панель управления#

Откройте в браузере http://media.example.com:8080/admin/ и введите новый пароль. Обращение к корню сервера (http://media.example.com:8080/) само переадресует на панель.

Слева — разделы: Overview (нагрузка и трафик), Streams (потоки), Sessions (зрители), Storage (архив), System (ресурсы хоста), Logs (журнал), Configuration (конфигурация и безопасность). Пока потоков нет, списки пустые — это ожидаемо. Полный разбор интерфейса — Веб-интерфейс.

Шаг 6. Получите токен API и проверьте лицензию#

Панель и API используют один и тот же пароль, но API просит обменять его на токен:

BASE=http://media.example.com:8080
TOKEN=$(curl -sS -X POST "$BASE/api/v1/auth/login" \
  -H 'Content-Type: application/json' \
  -d '{"password":"pridumayte-dlinnyy-parol"}' \
  | sed -n 's/.*"token":"\([^"]*\)".*/\1/p')
echo "${TOKEN:0:24}…"
eyJhbGciOiJIUzI1NiIsInR5…

Токен действует 12 часов и передаётся заголовком Authorization: Bearer. Проверьте им лицензию:

curl -sS "$BASE/api/v1/license" -H "Authorization: Bearer $TOKEN"
{"state":"licensed","customer":"example-customer","expires":"2027-01-31","max_streams":50,"hwid":"AQ7bXn2LkPvW…"}
Без лицензии панель работает, а видео — нет

Если "state" не равно "licensed", любой медиазапрос отвечает 403 license restricted, а панель и API продолжают работать. Это штатное поведение, а не сбой: max_streams из лицензии — это ещё и предел числа потоков. См. Лицензирование.

Шаг 7. Добавьте первый поток#

Поток — это блок в конфигурации: имя и источник. Источник demo:// — встроенный синтетический генератор: тест-таблица с часами, счётчиком кадров и звуком. Камера для него не нужна.

sudo tee -a /etc/hastreamer/hastreamer.conf >/dev/null <<'EOF'

stream demo {
  input demo://?vc=h264&res=1280x720&fps=25&ac=aac;
}
EOF
sudo hastreamer --validate /etc/hastreamer/hastreamer.conf
/etc/hastreamer/hastreamer.conf: OK (1 streams)
sudo systemctl reload hastreamer
journalctl -u hastreamer -n 5 --no-pager
config reload: applied epoch 3 (hash bee7bdae272e53af)
[demo] reconcile: None fp=0000000000000000 → Owner fp=5c45369a5a8af069
[demo] starting on core 0
[demo] connecting → <redacted-source> (chain of 1)

Перезагрузка по reload не разрывает сессии зрителей других потоков: запускается только то, что изменилось. Адрес источника в журнале скрыт — в нём могут быть логин и пароль.

Шаг 8. Проверьте поток через API#

curl -sS "$BASE/api/v1/streams/demo" -H "Authorization: Bearer $TOKEN" \
  | tr ',' '\n' | grep -E '"(id|alive|health|bitrate)":'
"alive":true
"bitrate":14649134.865134865
"health":"ok"
"id":"demo"

alive: true — источник подключён и кадры идут; health: "ok" — претензий к потоку нет. Теперь запросите плейлист — это ровно то, что запросит плеер:

curl -sS "$BASE/demo/master.m3u8"
#EXTM3U
#EXT-X-VERSION:9
#EXT-X-INDEPENDENT-SEGMENTS
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="audio",DEFAULT=YES,AUTOSELECT=YES,CHANNELS="1",URI="a0/playlist.fmp4.m3u8?sid=281474976710659"
#EXT-X-STREAM-INF:BANDWIDTH=10804946,AVERAGE-BANDWIDTH=9004122,CODECS="avc1.64001F,mp4a.40.2",RESOLUTION=1280x720,FRAME-RATE=25.000,AUDIO="audio",CLOSED-CAPTIONS=NONE
v0/playlist.fmp4.m3u8?sid=281474976710659

Разрешение, частота кадров и кодеки в плейлисте — те, что пришли от источника: сервер не перекодирует видео, он только переупаковывает его в нужный контейнер.

Шаг 9. Откройте видео в браузере#

http://media.example.com:8080/demo/embed.html

Откроется встроенный плеер: сверху — полоса вкладок с протоколами (HLS, LL-HLS, MSE-WS, DASH, WebRTC, Preview; недоступные для этого потока показаны блёклыми), в центре — видео, справа вверху — индикатор LIVE и текущая задержка. Никаких дополнительных файлов и внешних библиотек ставить не нужно: плеер отдаёт сам сервер. Переключение вкладок меняет протокол, а картинка остаётся той же — это тот же поток, упакованный по-разному.

Встраиваемый плеер с синтетическим потоком: часы, отметка времени и полоса переключения протоколов
Встраиваемый плеер с синтетическим потоком: часы, отметка времени и полоса переключения протоколов

Полоса сверху переключает протокол доставки на лету — один и тот же поток отдаётся всеми сразу. Надпись в правом верхнем углу показывает задержку до реального времени.

Видео играет

На тест-таблице идут часы, а секундная стрелка движется без рывков. Если картинки нет — Диагностика неисправностей.

Шаг 10. Убедитесь, что сервер видит зрителя#

Не закрывая вкладку с плеером, выполните:

curl -sS "$BASE/api/v1/totals" -H "Authorization: Bearer $TOKEN"
{"bytes_in":62914560,"bytes_out":18027312,"dvr_bytes_out":0,"dvr_sessions":0,"live_bytes_out":18027312,"live_sessions":1,"sessions":1,"streams":1}

streams: 1 — поток принимается, live_sessions: 1 — его кто-то смотрит. В панели то же самое видно в разделе Sessions: строка с протоколом (hls-fmp4), адресом клиента и объёмом отданных байт.

Установка завершена

Три независимые проверки сошлись: поток виден в панели (Streams — одна строка, состояние live), играет в плеере и отвечает по API (alive: true). Дальше сервер можно наполнять настоящими источниками.

Сценарий 2 — подключить настоящую камеру по RTSP#

Синтетический источник свою задачу выполнил. Заменим его камерой. Отличий от первого сценария всего два: другая строка input и то, что теперь на результат влияет чужое устройство.

1. Узнайте RTSP-ссылку камеры. Она есть в её веб-интерфейсе или в документации производителя и выглядит так:

rtsp://<логин>:<пароль>@<адрес камеры>:554/<путь, заданный производителем>

2. Добавьте поток и примените конфигурацию:

sudo tee -a /etc/hastreamer/hastreamer.conf >/dev/null <<'EOF'

stream cam1 {
  input rtsp://admin:parol@10.0.0.10:554/Streaming/Channels/101;
}
EOF
sudo hastreamer --validate /etc/hastreamer/hastreamer.conf
sudo systemctl reload hastreamer

3. Посмотрите, что происходит с подключением:

journalctl -u hastreamer -n 10 --no-pager
[cam1] starting on core 0
[cam1] connecting → rtsp://***@10.0.0.10:554/Streaming/Channels/101 (chain of 1)

4. Проверьте состояние потока (переменные BASE и TOKEN — из шага 6; токен живёт 12 часов, после этого получите его заново той же командой):

curl -sS "$BASE/api/v1/streams/cam1" -H "Authorization: Bearer $TOKEN" \
  | tr ',' '\n' | grep -E '"(alive|health|source_error)":'

Камера подключилась:

"alive":true
"health":"ok"
"source_error":null

Камера недоступна:

"alive":false
"health":"failing"
"source_error":"Timeout"

5. Откройте плеер: http://media.example.com:8080/cam1/embed.html.

Встраиваемый плеер: полоса вкладок с протоколами и живое видео с камеры
Встраиваемый плеер: полоса вкладок с протоколами и живое видео с камеры

Что делать, если что-то пошло не так:

Симптом Вероятная причина Что сделать
"source_error":"Timeout" камера недоступна с сервера проверьте маршрут до камеры и что порт 554/tcp открыт
Поток поднимается и падает по кругу неверный путь в ссылке или занят лимит подключений камеры сверьте ссылку в веб-интерфейсе камеры, уменьшите число одновременных клиентов у неё
Видео есть, звука нет камера отдаёт G.711 — браузер такой звук не декодирует почему не играет звук
Ничего не играет, а alive: true лицензия ограничивает медиавыдачу GET /api/v1/license, см. Лицензирование
Логин и пароль со спецсимволами

Если в пароле камеры есть @, : или /, закодируйте их в ссылке: @%40, :%3A, /%2F. Иначе разбор адреса оборвётся на первом же спецсимволе.

Транспорт RTSP выбирается глобально

По умолчанию сервер забирает RTSP по TCP — это надёжнее в сетях с NAT. Переключение на UDP задаётся одной директивой на весь сервер, а не на отдельный поток; подробности — RTSP, HLS, DASH, MPEG-TS.

Что дальше#

  • Приём видео: обзор — какой источник выбрать: RTSP, HLS, MPEG-TS, файл, публикация от кодировщика.
  • Приём публикации: RTMP и WHIP — если видео не забирается с камеры, а присылается кодировщиком или из браузера.
  • Запись архива (DVR) — хранилище установщик уже создал, для записи достаточно добавить в блок потока одну строку вида dvr local 24h 40G;.
  • Протоколы раздачи — что выбрать для браузера, мобильного приложения, приставки и видеостены.
  • Модель доступа — как закрыть просмотр: пароль администратора не защищает видео.
  • TLS и сертификаты — перевести панель и раздачу на HTTPS.
  • Мониторинг и метрики — метрики Prometheus, журнал, поток событий.
  • Термины — короткий словарь: фрагмент, сегмент, грант, билет, метка.
  • FAQ — короткие ответы на вопросы, которые возникают сразу после установки.