Резервное копирование
Что бэкапить, как восстановить и что теряется без бэкапа.
Бэкапится 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 минут и обнаруживает недостающие ключи до того, как они понадобятся всерьёз.