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

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

Пошаговая установка на чистый сервер: подготовка системы, бинарь и systemd-юнит, первый конфиг, лицензия, запуск, проверка и смена пароля.

На выходе вы получите работающую службу hastreamer, панель управления по адресу http://media.example.com:8080/admin/ и один тестовый поток, который виден в браузере. Все команды выполняются от root (через sudo) на чистом сервере.

Перед началом убедитесь, что хост подходит: x86-64, ядро Linux 5.1 и новее, glibc 2.31 и новее, systemd. Полный список — Требования и подбор оборудования.

Состав установочного набора#

Вы получаете каталог со всем необходимым:

Файл Назначение
hastreamer сам сервер, один исполняемый файл
hastreamer.service юнит systemd
hastreamer.conf.template шаблон конфигурации
99-hastreamer.conf сетевые настройки ядра (/etc/sysctl.d/)
install.sh установщик: проверка хоста → бинарь → конфиг → лицензия → запуск
uninstall.sh удаление службы

Дальше описаны два пути: быстрый — установщиком, и ручной — теми же шагами, но вручную. Ручной путь стоит прочитать в любом случае: он объясняет, что именно оказывается на сервере.

Быстрый путь: установщик#

cd hastreamer
sudo ./install.sh

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

:: HASTREAMER installer — v1 (2026.08)
 ✓ host OK: Linux · kernel 6.8.0 · glibc 2.39
 ✓ 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

Установщик идемпотентен: повторный запуск не перезаписывает уже отредактированную конфигурацию (/etc/hastreamer/hastreamer.conf exists — left unchanged). Если кода активации под рукой нет, оставьте строку пустой и добавьте лицензию позже — служба запустится, но медиа отдавать не будет (см. Лицензирование).

После установщика переходите сразу к разделу Первый запуск и проверка.

Установка вручную#

Шаг 1. Проверьте хост#

uname -m && uname -r && ldd --version | head -1
x86_64
6.8.0-51-generic
ldd (GNU libc) 2.39

Разрядность должна быть x86_64, ядро — 5.1 или новее, glibc — 2.31 или новее. Убедитесь также, что io_uring не запрещён политикой ядра:

sysctl kernel.io_uring_disabled    # ожидается: kernel.io_uring_disabled = 0

Сообщение о том, что такого параметра нет, — не ошибка: значит, в этом ядре io_uring отключать нечем.

Шаг 2. Создайте каталоги#

sudo install -d -o root -g root -m 0755 /etc/hastreamer
sudo install -d -o root -g root -m 0755 /var/lib/hastreamer /var/lib/hastreamer/dvr

/etc/hastreamer — конфигурация и файл лицензии. /var/lib/hastreamer — рабочий каталог службы: там же сервер хранит состояние TLS (tls-state/), а dvr/ — каталог архива по умолчанию.

Шаг 3. Установите исполняемый файл#

sudo install -o root -g root -m 0755 ./hastreamer /usr/local/bin/hastreamer

Проверка:

sudo /usr/local/bin/hastreamer --print-hwid
tune: fd limit 524288 ✓
tune: ⚠ host is not optimally tuned. Run as root (or drop into /etc/sysctl.d/99-hastreamer.conf):
  …
A1B2c3D4e5F6g7H8i9J0k1L2m3N4

Последняя строка — аппаратный отпечаток хоста, он понадобится при лицензировании. Предупреждение host is not optimally tuned исчезнет после следующего шага.

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

Сервер настраивает лимиты и системные параметры до того, как выполнит запрошенное действие. В примерах ниже эти строки опущены — смотрите на последнюю строку вывода.

Шаг 4. Примените сетевые настройки ядра#

Создайте /etc/sysctl.d/99-hastreamer.conf:

