Проверка после установки
Чек-лист: сервисы, спаривание, лицензия, хранилище, видео и архив.
Пройдите этот список по порядку: каждый следующий пункт опирается на предыдущий. Если пункт не выполняется — не идите дальше, найдите симптом в таблице в конце.
Подготовьте переменные — они используются дальше во всех командах:
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 |
| Всё работает, но с задержками и рывками | Производительность |
Более подробный разбор по симптомам — Диагностика неисправностей.