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

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

Полная последовательность установки контрол-плейна на чистый сервер Linux — от проверки системы до первого входа в админку.

Plane и нода на одном сервере? Эта страница вам не нужна

Для одиночного сервера есть совмещённый установщик: он ставит контрол-плейн и ноду сразу, связывает их между собой и задаёт всего три вопроса. Порты при этом фиксированы — Plane 443 (плюс 80 для Let's Encrypt), нода 9443 (плюс 9080), выбирать ничего не надо.

sudo installers/hastreamer-cctv-all/install.sh

Порядок и что он делает — Установка с нуля: Node. Страница ниже нужна, когда Plane стоит на отдельном сервере, а ноды — на своих.

Ниже — установка с нуля на чистый сервер. Каждый шаг можно выполнить копированием команды.

Что вы получите в конце

Работающий контрол-плейн: веб-админка по вашему домену, REST API, база данных, учётная запись суперадминистратора. Видео на этом этапе ещё нет — оно появится после установки ноды.

Шаг 0. Проверка сервера#

Выполните на будущем сервере Plane:

# архитектура, ядро, версия glibc
uname -m                                  # ожидается: x86_64
uname -r                                  # ожидается: 5.1 или выше
ldd --version | head -1                   # ожидается: 2.31 или выше

# systemd и openssl обязательны
command -v systemctl openssl >/dev/null && echo "systemd + openssl OK"

# свободное место (база и вложения событий растут)
df -h /var
Проверка Требование Если не выполняется
Архитектура x86_64 Сборки под ARM поставляются отдельно
Ядро ≥ 5.1 Обновите ядро; для Plane это мягкое требование, для ноды — жёсткое
glibc ≥ 2.31 Ubuntu 20.04+, Debian 11+, RHEL 9+
Права root (sudo) Сервис слушает привилегированные порты 80/443
Диск под /var от 20 ГБ База, журналы и вложения событий

Синхронизация времени#

Токены доступа и сертификаты чувствительны к часам. Убедитесь, что время синхронизировано:

timedatectl status | grep -E "synchronized|NTP"
# System clock synchronized: yes

Шаг 1. DNS и порты#

Если планируется HTTPS с автоматическим сертификатом Let's Encrypt (режим acme — рекомендуемый), до установки должны выполняться два условия:

  1. Домен резолвится на этот сервер:

    getent hosts cctv.example.com     # должен вернуть внешний IP этого сервера
    curl -s https://api.ipify.org; echo   # фактический внешний IP сервера
    
  2. Порт 80 доступен из интернета — на него приходит проверка Let's Encrypt.

Откройте порты в межсетевом экране:

# ufw (Ubuntu/Debian)
sudo ufw allow 80/tcp comment 'ACME challenge'
sudo ufw allow 443/tcp comment 'SirinVideo CCTV plane'

# firewalld (RHEL/CentOS/Alma/Rocky)
sudo firewall-cmd --permanent --add-service=http --add-service=https
sudo firewall-cmd --reload
Порт 80 нужен и после установки

Сертификат Let's Encrypt обновляется автоматически каждые ~60 дней, и для продления снова требуется доступный извне порт 80. Не закрывайте его после установки.

Шаг 2. Запуск установщика#

Установщик интерактивный: он задаёт вопросы и сам собирает конфигурацию.

sudo installers/hastreamer-cctv-plane/install.sh

Что он делает:

  1. Проверяет систему (архитектура, glibc, systemd, openssl).
  2. Устанавливает PostgreSQL, если его нет, создаёт роль hastreamer_cctv и базу cctv.
  3. Спрашивает режим доступа, домен, порт и публичный URL.
  4. Генерирует ключ подписи сессий и файл /etc/hastreamer-cctv/plane.toml.
  5. Устанавливает бинарь /usr/local/bin/hastreamer-plane и unit hastreamer-cctv-plane.service.
  6. Применяет миграции базы и запускает сервис.
  7. Создаёт суперадминистратора: логин admin, пароль по умолчанию SirinVideo.

Ответы на вопросы установщика#

Вопрос Что отвечать
Режим доступа acme для публичного домена; http — если впереди реверс-прокси; self-signed — для теста в локальной сети; own-cert — если сертификат уже есть
Hostname Домен, по которому будут заходить пользователи: cctv.example.com
Порт 443 для режимов с TLS, 8080 для http
Public URL Полный URL, как его видит браузер: https://cctv.example.com
Контакт ACME Почта для уведомлений Let's Encrypt об истечении сертификата

Установка без вопросов (автоматизация)#

Любой ответ задаётся переменной окружения — тогда установщик не спрашивает ничего:

sudo HASTREAMER_PLANE_TLS_MODE=acme \
     HASTREAMER_PLANE_HOSTNAME=cctv.example.com \
     HASTREAMER_PLANE_PORT=443 \
     HASTREAMER_PLANE_PUBLIC_URL=https://cctv.example.com \
     HASTREAMER_PLANE_ACME_EMAIL=admin@example.com \
     installers/hastreamer-cctv-plane/install.sh

Полная таблица переменных — в разделе plane.toml — все параметры.

Шаг 3. Проверка запуска#

systemctl is-active hastreamer-cctv-plane        # active
sudo journalctl -u hastreamer-cctv-plane -n 30 --no-pager

В журнале успешного запуска должны быть строки такого вида:

INFO hastreamer_plane: event system ready (durable template invalidation + LISTEN → SSE bus)
INFO hastreamer_plane: service intervals reconciled at boot node_offline=0 stream_down=0
INFO hastreamer_plane: reconciler running (LISTEN cctv_config_changed + 60s anti-entropy)
INFO hastreamer_plane::tls: ACME plane identity active; automatic renewal scheduled
INFO hastreamer_plane: serving listen=0.0.0.0:443 tls_mode="acme"

Ключевая строка — последняя: serving listen=… tls_mode=…. Если её нет, смотрите диагностику ниже.

Проверка снаружи#

curl -sS -o /dev/null -w "%{http_code}\n" https://cctv.example.com/api/v1/version
# 401 — сервис работает и требует авторизации (это нормальный ответ)

Ответ 401 означает успех: API отвечает и защищён. Ответ 000 — сервис недоступен по сети, 502/504 — проблема на реверс-прокси перед Plane.

Шаг 4. Первый вход и смена пароля#

Откройте https://cctv.example.com/admin/ и войдите:

  • Логин: admin
  • Пароль: SirinVideo
Смените пароль немедленно

Пароль SirinVideo одинаков на всех установках и известен публично. Смените его при первом входе: Пользователи → admin → Сменить пароль.

Если новый пароль утерян, на сервере выполните:

sudo hastreamer-plane --reset-superadmin /etc/hastreamer-cctv/plane.toml

Команда выдаст одноразовый случайный пароль.

То же самое через API:

BASE=https://cctv.example.com
TOKEN=$(curl -sS -X POST "$BASE/api/v1/auth/login" \
  -H 'Content-Type: application/json' \
  -d '{"login":"admin","password":"SirinVideo"}' | python3 -c 'import sys,json;print(json.load(sys.stdin)["token"])')

USER_ID=$(curl -sS "$BASE/api/v1/users" -H "Authorization: Bearer $TOKEN" \
  | python3 -c 'import sys,json;print([u["id"] for u in json.load(sys.stdin)["rows"] if u["login"]=="admin"][0])')

curl -sS -X POST "$BASE/api/v1/users/$USER_ID/password" \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"password":"НОВЫЙ-СЛОЖНЫЙ-ПАРОЛЬ"}'