sudo tee /etc/sysctl.d/99-hastreamer.conf >/dev/null <<'EOF'
# Расширенный диапазон эфемерных портов, буферы и очереди под тысячи соединений.
net.ipv4.ip_local_port_range = 1024 65535
net.core.netdev_max_backlog = 50000
net.core.somaxconn = 65535
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 131072 16777216
net.ipv4.tcp_wmem = 4096 16384 16777216
net.ipv4.udp_rmem_min = 16384
net.ipv4.udp_wmem_min = 16384
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
fs.file-max = 2097152
fs.nr_open = 2097152
vm.swappiness = 1
vm.max_map_count = 1048576

# io_uring — основа ввода-вывода сервера, он должен быть разрешён.
kernel.io_uring_disabled = 0

# ECN отключён намеренно: на части маршрутов согласование ECN приводит к потере
# фрагментов TLS ClientHello, и соединение зависает до завершения рукопожатия.
net.ipv4.tcp_ecn = 0
EOF
sudo sysctl --system >/dev/null
Настройки применились
sysctl net.ipv4.ip_local_port_range net.core.somaxconn
net.ipv4.ip_local_port_range = 1024	65535
net.core.somaxconn = 65535

Шаг 5. Установите юнит systemd#

sudo tee /etc/systemd/system/hastreamer.service >/dev/null <<'EOF'
[Unit]
Description=SirinVideo media streaming server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/var/lib/hastreamer
ExecStart=/usr/local/bin/hastreamer /etc/hastreamer/hastreamer.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=2s

# Предел дескрипторов: тысячи соединений плюс сокеты источников.
LimitNOFILE=1048576
# Регистрируемые буферы io_uring не должны упираться в лимит memlock.
LimitMEMLOCK=infinity

# Потолки ресурсов cgroup v2 — подберите под объём памяти хоста.
MemoryHigh=6G
MemoryMax=8G
TasksMax=8192
# Жёсткая квота процессора; 800% = восемь ядер. Раскомментируйте при необходимости.
# CPUQuota=800%

[Install]
WantedBy=multi-user.target
EOF

Разберите ключевые строки:

  • ExecStartпуть к конфигурации передаётся первым аргументом, другого способа указать её нет.
  • ExecReload — перезагрузка по сигналу SIGHUP: именно это делает systemctl reload hastreamer.
  • WorkingDirectory — от него отсчитываются относительные пути (например, хранилище TLS).
  • MemoryMax и CPUQuota — жёсткие потолки ядра. Оставьте хосту 1–2 ядра и запас памяти.

Шаг 6. Напишите первую конфигурацию#

SECRET=$(openssl rand -hex 32)
sudo tee /etc/hastreamer/hastreamer.conf >/dev/null <<EOF
http 8080;
rtsp 8554;
webrtc 40000;
low_latency on;
dvr_cleanup_secs 30;

# Хранилище архива. Пока ни один поток в него не пишет.
storage local /var/lib/hastreamer/dvr {
  segment_secs 900;
  evict_at_percent 90;
}

auth {
  admin_password "SirinVideo";
  session_secret "$SECRET";
}

# Синтетический источник: живое видео есть сразу, без камеры.
stream demo {
  input demo://?vc=h264&res=1280x720&fps=25&ac=aac;
}
EOF
sudo chmod 0640 /etc/hastreamer/hastreamer.conf

Что здесь есть и чего нет:

  • Протоколы раздачи не включаются по отдельности. Объявленного слушателя http достаточно, чтобы поток отдавался по HLS, DASH, MSE-WS и WebRTC, а rtsp — чтобы он же отдавался по RTSP.
  • session_secret подписывает токены входа. Он должен быть уникальным на каждой установке; если его не задать, сервер сгенерирует случайный при каждом старте и все сессии будут слетать при перезапуске.
  • admin_password — пароль входа в панель и в API. Пароль SirinVideo здесь временный, вы смените его на шаге Смена пароля.
Формат файла определяется расширением

.toml разбирается как TOML, .json — как JSON, любое другое расширение (включая .conf) — как текстовый формат директив, показанный выше. Все три формата приводятся к одной и той же модели и проходят одну и ту же проверку, поэтому выбор расширения ничего не меняет по существу. Придерживайтесь .conf — это основной формат, для него написаны все примеры документации.

