Установка с нуля
Пошаговая установка на чистый сервер: подготовка системы, бинарь и 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 |
поток закреплён за ядром и запущен |
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 |
Что дальше#
- TLS и сертификаты — включить HTTPS и получить сертификат автоматически.
- Применение изменений — что применяется по
reload, а что требуетrestart. - hastreamer.conf — все директивы — полный справочник конфигурации.
- Модель доступа — ограничить просмотр потоков.
- Обновление и удаление — обновление бинаря и откат.