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

Обновление и удаление

Порядок обновления Plane и нод, откат и полное удаление.

Plane и нода — два независимых сервиса, и обновляются они по отдельности. Обновление выполняется тем же установщиком, что и первичная установка: он заменяет исполняемый файл и systemd-юнит, не трогая конфигурацию, ключи, базу данных и лицензию.

Порядок#

  1. Резервная копияРезервное копирование. Без неё откат невозможен.
  2. Plane — сначала контрол-плейн.
  3. Ноды — по одной, дожидаясь возврата каждой в состояние active.
Почему именно в таком порядке

Plane знает, как разговаривать с нодами предыдущей версии, — обратное не гарантируется. Обновляя ноды по одной, вы всегда имеете рабочие ноды рядом и точно знаете, какая из них изменилась, если что-то пошло не так.

Что прерывается и на сколько#

Действие Что прерывается Длительность
Перезапуск Plane Админка и API; вход новых пользователей 2–5 секунд
Перезапуск Plane Живое видео и запись архива — не прерываются
Перезапуск ноды Видео и запись только этой ноды Секунды, зрители переподключаются автоматически
Перезапуск ноды В архиве этой ноды остаётся пропуск на время перезапуска Секунды

Живое видео переживает перезапуск Plane потому, что нода проверяет права зрителей самостоятельно, по заранее полученным ключам, и хранит копию своей конфигурации локально. Пока Plane недоступен, нельзя менять настройки — но видео и запись продолжаются.

Перед обновлением#

# 1. Зафиксируйте текущие версии
BASE=https://cctv.example.com
curl -sS "$BASE/api/v1/version" -H "Authorization: Bearer $TOKEN" | python3 -m json.tool
curl -sS "$BASE/api/v1/nodes"   -H "Authorization: Bearer $TOKEN" \
  | python3 -c 'import sys,json;[print(n["name"], n["version"]) for n in json.load(sys.stdin)]'

# 2. Сохраните текущие исполняемые файлы — установщик резервных копий НЕ делает
sudo cp -a /usr/local/bin/hastreamer-plane /root/hastreamer-plane.$(date +%F)   # на сервере Plane
sudo cp -a /usr/local/bin/hastreamer-cctv  /root/hastreamer-cctv.$(date +%F)    # на каждой ноде

# 3. Сделайте резервную копию базы и конфигурации (на сервере Plane)
sudo -u postgres pg_dump -Fc cctv > /root/cctv-$(date +%F).dump
sudo tar czf /root/cctv-etc-$(date +%F).tgz -C / etc/hastreamer-cctv
sudo chmod 600 /root/cctv-etc-*.tgz

Обновление Plane#

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

Что установщик делает при повторном запуске:

Объект Поведение
/usr/local/bin/hastreamer-plane Заменяется новой версией
hastreamer-cctv-plane.service Перезаписывается и перезагружается
/etc/hastreamer-cctv/plane.toml Не трогается — в журнале установки: plane.toml exists — left unchanged
Ключи (plane-session.pem, tunnel-control.pem) Сохраняются
База cctv, роль и пароль (.dbpass) Сохраняются; пароль берётся из существующего .dbpass
Пароль суперадминистратора Сохраняется — установка поверх существующей базы не сбрасывает его
Миграции схемы Применяются автоматически при первом старте новой версии

Проверка:

systemctl is-active hastreamer-cctv-plane
sudo journalctl -u hastreamer-cctv-plane -n 40 --no-pager | grep -E 'migrat|serving'
curl -sS "$BASE/health"
# {"status":"ok","db":"up"}

Обновление ноды#

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

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

Установщик заменит бинарь и юнит, обновит параметры ядра в /etc/sysctl.d/99-hastreamer.conf и сам перезапустит сервис, если node.conf на месте. Файл node.conf, диски и записанный архив не затрагиваются.

Вопрос о коде активации при обновлении

Установщик снова спросит код активации. Нажмите Enter — существующий /etc/hastreamer-cctv/license.txt перезаписан не будет. Ввод нового кода заменит файл. Для автоматического обновления без вопроса:

sudo installers/hastreamer-cctv-node/install.sh < /dev/null

Проверка перед переходом к следующей ноде:

