Собственная инфраструктура
Серверы, мониторинг, шифрованные копии и проверка восстановления
Серверы, на которых работают мои сервисы. Копии шифруются на источнике, переживают недоступность приёмника в локальном спуле и доставляются после восстановления связи, а восстановление проверяется каждый день, а не в день аварии.
Ниже путь одной копии от сервера, где она снята, до ежедневной проверки восстановления. Отдельно показано, что происходит, пока приёмник недоступен, и чем подтверждается каждое решение.
- Сервисыдампы баз и конфигурация на каждом сервере
- Шифрованиекопия шифруется age прямо на источнике
- Спулотправка каждые 20 минут, доставка подтверждается сверкой sha256
Отказ
- Приёмник недоступен
- копия остаётся в спуле
- доставка продолжится после восстановления связи
- Приёмникхранит зашифрованные копии, ключ для расшифровки есть только у него
- Проверка восстановлениякаждый день разворачивает свежий дамп и сверяет число строк
Рядом
- Prometheus, Alertmanager, Grafanaметрики и алерты сервисов
- Резервный стендrunbook и стенд для переноса основного бота
Проверяемые решения
Ключ
Приватный ключ шифрования есть только у приёмника. Сервер, снявший копию, прочитать её уже не может.
Доставка
Доставка засчитывается только после совпадения хеша у отправителя и приёмника. Тревога срабатывает по возрасту последней подтверждённой доставки, а не по файлам в очереди.
Восстановление
Каждый день дамп разворачивается в одноразовый PostgreSQL той же мажорной версии, что в бою, и число строк сверяется с прошлым прогоном. Прогон 23.09.2026 прошёл.
Подробно
Копии
Копии снимаются на каждом сервере и сразу шифруются age. Приватный ключ есть только у приёмника, поэтому источник не может прочитать даже собственные старые копии. Потеря сервера не раскрывает историю его данных.
Доставка через спул
Отдельный приёмник может быть временно недоступен. Поэтому копия сначала ложится в локальный спул, а отправка идёт по таймеру каждые 20 минут: пока приёмника нет, копии ждут в спуле и уезжают, когда связь восстановится.
Доставка засчитывается только после того, как хеш принятого совпал с хешем отправленного. Оборванный поток приёмник тоже может принять, поэтому ответ «принял» ничего не доказывает. У отправителя своя тревога по возрасту последней подтверждённой доставки: очередь в спуле сама по себе нормальна, тревогу поднимает устаревшая доставка.
Проверка восстановления
Копия, которую ни разу не восстанавливали, это надежда, а не бэкап. Каждый день таймер расшифровывает свежие копии, разворачивает дамп базы в одноразовый контейнер той же мажорной версии PostgreSQL, что в бою, и сверяет число строк с прошлым удачным прогоном.
Аварии
После каждой серьёзной аварии пишется разбор, включая собственные ошибки. Один такой разбор ниже.
Бэкап, который удалил систему
Сервер отвечал на ping и пускал по SSH, но не мог запустить ни одного нового процесса. Два часа ушло на версию об отказе диска. Причиной оказался мой собственный скрипт отправки бэкапов, выкаченный за четыре минуты до аварии.
- Выкат скрипта отправки бэкапов
- Через 4 минуты
- Новые процессы не запускаются
- Восстановление со спасательного образа