Шаг 5. Что создано на диске#

Путь Назначение Бэкап
/etc/hastreamer-cctv/plane.toml Конфигурация, включая пароль БД и ключ сессий Обязательно
/var/lib/hastreamer-cctv/ Рабочий каталог: TLS-хранилище, вложения событий Обязательно
/usr/local/bin/hastreamer-plane Исполняемый файл Не нужно
/etc/systemd/system/hastreamer-cctv-plane.service Unit systemd Желательно
База cctv в PostgreSQL Все данные системы Критично

Подробно — в разделе Резервное копирование.

Права на конфигурацию

В plane.toml лежат пароль базы и ключ подписи сессий. Файл должен быть доступен только root:

sudo chmod 600 /etc/hastreamer-cctv/plane.toml
sudo chown root:root /etc/hastreamer-cctv/plane.toml

Шаг 6. Что дальше#

  1. Создайте организацию и пользователей — Организации, Пользователи и права.
  2. Установите первую ноду — Установка с нуля: Node.
  3. Добавьте камеры — Добавление камер.

Что делать, если не запустилось#

Симптом в журнале Причина Решение
database_urlconnection refused PostgreSQL не запущен или не принимает подключения systemctl status postgresql, проверьте database_url в plane.toml
password authentication failed Пароль БД в конфиге не совпадает с ролью Задайте пароль роли заново: sudo -u postgres psql -c "ALTER ROLE hastreamer_cctv PASSWORD '…'"
Address already in use Порт 443 или 80 занят (nginx, apache) Освободите порт или выберите режим http с другим портом и поставьте прокси впереди
ACME … issuance failed Порт 80 закрыт снаружи либо DNS не указывает на этот сервер Проверьте firewall и getent hosts; Plane продолжит работать с временным сертификатом и повторит выпуск сам
Сервис перезапускается в цикле Ошибка в plane.toml sudo journalctl -u hastreamer-cctv-plane -n 50; синтаксис — plane.toml
Plane не падает из-за сертификата

Если выпуск Let's Encrypt не удался, Plane всё равно поднимется — на временном самоподписанном сертификате (браузер покажет предупреждение), и будет повторять выпуск в фоне с нарастающим интервалом. Как только порт 80 и DNS исправлены, настоящий сертификат подставится автоматически, без перезапуска сервиса.