systemctl is-active hastreamer-cctv-node
sudo journalctl -u hastreamer-cctv-node -n 20 --no-pager | grep -iE 'stream|licens'
curl -sS "$BASE/api/v1/nodes" -H "Authorization: Bearer $TOKEN" \
  | python3 -c 'import sys,json;[print(n["name"], n["state"], n["version"]) for n in json.load(sys.stdin)]'

Дождитесь state = active и новой версии, затем переходите к следующей ноде. Полный чек-лист — Проверка после установки.

Откат#

# нода
sudo systemctl stop hastreamer-cctv-node
sudo install -m 0755 /root/hastreamer-cctv.<дата> /usr/local/bin/hastreamer-cctv
sudo systemctl start hastreamer-cctv-node

# Plane
sudo systemctl stop hastreamer-cctv-plane
sudo install -m 0755 /root/hastreamer-plane.<дата> /usr/local/bin/hastreamer-plane
sudo systemctl start hastreamer-cctv-plane

Откат ноды безопасен: вся её конфигурация приходит от Plane.

Откат Plane может потребовать восстановления базы

Новая версия применяет миграции схемы при первом запуске. После этого старый исполняемый файл может не запуститься на изменённой базе. Если после отката в журнале есть ошибки схемы, восстановите базу из дампа, снятого перед обновлением:

sudo systemctl stop hastreamer-cctv-plane
sudo -u postgres dropdb cctv && sudo -u postgres createdb -O hastreamer_cctv cctv
sudo -u postgres pg_restore -d cctv /root/cctv-<дата>.dump
sudo systemctl start hastreamer-cctv-plane

Всё, что произошло после снятия дампа (события, записи журнала аудита, изменения настроек), при этом теряется. Именно поэтому дамп перед обновлением обязателен.

Удаление ноды#

# оставить node.conf, лицензию и рабочий каталог
sudo installers/hastreamer-cctv-node/uninstall.sh

# удалить и конфигурацию, и рабочий каталог ноды
sudo installers/hastreamer-cctv-node/uninstall.sh --purge

Скрипт останавливает и удаляет сервис, юниты, /etc/sysctl.d/99-hastreamer.conf и бинарь. С флагом --purge дополнительно удаляются /etc/hastreamer-cctv-node (там node.conf) и /var/lib/hastreamer-cctv-node (рабочий каталог, в том числе хранилище TLS).

Записанный архив на отдельном диске не удаляется

--purge очищает только рабочий каталог ноды. Архив, лежащий на отдельной точке монтирования (например /mnt/dvr), остаётся на месте — удаляйте его вручную, если он больше не нужен. Это же свойство позволяет переустановить ноду, не потеряв записи.

После удаления ноды из системы удалите её и в Plane: Ноды → нода → Отключить (или POST /api/v1/nodes/<UUID>/retire), иначе она останется в списке как недоступная.

Удаление Plane#

# сохранить базу и конфигурацию
sudo installers/hastreamer-cctv-plane/uninstall.sh

Без флага удаляются только сервис, юнит и бинарь; база, /etc/hastreamer-cctv и /var/lib/hastreamer-cctv остаются — систему можно поднять заново установщиком.

--purge уничтожает базу данных без возможности восстановления
sudo installers/hastreamer-cctv-plane/uninstall.sh --purge

Эта команда безвозвратно удаляет:

  • базу cctv и роль hastreamer_cctv — все организации, пользователи, камеры, ноды, события и журнал аудита;
  • каталог /etc/hastreamer-cctv — конфигурацию и все ключи, включая ключ подписи сессий;
  • каталог /var/lib/hastreamer-cctv — вложения событий (снимки и файлы).

Отменить это нельзя. Восстановление возможно только из резервной копии — см. Резервное копирование. Перед запуском команды снимите дамп базы, даже если удаление кажется окончательным.

Отдельная ловушка при совмещении на одном сервере: файл лицензии ноды лежит в /etc/hastreamer-cctv/license.txt, то есть в удаляемом каталоге. Если Plane и нода стоят на одном хосте, --purge уничтожит и лицензию ноды — сохраните её копию заранее.

Проверка, что ничего не осталось#

systemctl list-units --all | grep -i hastreamer      # пусто
ls /usr/local/bin | grep -i hastreamer               # пусто
ls -d /etc/hastreamer-cctv* /var/lib/hastreamer-cctv* 2>/dev/null
sudo -u postgres psql -l | grep cctv                 # пусто после --purge