SIRINVIDEO CCTV Документация администратора и пользователя На сайт 2026.08

Проверка после установки

Чек-лист: сервисы, спаривание, лицензия, хранилище, видео и архив.

Пройдите этот список по порядку: каждый следующий пункт опирается на предыдущий. Если пункт не выполняется — не идите дальше, найдите симптом в таблице в конце.

Подготовьте переменные — они используются дальше во всех командах:

BASE=https://cctv.example.com
TOKEN=$(curl -sS -X POST "$BASE/api/v1/auth/login" \
  -H 'Content-Type: application/json' \
  -d '{"login":"admin","password":"ВАШ-ПАРОЛЬ"}' \
  | python3 -c 'import sys,json;print(json.load(sys.stdin)["token"])')
echo "${TOKEN:0:12}…"     # непустая строка = вход выполнен

1. Сервис Plane запущен#

systemctl is-active hastreamer-cctv-plane
sudo journalctl -u hastreamer-cctv-plane -n 20 --no-pager | tail -5
active
INFO hastreamer_plane: reconciler running (LISTEN cctv_config_changed + 60s anti-entropy)
INFO hastreamer_plane: serving listen=0.0.0.0:443 tls_mode="acme"

Ключевая строка — serving listen=… tls_mode=…: без неё сервис не принимает соединения.

2. Plane отвечает по сети#

curl -sS "$BASE/health"
# {"status":"ok","db":"up"}

Эндпоинт /health не требует авторизации и проверяет доступность базы. Ответ 503 со "db":"down" означает проблему с PostgreSQL, а не с самим Plane.

curl -sS -o /dev/null -w '%{http_code} verify=%{ssl_verify_result}\n' "$BASE/admin/"
# 200 verify=0

verify=0 — цепочка сертификата валидна. Для самоподписанного сертификата значение будет другим: это ожидаемо, см. TLS и сертификаты.

3. Вход администратора работает#

Если переменная TOKEN выше получилась непустой — этот пункт уже выполнен. Проверьте заодно версию сборки:

curl -sS "$BASE/api/v1/version" -H "Authorization: Bearer $TOKEN" \
  | python3 -c 'import sys,json;d=json.load(sys.stdin);print(d["version"], d["profile"])'
# 2026.8.0 release
Пароль по умолчанию должен быть уже сменён

Учётная запись admin с паролем SirinVideo одинакова на всех установках. Если вы ещё не меняли пароль — сделайте это сейчас: Пользователи → admin → Сменить пароль.

4. Сервис ноды запущен#

На сервере ноды:

systemctl is-active hastreamer-cctv-node
sudo journalctl -u hastreamer-cctv-node -b --no-pager | grep -m1 'stream(s)'
active
hastreamer — 0 stream(s) · http :9080 (HLS+player+api) · rtsp :8554 · 16 cores

Стартовая строка показывает фактический обычный порт и число рабочих ядер — сверьте их с ожидаемыми. Номер зависит от раскладки: :9080 у ноды на одном хосте с Plane, :80 у ноды на отдельном сервере, :8090 у ноды за TLS-прокси. Порт HTTPS в этой строке не печатается — проверить его можно sudo ss -tlnp | grep hastreamer.

5. Нода спарилась с Plane#

curl -sS "$BASE/api/v1/nodes" -H "Authorization: Bearer $TOKEN" \
  | python3 -c 'import sys,json;[print(n["name"], n["state"], n["version"], n["last_seen_at"]) for n in json.load(sys.stdin)]'
# sovetskiy-0 active 2026.8.0 2026-08-18T09:14:22Z

Требуется state = active, непустая version и свежий last_seen_at. В журнале ноды спаривание выглядит так:

config applied by admin → epoch 2 (68d0b9f93ab3999d)
[authio] jwks: loaded 1 key(s) from https://cctv.example.com

Состояние pending, которое не меняется, означает, что Plane не может достучаться до ноды — проверьте control_url и межсетевой экран.

6. Нода лицензирована#

В админке: Ноды → ваша нода → вкладка «Лицензия». Должны быть заполнены «Владелец», «Макс. потоков» и «Истекает»; там же показан HWID, под который выпускается код активации. Красный баннер лицензии над консолью означает, что видео проходить не будет, даже если всё остальное настроено верно. Надпись «Лицензия недоступна — нода недоступна или не сообщила о ней.» говорит о другом: Plane не достучался до ноды, и это отдельная неисправность — вернитесь к пункту 5. Разбор состояний — Лицензирование.

Та же проверка на самой ноде, если админка до неё не достучалась:

sudo journalctl -u hastreamer-cctv-node -b | grep -i licens | tail -1
# hastreamer-cctv: license OK (enforced) — owner="…" streams=500 expires=never updates-until=2027-01-01

7. Тюнинг хоста применён#

sudo journalctl -u hastreamer-cctv-node -b | grep -i 'tune:' | head -3
sysctl kernel.io_uring_disabled net.core.somaxconn
kernel.io_uring_disabled = 0
net.core.somaxconn = 65535