Опечатка в конфигурации — жёсткая ошибка, а не предупреждение

Неизвестная директива, ошибка в значении перечисления или число вне диапазона прерывают запуск с указанием номера строки. Служба при этом уходит в цикл перезапуска (Restart=on-failure). Поэтому следующий шаг — обязательный.

Шаг 7. Установите лицензию#

Без действующей лицензии сервер запускается, панель и API отвечают, но ни один кадр не отдаётся. Запишите код активации в файл лицензии:

printf '%s\n' 'XXXX-XXXX-XXXX-XXXX' | sudo tee /etc/hastreamer/license.txt >/dev/null
sudo chmod 0644 /etc/hastreamer/license.txt

Путь /etc/hastreamer/license.txt фиксирован и не настраивается. Подробности, офлайн-вариант и диагностика — Лицензирование.

Шаг 8. Проверьте конфигурацию#

sudo hastreamer --validate /etc/hastreamer/hastreamer.conf
/etc/hastreamer/hastreamer.conf: OK (1 streams)

Если в файле есть ошибка, вывод выглядит так, и служба с таким файлом не стартует:

parse /etc/hastreamer/hastreamer.conf: line 3: unknown directive "cors"

Ошибки разбора (неизвестная директива, пропущенный ;, незакрытая скобка) сообщаются по первой встреченной. Ошибки проверки значений (несовместимые параметры, совпадающие порты) накапливаются и печатаются все сразу, через ; — их вы правите за один проход.

Канонический вид конфигурации

hastreamer --validate <файл> -j печатает разобранную конфигурацию в каноническом JSON — со всеми значениями по умолчанию, подставленными явно. Это ровно то представление, которое принимает PUT /api/v1/config, поэтому команда удобна и для сверки «что сервер на самом деле понял», и для подготовки изменений через API.

Первый запуск и проверка#

sudo systemctl daemon-reload
sudo systemctl enable --now hastreamer
systemctl is-active hastreamer
active

Посмотрите журнал первого старта:

sudo journalctl -u hastreamer -n 20 --no-pager
hastreamer — 1 stream(s) · http :8080 (HLS+player+api) · rtsp :8554 · 8 cores (cpu affinity [0, 1, 2, 3, 4, 5, 6, 7])
  /demo  ←  <redacted-source>
hastreamer: NOT LICENSED (enforced) — online activation pending (HWID A1B2c3D4e5F6g7H8i9J0k1L2m3N4)
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.
[demo] starting on core 0
hastreamer: license OK (enforced) — owner="example-customer" streams=50 expires=2027-01-31 updates-until=unlimited

Разберите строки:

