Резервное копирование и восстановление
Обновления схемы базы данных работают только вперёд — пути отката нет. Резервная копия, созданная командой vision backup, — ваш единственный способ откатиться, поэтому она входит в процедуру обновления, а не является необязательным дополнением.
Создание резервной копии
Заголовок раздела «Создание резервной копии»sudo vision backup --output /root/Простоя нет: снимок базы данных делается через SQLite VACUUM INTO, который создаёт согласованную копию на момент времени, пока сервис продолжает запись, причём копия уже прошла checkpoint — архив никогда не содержит вспомогательных файлов WAL/SHM, поэтому класс повреждений «старый WAL восстановлен поверх новой базы данных» исключён. Исходная база данных сначала проверяется на целостность; резервная копия повреждённой базы данных отклоняется, чтобы не перезаписать ваш последний исправный архив.
Что внутри архива
Заголовок раздела «Что внутри архива»vision-backup-<host>-<timestamp>.tar.gz└── vision-backup-<host>-<timestamp>/ ├── manifest.json what's inside, schema version, encryption key ids ├── vision.db consistent database snapshot ├── config.yaml ├── vision.env secrets — omit with --no-secrets ├── license.txt license serial — omitted with --no-secrets ├── maps/… floor-plan images — omit with --no-maps └── systemd/vision.service reference only; restore never writes itВключено по умолчанию:
vision.env(секреты). Ключ шифрования, который защищает каждый зашифрованный столбец — учётные данные камер и Alta, секреты хранилища и SMTP, ключи подписи webhook — существует только в этом файле. Архив без него не может расшифровать базу данных, с которой он связан, поэтому секреты включаются по умолчанию; архив записывается с правами0600.license.txt. Серийный номер лицензии, если он есть на хосте (Лицензирование).restoreвозвращает его какvision:vision 0600. Без него восстановленный хост запускается заблокированным, пока его не активируют заново.maps/. Фоны планов этажей — единственные загруженные операторами файлы вне базы данных, а строки базы данных, которые на них ссылаются, хранятся в том же архиве — если не включить изображения, «успешное» восстановление незаметно даст планы без фонов.
Исключено, причина записана в манифесте:
- Клипы и скриншоты — управляются политикой хранения и могут быть созданы заново; их включение сделало бы обычные резервные копии многогигабайтными.
- Записи HLS — они находятся в собственном хранилище сервера Alta и никогда не попадают на хост Vision.
- Бинарный файл — его версия записана в манифесте, но резервная копия — это откат данных, а не откат кода.
Используйте --force, чтобы заменить существующий выходной архив. --recover-wal сначала открывает базу данных на чтение и запись, чтобы восстановить устаревший WAL; запустите sudo vision doctor и применяйте его, только когда команда это рекомендует. Для нестандартных установок передайте --config PATH или --db PATH.
Восстановление
Заголовок раздела «Восстановление»sudo vision restore /root/vision-backup-<host>-<timestamp>.tar.gzПоследовательность намеренно осторожная:
- Всё проверяется до того, как что-либо на диске изменится — манифест, контрольная сумма каждого файла и содержимое архива проверяются до любой записи. Относитесь к архиву от другого человека как к любому недоверенному файлу.
- Проверка схемы. Архив от более новой сборки отклоняется сразу — сначала обновите бинарный файл. Более старый архив восстанавливается с предупреждением: при следующем запуске сервис выполнит его миграцию вперёд, а это необратимо.
- Проверка ключа. Если в архиве нет
vision.env, записанные в нём идентификаторы ключей шифрования должны совпадать с ключом, который у вас сейчас есть, иначе восстановление отклоняется (--force-key-mismatchотменяет эту проверку). - Отказ, пока сервис работает. Передайте
--stop-service, чтобы команда остановила сервис за вас — restore никогда не запускает его обратно, чтобы проблемы проявились до запуска сервиса. - Подтверждение вводом. Для продолжения нужно ввести
restore <this hostname>— команда из инструкции, вставленная не на ту машину, завершится ошибкой, а не выполнится. - Сначала создаётся страховочная резервная копия текущего состояния. Если это не удалось, больше ничего не происходит.
- Файлы заменяются, устаревшие вспомогательные файлы WAL удаляются, схема восстановленной базы данных проверяется — любой сбой на этом этапе откатывает всё.
После этого запустите сервис самостоятельно:
sudo vision doctorsudo vision startsudo vision statusvision doctor напоминает удалить страховочный архив pre-restore-*, когда вы убедитесь, что восстановление прошло хорошо.
Для неинтерактивной инструкции явно передайте --yes:
sudo vision restore /root/vision-backup.tar.gz --stop-service --yesУчебное восстановление
Заголовок раздела «Учебное восстановление»Резервная копия, которую никто не восстанавливал, — это не резервная копия. Выполняйте это раз в квартал:
sudo vision restore <latest-archive> --dry-run--dry-run выполняет полную проверку — манифест, контрольные суммы, схему и совместимость ключей — и выводит, что было бы сделано, ничего не записывая. Это доказывает, что архив цел и восстанавливается на той машине, которой он действительно понадобится.
Восстановление на другом хосте
Заголовок раздела «Восстановление на другом хосте»Восстановление на другое оборудование поддерживается — команда предупреждает, когда архив пришёл с другого хоста, а поскольку подтверждение вводом всегда называет хост, на котором вы сейчас находитесь, строка из инструкции, скопированная не на ту машину, всё равно безопасно завершится ошибкой. После восстановления на другом хосте проверьте http.allowed_origins в восстановленной конфигурации перед запуском — там может по-прежнему стоять старый хост.
license.txt из архива — это устройство старого хоста. Если старый хост всё ещё работает, оба теперь используют одну лицензию: удалите старое устройство в вашем профиле Cesbo (лицензия → Manage device) или активируйте новый хост как его замену (Лицензирование).
Расписание
Заголовок раздела «Расписание»Достаточно строки cron; команде не нужна координация с работающим сервисом:
15 3 * * * root /usr/local/bin/vision backup --output /var/backups/vision/ >>/var/log/vision-backup.log 2>&1Старые архивы ротируйте самостоятельно, например:
find /var/backups/vision -name 'vision-backup-*.tar.gz' -mtime +30 -deleteКаждый архив по умолчанию содержит ваш ключ шифрования — применяйте к хранилищу резервных копий те же средства контроля доступа, что и к /etc/vision/vision.env.