Быстрый старт
От чистого сервера до видео в браузере: установка, лицензия, первый поток и три независимые проверки — панель, плеер, 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 по TCP — это надёжнее в сетях с NAT. Переключение на UDP задаётся одной директивой на весь сервер, а не на отдельный поток; подробности — RTSP, HLS, DASH, MPEG-TS.
Что дальше#
- Приём видео: обзор — какой источник выбрать: RTSP, HLS, MPEG-TS, файл, публикация от кодировщика.
- Приём публикации: RTMP и WHIP — если видео не забирается с камеры, а присылается кодировщиком или из браузера.
- Запись архива (DVR) — хранилище установщик уже создал, для записи
достаточно добавить в блок потока одну строку вида
dvr local 24h 40G;. - Протоколы раздачи — что выбрать для браузера, мобильного приложения, приставки и видеостены.
- Модель доступа — как закрыть просмотр: пароль администратора не защищает видео.
- TLS и сертификаты — перевести панель и раздачу на HTTPS.
- Мониторинг и метрики — метрики Prometheus, журнал, поток событий.
- Термины — короткий словарь: фрагмент, сегмент, грант, билет, метка.
- FAQ — короткие ответы на вопросы, которые возникают сразу после установки.