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

Резервное копирование

Что бэкапить, как восстановить и что теряется без бэкапа.

Бэкапится Plane: в нём вся система — организации, пользователи, права, камеры, ноды, события и настройки. Ноды бэкапить не нужно: их конфигурацию Plane выдаёт заново. Записанный архив (DVR) в резервную копию, как правило, не входит — почему, объясняется ниже.

Минимальный набор#

Всё, что нужно, чтобы поднять работающую систему заново:

Что Почему обязательно
1 База cctv (дамп pg_dump -Fc) Организации, пользователи, права, камеры, ноды, события, интервалы, аудит, настройки
2 /etc/hastreamer-cctv/plane.toml Пароль базы, адрес и режим TLS, путь к вложениям, ключи доступа S3
3 /etc/hastreamer-cctv/plane-session.pem и plane-session.kid Ключ подписи сессий вместе с его номером поколения
4 /etc/hastreamer-cctv/tunnel-control.pem и tunnel-control.provisioning.key Управляющая пара для туннельных агентов и релеев
5 Каталог вложений (/var/lib/hastreamer-cctv/attachments по умолчанию) Сами файлы снимков и вложений — в базе лежат только ссылки на них

Настоятельно рекомендуется добавить:

  • /etc/hastreamer-cctv/.dbpass — сгенерированный пароль роли PostgreSQL;
  • /etc/hastreamer-cctv/plane-tls/account.pem — учётная запись ACME (восстановима, но повторная регистрация упирается в лимиты центра сертификации);
  • собственный сертификат и ключ, если используется режим own-cert — их система не восстановит;
  • изменённый systemd-юнит, если вы его правили.

Восстанавливать не нужно: plane-tls/identity.pem (сертификат выпускается заново), сам исполняемый файл и сгенерированные превью вложений.

Всё, кроме базы и вложений, лежит в одном каталоге

Проще всего архивировать целиком /etc/hastreamer-cctv — в нём и конфигурация, и все ключи, и .dbpass. Такой архив содержит секреты: держите его с правами 600 и не кладите в общий файловый ресурс.

Скрипт резервного копирования#

#!/usr/bin/env bash
# /usr/local/sbin/cctv-backup.sh — резервная копия контрол-плейна.
set -euo pipefail
DEST=/backup
STAMP=$(date +%F)
install -d -m 0700 "$DEST"

# 1. база
sudo -u postgres pg_dump -Fc cctv > "$DEST/cctv-$STAMP.dump"

# 2-4. конфигурация и все ключи одним архивом
tar czf "$DEST/cctv-etc-$STAMP.tgz" -C / etc/hastreamer-cctv

# 5. вложения событий (снимки и файлы)
tar czf "$DEST/cctv-evidence-$STAMP.tgz" -C /var/lib/hastreamer-cctv attachments

chmod 600 "$DEST"/cctv-*-"$STAMP".tgz "$DEST/cctv-$STAMP.dump"
find "$DEST" -name 'cctv-*' -mtime +30 -delete        # хранить 30 дней
echo "backup complete: $DEST"

Запуск раз в сутки. Расписание должно быть постоянным — оно обязано пережить перезагрузку:

sudo install -m 0700 cctv-backup.sh /usr/local/sbin/cctv-backup.sh
printf '30 3 * * * root /usr/local/sbin/cctv-backup.sh >> /var/log/cctv-backup.log 2>&1\n' \
  | sudo tee /etc/cron.d/cctv-backup >/dev/null
sudo chmod 0644 /etc/cron.d/cctv-backup

# проверить на следующий день, что копия появилась
ls -lh /backup
tail -5 /var/log/cctv-backup.log
Останавливать сервис не обязательно

pg_dump снимает согласованный снимок базы на работающей системе. Каталог вложений копируется «на ходу»: в худшем случае в архив не попадёт файл, добавленный в момент копирования. Если нужна абсолютная согласованность вложений — остановите сервис на время копирования (systemctl stop hastreamer-cctv-plane), видео на нодах при этом не прервётся.

Восстановление на чистом сервере#

# 1. поставить систему заново — ответы установщика значения не имеют,
#    конфигурация будет заменена из архива
sudo installers/hastreamer-cctv-plane/install.sh
sudo systemctl stop hastreamer-cctv-plane

# 2. восстановить базу
sudo -u postgres dropdb cctv && sudo -u postgres createdb -O hastreamer_cctv cctv
sudo -u postgres pg_restore -d cctv /backup/cctv-<дата>.dump