Строка tune: ⚠ host is not optimally tuned в журнале указывает, что часть параметров ядра применить не удалось — разбор в разделе Производительность.

8. Хранилище архива инициализировано#

NODE_ID=<UUID>
curl -sS "$BASE/api/v1/nodes/$NODE_ID/storages" -H "Authorization: Bearer $TOKEN" \
  | python3 -c 'import sys,json;[print(s["name"], s["path"], s["provisioning"]["state"]) for s in json.load(sys.stdin)]'
# dvr1 /mnt/dvr ready

Требуется состояние ready. Значение required означает, что диск ещё не инициализирован. На самой ноде в инициализированном каталоге появляется файл-маркер:

ls -a /mnt/dvr/
# .hastreamer-storage-identity
df -h /mnt/dvr

Диск без маркера считается неинициализированным и не принимает камеры с записью. Как инициализировать — Установка с нуля: Node и Хранилища DVR.

9. Камера в эфире#

curl -sS "$BASE/api/v1/cameras?limit=5" -H "Authorization: Bearer $TOKEN" \
  | python3 -m json.tool | grep -E '"name"|"enabled"'

Дескриптор конкретной камеры — самая быстрая проверка «отдаётся ли видео»:

CAM_ID=<UUID>
curl -sS "$BASE/api/v1/cameras/$CAM_ID/play" -H "Authorization: Bearer $TOKEN" \
  | python3 -m json.tool | grep -E '"live"|"availability"|"media_base"'
"live": true,
"availability": "ready",
"media_base": "https://node.example.com",

availability: "ready" и непустой media_base означают, что браузеру есть куда идти за видео. Значение node_offline или пустой media_base — проблема на стороне ноды, а не камеры.

10. Нода реально принимает потоки#

# -k нужен, только пока у ноды самоподписанный сертификат
curl -sSk https://node.example.com/metrics \
  | grep -E '^hastreamer_(streams|sessions) '
# hastreamer_streams 12
# hastreamer_sessions 0

hastreamer_streams должно быть больше нуля. Проверьте также, что данные от камер идут: у работающего потока счётчик «секунд без данных» близок к нулю.

curl -sSk https://node.example.com/metrics \
  | grep 'hastreamer_stream_no_data_seconds' | head -3
# hastreamer_stream_no_data_seconds{stream="cam/<UUID>/main"} 0

11. Живое видео открывается в браузере#

Откройте https://cctv.example.com/admin/Камеры → любую камеру. Картинка должна появиться за 1–3 секунды.

Если страница открывается, а плеер пустой — откройте консоль браузера. Сообщение о смешанном содержимом (mixed content) означает, что админка работает по HTTPS, а нода по HTTP. У ноды HTTPS включён с первого запуска, поэтому так бывает только если её завели по http:// — приведите адреса ноды к https:// либо поставьте перед ней TLS-прокси, см. TLS и сертификаты. Предупреждение о самоподписанном сертификате видео не блокирует: достаточно один раз принять исключение или заменить сертификат на доверенный.

12. Архив пишется#

curl -sS "$BASE/api/v1/cameras/$CAM_ID/archive" -H "Authorization: Bearer $TOKEN" \
  | python3 -m json.tool | grep -E '"dvr_path"|"media_base"'
# "dvr_path": "cam/<UUID>/main",
# "media_base": "https://node.example.com",

Ответ 403 no_dvr означает, что у пользователя нет права на архив; отсутствие dvr_path — что запись для камеры не включена.

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

du -sh /mnt/dvr/
sleep 120
du -sh /mnt/dvr/      # значение должно увеличиться

Финальная проверка — в админке: Камеры → камера → Архив, на таймлайне должны быть закрашенные интервалы записи.

Симптом → куда смотреть#

Симптом Где искать причину
systemctl is-active возвращает activating или failed journalctl -u <юнит> -n 50 — ошибка конфигурации называет файл и строку
/health отвечает 503, "db":"down" PostgreSQL: systemctl status postgresql, строка database_url в plane.toml
Вход не проходит, 401 Пароль или логин; сброс — sudo hastreamer-plane --reset-superadmin /etc/hastreamer-cctv/plane.toml
Нода в состоянии pending control_url, порт ноды, межсетевой экран между Plane и нодой
Нода отвечает браузерам, но в админке недоступна Адрес управления http:// у ноды со своим TLS: при редиректе теряется авторизация — TLS
NOT LICENSED (enforced) Лицензирование
Камера в списке, но availability не ready Нода отключена или камера выключена; связь с камерой: nc -vz <адрес-камеры> 554
hastreamer_streams равен нулю при добавленных камерах Лицензия либо сетевая доступность камер с ноды
Плеер пустой при рабочем API Смешанное содержимое: нода заведена по http://, а админка по HTTPS — TLS
Архив не растёт Хранилище не инициализировано, запись не включена или диск заполнен — Хранилища DVR
Всё работает, но с задержками и рывками Производительность

Более подробный разбор по симптомам — Диагностика неисправностей.