Установка с нуля: Plane
Полная последовательность установки контрол-плейна на чистый сервер Linux — от проверки системы до первого входа в админку.
Для одиночного сервера есть совмещённый установщик: он ставит контрол-плейн и ноду сразу, связывает их между собой и задаёт всего три вопроса. Порты при этом фиксированы — 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 — рекомендуемый),
до установки должны выполняться два условия:
-
Домен резолвится на этот сервер:
getent hosts cctv.example.com # должен вернуть внешний IP этого сервера curl -s https://api.ipify.org; echo # фактический внешний IP сервера
-
Порт 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
Сертификат Let's Encrypt обновляется автоматически каждые ~60 дней, и для продления снова требуется доступный извне порт 80. Не закрывайте его после установки.
Шаг 2. Запуск установщика#
Установщик интерактивный: он задаёт вопросы и сам собирает конфигурацию.
sudo installers/hastreamer-cctv-plane/install.sh
Что он делает:
- Проверяет систему (архитектура, glibc, systemd, openssl).
- Устанавливает PostgreSQL, если его нет, создаёт роль
hastreamer_cctvи базуcctv. - Спрашивает режим доступа, домен, порт и публичный URL.
- Генерирует ключ подписи сессий и файл
/etc/hastreamer-cctv/plane.toml. - Устанавливает бинарь
/usr/local/bin/hastreamer-planeи unithastreamer-cctv-plane.service. - Применяет миграции базы и запускает сервис.
- Создаёт суперадминистратора: логин
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. Что дальше#
- Создайте организацию и пользователей — Организации, Пользователи и права.
- Установите первую ноду — Установка с нуля: Node.
- Добавьте камеры — Добавление камер.
Что делать, если не запустилось#
| Симптом в журнале | Причина | Решение |
|---|---|---|
database_url … connection 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 |
Если выпуск Let's Encrypt не удался, Plane всё равно поднимется — на временном самоподписанном сертификате (браузер покажет предупреждение), и будет повторять выпуск в фоне с нарастающим интервалом. Как только порт 80 и DNS исправлены, настоящий сертификат подставится автоматически, без перезапуска сервиса.