Боевой сервер умер. Поднял из бэкапа за день
Проверка бэкапов случилась не на учениях: сервер отключили за неоплату, и вместе с ним легли панель управления, входящие подключения и все клиентские конфигурации. Восстановление из резервной копии из абстрактной галочки в чеклисте мгновенно стало единственным планом на день.
Что спасло
Бэкапы стояли заранее и на другом хосте: cron в 03:30 выгружал состояние на внешнее хранилище с ротацией за две недели. Это ровно тот случай, ради которого их и настраивают - не «когда-нибудь пригодится», а «сегодня, потому что вчерашний сервер больше не отвечает».
Ротация в 14 дней тут не случайная цифра: она переживает и выходные, и отпуск, но не превращает хранилище в свалку. За день восстановил панель, входящие подключения, транспорт и переключил CDN на новый адрес.
Две ловушки по дороге
Горячая подмена базы SQLite. Файл базы можно скопировать поверх работающего сервиса, и на вид всё будет хорошо ровно до перезапуска. У SQLite рядом с базой живёт журнал предзаписи, и часть свежих данных в момент копирования лежит именно там. Подменяешь только файл базы - журнал остаётся от старой, и они расходятся. Правильно - остановить сервис, свести журнал в базу и только потом трогать файлы.
Блокировка самого себя по SSH. Настройка сокета применилась раньше, чем я успел проверить доступ, и вход по сети закрылся. Дальше помогает только консоль провайдера - та самая, которую обычно не проверяют, пока она не понадобится. С тех пор порядок другой: сначала убедиться, что второй доступ есть и работает, потом менять то, через что ты сейчас подключён.
Вывод
Бэкап без проверенного восстановления - это не бэкап, а надежда. Сам инцидент оказался дешёвым ровно потому, что резервные копии и внешнее хранилище были подготовлены до того, как что-то сломалось, а не после.