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