# 3. восстановить конфигурацию и ключи (перезапишет plane.toml, ключи и .dbpass)
sudo tar xzf /backup/cctv-etc-<дата>.tgz -C /

# 4. восстановить вложения
sudo tar xzf /backup/cctv-evidence-<дата>.tgz -C /var/lib/hastreamer-cctv

# 5. привести пароль роли в соответствие с восстановленным plane.toml
sudo -u postgres psql -c "ALTER ROLE hastreamer_cctv LOGIN PASSWORD 'ПАРОЛЬ-ИЗ-plane.toml'"

# 6. запустить
sudo systemctl start hastreamer-cctv-plane
sudo journalctl -u hastreamer-cctv-plane -n 60 --no-pager

Если у нового сервера другое имя или адрес — поправьте public_url, listen и секцию [tls] в plane.toml и перезапустите сервис. Ноды при этом трогать не нужно: они найдут Plane по адресу из своего node.conf, а если адрес изменился — перевыпустите их конфигурацию в админке.

Восстановление удалось
curl -sS https://cctv.example.com/health
# {"status":"ok","db":"up"}

Затем войдите в админку прежним паролем (он в базе) и убедитесь, что ноды вернулись в состояние active, а на камерах есть видео. Полный список — Проверка после установки.

Что ломается без каждого элемента#

Потеряно Последствие
База Потеряно всё: организации, пользователи, права, камеры, ноды, события, аудит. Записанное на дисках видео остаётся, но система о нём ничего не знает
plane.toml Не запустится подключение к базе (пароль был только там); придётся заново настраивать TLS, адреса и путь к вложениям
plane-session.pem / .kid Plane молча создаст новый ключ: все пользователи будут разлогинены, а ноды перестанут принимать ранее выданные токены доступа, пока не обновят ключи. Падения не происходит — но это смена личности установки
tunnel-control.pem / .provisioning.key Конфигурации туннельных агентов и релеев нельзя воспроизвести. Уже развёрнутые продолжают работать, новые — не выпустить, изолированные площадки остаются отрезанными
Каталог вложений В базе останутся записи о событиях, но снимки и файлы к ним не откроются: в базе только ссылки
.dbpass Ловушка при восстановлении: если восстановить plane.toml без .dbpass и заново запустить установщик, он сгенерирует новый пароль роли и применит ALTER ROLE, но plane.toml не тронет — и восстановленная строка подключения перестанет подходить. Лечится вручную: ALTER ROLE hastreamer_cctv LOGIN PASSWORD 'пароль из plane.toml'

Архив DVR: почему его обычно не бэкапят#

Записи лежат на дисках нод и измеряются десятками и сотнями терабайт: на 100 камер по 2 Мбит/с с глубиной 30 суток это ~65 ТБ (расчёт — Требования). Копия такого объёма стоит как ещё одна система хранения, а окно копирования не укладывается в сутки.

Поэтому отказ от резервного копирования архива — осознанное проектное решение, а не недоработка. Риск потери записей снижают другими средствами:

Средство Что даёт
RAID на дисках архива Переживает отказ отдельного диска без потери записей
Холодный уровень S3 Копия записей в объектном хранилище, настраивается на хранилище ноды
Разнесение камер по нодам Отказ одного сервера лишает архива только его камеры
Экспорт важных фрагментов Материалы по инцидентам выгружаются как файлы и хранятся отдельно

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

Что сохранить на ноде#

Ноду не бэкапят: node.conf в любой момент выдаётся заново из админки (Ноды → нода → Посмотреть конфигурацию). Сохранить стоит только две вещи:

  • код активации лицензии — он же лежит в /etc/hastreamer-cctv/license.txt;
  • собственный сертификат ноды, если он загружен вручную, а не выпущен автоматически.

Регламент#

Что Как часто
Полная копия (база + /etc + вложения) Ежедневно
Проверка, что копии создаются и не пустые Еженедельно (ls -lh /backup)
Учебное восстановление на тестовом сервере Раз в квартал
Копия за пределами площадки Согласно вашей политике хранения
Копия, которую ни разу не восстанавливали, — не копия

Единственное доказательство работоспособности бэкапа — развёртывание из него на отдельном сервере. Проводите такое учение хотя бы раз в квартал: оно занимает 15 минут и обнаруживает недостающие ключи до того, как они понадобятся всерьёз.