Строка журнала Что означает
hastreamer — N stream(s) · http :8080 … сервер поднялся, перечислены слушатели и число рабочих ядер
/demo ← <redacted-source> поток объявлен; адрес источника печатается без пароля и без параметров запроса. Для камеры строка выглядит как /cam1 ← rtsp://***@10.0.0.10:554/Streaming/Channels/101, а у источников без узла (как demo://) — полностью скрыта
NOT LICENSED (enforced) — online activation pending лицензия ещё проверяется, это нормально в первые секунды
/metrics is CLOSED … метрики требуют авторизации; для системы сбора метрик задайте отдельный токен auth.api_read_token
license OK (enforced) — owner=… streams=… expires=… лицензия принята, медиа разрешено
[demo] starting on core 0 поток закреплён за ядром и запущен
Панель и API отвечают
curl -sS -X POST "http://media.example.com:8080/api/v1/auth/login" \
  -H 'Content-Type: application/json' \
  -d '{"password":"SirinVideo"}'
{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…","exp":1787186777}

Сохраните значение token в переменную и запросите состояние системы:

TOKEN=<значение token из ответа>
curl -sS "http://media.example.com:8080/api/v1/system" -H "Authorization: Bearer $TOKEN"
{"cpus":8,"worker_cores":8,"proc_cpu_cores":0.12,"rss_mb":134,"mem_total_mb":16000,
 "mem_available_mb":14800,"open_fds":62,"uptime_s":41, …}

Теперь откройте видео:

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

Должна появиться движущаяся тестовая картинка. Плейлист того же потока доступен по адресу http://media.example.com:8080/demo/index.m3u8.

Панель открывается, а видео нет

Первое, что нужно проверить, — лицензию. При запрете медиа любой запрос к медиа получает 403 Forbidden с телом license restricted, тогда как панель и API продолжают работать штатно. Проверьте sudo hastreamer --license-status и раздел Лицензирование.

curl -sS -o /dev/null -w '%{http_code}\n' "http://media.example.com:8080/demo/index.m3u8"
403

Вход в панель и смена пароля#

Откройте http://media.example.com:8080/admin/ и войдите паролем из блока auth. Токен сессии действует 12 часов.

Смените пароль сразу же — любым из двух способов.

В панели. Раздел Configuration → Security, панель Admin authentication, поле Admin password. Изменение применяется на лету, перезапуск не нужен. Там же включается Bind token to login IP — привязка выданного токена к IP-адресу, с которого выполнен вход.

В конфигурации.

sudo sed -i 's/admin_password "SirinVideo";/admin_password "новый-надёжный-пароль";/' \
  /etc/hastreamer/hastreamer.conf
sudo hastreamer --validate /etc/hastreamer/hastreamer.conf
sudo systemctl reload hastreamer

Блок auth применяется «горячо»: reload достаточно, зрители не отключаются.

Не оставляйте пароль по умолчанию и не удаляйте admin_password

Если директива admin_password отсутствует, административный доступ открыт: любой запрос к /api/v1/* проходит без проверки. Сервер при этом стартует и печатает предупреждение, но не отказывает. Пустое значение — жёсткая ошибка: auth.admin_password must not be empty (omit it entirely to disable auth).

Подбор пароля затруднён двумя механизмами: задержкой 600 мс перед каждым ответом об ошибке и нарастающей блокировкой по IP-адресу (от 600 мс до 30 с), общей для всех соединений сервера. Неверный пароль возвращает:

{"error":"invalid password"}

Первый поток от камеры#

Добавьте блок stream в конфигурацию:

stream cam1 {
  input rtsp://admin:пароль@10.0.0.10:554/Streaming/Channels/101;
  dvr local 24h 40G;    # необязательно: архив на 24 часа или 40 ГиБ
}

Примените изменения без перезапуска службы:

sudo hastreamer --validate /etc/hastreamer/hastreamer.conf
sudo systemctl reload hastreamer

Добавление и удаление потоков — «горячая» операция: перезапускается только затронутый поток, остальные и их зрители не замечают изменения. Проверьте результат:

curl -sS "http://media.example.com:8080/api/v1/streams" -H "Authorization: Bearer $TOKEN"

Видео камеры — по адресу http://media.example.com:8080/cam1/embed.html. Подробно об источниках — Приём видео: обзор, об архиве — Запись архива.

Если что-то пошло не так#

Симптом Причина Что делать
Служба в цикле перезапуска ошибка в конфигурации, выход с кодом 1 journalctl -u hastreamer -n 50 — в сообщении указан номер строки; исправьте и запустите снова
Address already in use порт занят другой службой смените порт в конфигурации или освободите его; порты применяются только при restart
Панель отвечает, видео нет (403 license restricted) нет действующей лицензии Лицензирование
401 {"error":"unauthorized"} на /metrics метрики закрыты и требуют авторизации передайте токен сессии или задайте auth.api_read_token для системы сбора метрик
Изменение порта не подействовало порты применяются только при перезапуске systemctl restart hastreamer, а не reload
Поток в состоянии ошибки источник недоступен проверьте адрес и учётные данные камеры; журнал: journalctl -u hastreamer -f
tune: ⚠ host is not optimally tuned не применён файл /etc/sysctl.d/99-hastreamer.conf вернитесь к шагу 4

Что дальше#