Построение бэкапа сервера без доступа к гипервизору: restic, шифрование, retention‑политика и регулярная проверка восстановления

Содержание

В аренде VPS/VDS доступ к гипервизору обычно отсутствует: нельзя снять полноценный снапшот диска «снаружи», нет консоли гипервизора, а функции резервного копирования провайдера либо недоступны, либо не дают нужной гибкости. В таких условиях резервное копирование приходится строить внутри гостевой ОС – как агентный файловый бэкап с обязательной проверкой восстановления.

Бэкап VPS без гипервизора: restic, шифрование, retention и проверка восстановления

Ниже описан прикладной сценарий для Linux‑виртуального сервера: хранение резервных копий вне защищаемого узла, шифрование «на стороне сервера», политика удержания (retention) и регулярное тестовое восстановление. В качестве инструмента используется restic – он подходит для VPS/VDS именно тем, что не требует поддержки со стороны гипервизора и при этом обеспечивает криптографически защищенный, дедуплицированный репозиторий.

Контекст: что меняется, когда нет доступа к гипервизору

В отличие от «образов дисков» и гипервизорных снапшотов, агентный файловый бэкап работает на уровне файловой системы и приложений. Это накладывает важные ограничения:

  • Консистентность данных приходится обеспечивать самостоятельно (особенно для СУБД и очередей)
  • Восстановление «в ноль» обычно означает: развернуть новый VPS/VDS, поставить пакеты/сервисы, затем вернуть конфигурацию и данные из бэкапа
  • Скорость восстановления определяется не только размером данных, но и готовностью «bootstrap‑процедуры» (переустановка, конфиги, ключи, сертификаты)

При аренде виртуальных серверов у разных провайдеров – например, у VPS.house – типовая картина одинаковая: внутри ОС есть root‑доступ, а вот управлять снапшотами гипервизора напрямую нельзя. Поэтому реальная надежность бэкапа складывается из трех вещей: корректного набора данных, надежного внешнего хранилища и регулярно проверяемого восстановления.

Почему restic подходит для VPS/VDS‑бэкапа

restic – утилита резервного копирования с репозиторием, который:

  • Шифруется на клиенте (до отправки в хранилище). Даже если репозиторий окажется скомпрометирован, содержимое без пароля не читается
  • Дедуплицируется: одинаковые блоки данных не хранятся повторно, что снижает расход места при регулярных бэкапах
  • Проверяет целостность с помощью криптографических хэшей и команды restic check
  • Поддерживает разные бэкенды: S3‑совместимое object storage, SSH/SFTP на отдельный сервер, локальные диски и другие варианты

Важный практический момент: restic по умолчанию предполагает, что хранилищу доверять нельзя. Поэтому шифрование и контроль целостности – не «опции», а базовая часть модели.

Выбор места для репозитория: S3 или отдельный сервер по SSH

Сценарий «бэкап на тот же VPS» почти не решает задачу: при взломе, ошибке администратора, удалении данных или отказе диска резервная копия исчезает вместе с сервером. Нужен внешний репозиторий. На практике для VPS/VDS чаще выбираются два пути.

S3‑совместимое object storage

Плюсы:

  • репозиторий физически отделен от сервера
  • масштабируемость и высокая доступность (в зависимости от поставщика)
  • удобно хранить «долго» и «много»

Минусы и ограничения:

  • задержки и стоимость запросов/трафика могут быть заметны на больших репозиториях
  • для высокой скорости восстановления важен канал и расположение (иногда критично, чтобы хранилище было близко к региону размещения VPS)

Репозиторий на отдельном VPS/VDS через SFTP (SSH)

Плюсы:

  • полный контроль над диском, файловой системой и доступами
  • прозрачная модель затрат (диск и трафик понятны заранее)
  • можно выбрать географически близкую площадку для быстрого восстановления

Минусы и ограничения:

  • второй сервер тоже нужно администрировать (обновления, SSH‑политики, мониторинг диска)
  • отказ второго VPS приведет к потере доступа к репозиторию, если нет резервирования

В реальных внедрениях распространен компромисс: выделить отдельный VPS под репозиторий restic (с минимальным набором сервисов и жесткими SSH‑ограничениями), а затем дополнительно выгружать данные в объектное хранилище по отдельному расписанию. Если нужен простой старт, часто достаточно одной внешней точки – например, отдельного VPS под репозиторий restic в том же регионе, где работает основной сервер, чтобы восстановление было быстрее.

Что именно бэкапить на виртуальном сервере

Список данных для бэкапа всегда привязан к роли сервера, но есть практический минимум, который часто оказывается критичным при восстановлении:

  • Конфигурация: /etc (но осознанно исключая лишнее), файлы systemd‑юнитов, конфиги веб‑сервера, планировщики, правила firewall
  • Данные приложений: каталоги проекта, пользовательские загрузки, медиа, статика
  • Ключи и секреты: SSH‑ключи сервисных пользователей, TLS‑сертификаты (например, /etc/letsencrypt), переменные окружения приложений (.env), токены интеграций
  • Данные СУБД – не «как файлы», а через дампы или специализированные инструменты, чтобы получить консистентную копию
  • Список пакетов и процедура bootstrap: это не всегда «файлы для бэкапа», но почти всегда нужно для быстрого восстановления

Типовые исключения (чтобы не тащить мусор и «виртуальные» файловые системы): /proc, /sys, /dev, /run, /tmp, кеши пакетных менеджеров, большие логи, которые уже централизованно собираются.

СУБД и консистентность: почему нельзя ограничиться копированием каталога

Для PostgreSQL, MySQL/MariaDB и большинства других СУБД копирование файлов каталога данных «как есть» на работающем сервере часто приводит к неконсистентному бэкапу. Без гипервизорного снапшота нельзя «заморозить диск» с гарантией целостности, поэтому обычно используются дампы или механизмы point‑in‑time recovery (PITR) – в зависимости от требований к RPO/RTO.

Для небольших VPS/VDS‑инсталляций чаще всего достаточно регулярных логических дампов:

  • PostgreSQL: pg_dump (одна БД) или pg_dumpall (все БД и роли) с разумными параметрами
  • MySQL/MariaDB: mysqldump с —single-transaction для InnoDB, чтобы не блокировать таблицы надолго

Практически удобная схема: перед запуском restic‑бэкапа сформировать дампы в отдельный каталог (например, /var/backups/db), а затем включить этот каталог в backup‑набор. Тогда восстановление СУБД превращается в отдельный понятный шаг.

Настройка restic: базовые шаги (Linux, root‑доступ)

Шаг 1. Установка и учет данных доступа

Установка restic выполняется через пакетный менеджер дистрибутива или через официальный релиз. Важно заранее определить:

  • куда будет писать репозиторий (S3 или SFTP)
  • где хранится пароль репозитория
  • как задаются креды для бэкенда (переменные окружения или отдельный файл, читаемый только root)

Рекомендуемый минимум по безопасности для пароля репозитория:

  • хранить в файле с правами 0600 (только root)
  • не класть этот файл в тот же каталог, который резервируется
  • иметь отдельную копию пароля в менеджере секретов или другом доверенном месте

Шаг 2. Инициализация репозитория

Пример для SFTP‑репозитория на удаленном сервере:

restic -r sftp:restic@backup.example:/srv/restic/repo init

Пример для S3‑совместимого object storage (URL зависит от конкретного провайдера):

export RESTIC_REPOSITORY=«s3:https://s3.example.com/backup-bucket»
export AWS_ACCESS_KEY_ID=«…»
export AWS_SECRET_ACCESS_KEY=«…»
restic init

После инициализации имеет смысл сразу проверить доступ:

restic snapshots

Шаг 3. Список исключений и «границы» файловой системы

Для VPS/VDS важно не утащить в репозиторий лишнее. Типовая практика – вести отдельный файл исключений, например /etc/restic/excludes:

/proc
/sys
/dev
/run
/tmp
/var/tmp
/var/cache
/var/log

В зависимости от задачи /var/log можно бэкапить выборочно или вообще исключить, если логи уже уходят в централизованное хранилище. Дополнительно часто используется ключ —one-file-system, чтобы не захватить смонтированные тома «по дороге».

Шаг 4. Скрипт бэкапа: данные + дампы + теги

На практике удобно держать один основной скрипт, который:

  • готовит дампы СУБД (если есть)
  • запускает restic backup с понятным набором путей
  • применяет retention‑политику
  • пишет лог и отдает код завершения для мониторинга

Пример логики (адаптируется под конкретную структуру сервера):

#!/bin/sh
set -eu

export RESTIC_REPOSITORY=«sftp:restic@backup.example:/srv/restic/repo»
export RESTIC_PASSWORD_FILE=«/etc/restic/password»
export RESTIC_CACHE_DIR=«/var/cache/restic»

# 1. Подготовка дампов СУБД (примерный вызов отдельного скрипта)
/usr/local/sbin/backup-db.sh

# 2. Бэкап файлов и конфигурации
restic backup \
—one-file-system \
—exclude-caches \
—exclude-file /etc/restic/excludes \
—tag «daily» \
/etc /home /var/www /var/backups

Отдельный скрипт для дампов позволяет проще тестировать восстановление и менять стратегию без затрагивания restic‑части. Для PostgreSQL, например, часто используется формат custom (удобнее при восстановлении) и ротация дампов внутри каталога:

#!/bin/sh
set -eu
mkdir -p /var/backups/db
chmod 700 /var/backups/db

# пример для PostgreSQL (имя БД и параметры подставляются по месту)
sudo -u postgres pg_dump —format=custom —file=«/var/backups/db/app_$(date +%F).dump» appdb

# удаление старых дампов, чтобы не плодить уникальные файлы бесконечно
find /var/backups/db -type f -name «app_*.dump» -mtime +14 -delete

Retention‑политика в restic: как не переполнить хранилище и не потерять историю

В restic удержание истории задается командой forget. Важно понимать механику:

  • forget выбирает, какие снапшоты оставить, а какие «забыть» (удалить из списка)
  • prune физически удаляет неиспользуемые данные из репозитория (освобождает место)

В небольших репозиториях часто запускается forget —prune после каждого бэкапа. На больших объемах prune может занимать заметное время, поэтому распространенный подход – выполнять forget ежедневно, а prune, например, раз в неделю в отдельном задании.

Пример retention‑настроек для «обычного» VPS

Один из понятных вариантов (корректируется под требования и стоимость хранения):

  • ежедневные бэкапы за последние 14 дней
  • еженедельные – за последние 8 недель
  • ежемесячные – за последние 12 месяцев
  • ежегодные – за последние 2-3 года (если нужно хранение «на всякий случай» и есть место)

Команда:

restic forget —tag «daily» —keep-daily 14 —keep-weekly 8 —keep-monthly 12 —keep-yearly 3

Если prune выполняется сразу:

restic forget —tag «daily» —keep-daily 14 —keep-weekly 8 —keep-monthly 12 —keep-yearly 3 —prune

В продакшене полезно фиксировать «контракт» retention‑политики отдельным документом: какие точки восстановления доступны и как долго. Это упрощает коммуникацию в инцидентах и помогает аргументированно планировать объем хранилища.

Регулярная проверка целостности: restic check и частичное чтение данных

Статус «backup completed successfully» не означает, что данные читаются и реально восстановятся. Минимум, который стоит включать в эксплуатационный цикл:

  • restic check – проверка структуры и индексов репозитория
  • периодическое чтение части данных, чтобы обнаружить повреждения носителя или проблемы на стороне бэкенда раньше, чем понадобится восстановление

Для экономии времени и трафика часто используется частичная проверка чтения данных (конкретный параметр подбирается по объему):

restic check —read-data-subset=5%

На практике это запускается по расписанию раз в неделю или раз в месяц – отдельно от ежедневного бэкапа.

Автоматизация: systemd timer вместо «хрупкого» cron

cron остается рабочим вариантом, но systemd‑таймеры дают дополнительные преимущества: контроль среды выполнения, журналирование в journald, удобные зависимости и параметр Persistent=true (пропущенные задания могут быть выполнены после перезагрузки).

Пример systemd‑юнита

Сервис /etc/systemd/system/restic-backup.service:

[Unit]
Description=Restic backup
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/backup-restic.sh
Nice=19
IOSchedulingClass=idle

Пример таймера

Таймер /etc/systemd/system/restic-backup.timer:

[Unit]
Description=Run restic backup daily

[Timer]
OnCalendar=*-*-* 03:15:00
RandomizedDelaySec=30m
Persistent=true

[Install]
WantedBy=timers.target

После создания файлов:

systemctl daemon-reload
systemctl enable —now restic-backup.timer

Отдельным таймером обычно оформляется еженедельный restic prune или расширенная проверка restic check, чтобы не смешивать «быстрое ежедневное» и «тяжелое сервисное» обслуживание репозитория.

Регулярная проверка восстановления: главный элемент надежности

Бэкап считается работоспособным только после восстановления. Для VPS/VDS без гипервизора это особенно важно: восстановление часто включает не только «вернуть файлы», но и поднять сервисы, восстановить базу, проверить права доступа и секреты.

Минимальная практика: тестовое восстановление файлов

Раз в месяц (или чаще при изменениях) полезно выполнять восстановление последнего снапшота в отдельный каталог на тестовой машине или на отдельном диске:

mkdir -p /var/tmp/restore-test
restic restore latest —target /var/tmp/restore-test

Далее проверяются хотя бы критичные элементы:

  • наличие конфигов и секретов (например, переменных окружения приложения)
  • целостность структуры каталогов
  • валидность сертификатов и ключей (в том числе права доступа)

Практика уровня выше: восстановление сервиса в изолированном контуре

Для веб‑приложений и API полезно иметь «учебный» сценарий:

  • поднять чистый VPS/VDS или тестовую виртуальную машину
  • установить базовый набор пакетов (по чек‑листу или Ansible‑ролью)
  • восстановить данные из restic
  • развернуть дамп СУБД в тестовую БД
  • запустить сервис и пройти smoke‑тест (например, запрос на health‑endpoint)

Такая проверка не обязана быть сложной, но должна быть регулярной и фиксируемой: дата, версия приложения, снапшот, результат, замечания. Это превращает восстановление из «уникального события» в повторяемую процедуру.

Сценарий аварийного восстановления на новом VPS/VDS

При потере исходного виртуального сервера восстановление обычно выглядит так:

  1. Развернуть новый VPS/VDS в нужном регионе и с достаточным объемом диска
  2. Обновить ОС, настроить SSH‑доступ, базовые политики безопасности (firewall, запрет лишних логинов, обновления)
  3. Установить restic и подготовить доступ к репозиторию (пароль, ключи S3/SSH)
  4. Восстановить данные: конфигурацию, каталоги приложений, дампы СУБД
  5. Восстановить сервисы: пакеты, systemd‑юниты, переменные окружения, сертификаты
  6. Восстановить СУБД из дампа и проверить доступы
  7. Провести пост‑проверки: доступность сервиса, логи, мониторинг, ротация ключей при необходимости

Нюанс, который часто недооценивается: без доступа к гипервизору нет «магического» восстановления загрузчика и сетевых настроек как в образе диска. Поэтому документация bootstrap‑процедуры и автоматизация (Ansible, cloud-init, скрипты) заметно сокращают RTO.

Типичные ошибки при агентном бэкапе VPS/VDS

  • Бэкап «только /var/www» без конфигов, секретов и TLS‑сертификатов. В результате восстановление превращается в сбор по кускам
  • Копирование каталога базы данных вместо дампа или штатного механизма СУБД – высокий риск неконсистентности
  • Пароль репозитория лежит на сервере в читаемом виде или попадает в бэкап вместе с /etc
  • Нет retention‑политики – хранилище переполняется, бэкапы начинают падать, а проблема обнаруживается слишком поздно
  • Нет тестов восстановления – самая частая причина «неожиданного» провала в момент инцидента
  • Единственная точка хранения – один удаленный сервер или один bucket без дополнительных мер. Для критичных систем лучше планировать второй контур (хотя бы периодическую выгрузку в другое место)

Чек‑лист эксплуатации (коротко)

  • Репозиторий находится вне защищаемого VPS/VDS
  • Пароль репозитория хранится отдельно, файл – с правами 0600, не попадает в бэкап
  • СУБД резервируется консистентно (дампы или специализированные механизмы)
  • Настроены forget/prune и понятная retention‑политика
  • Включены регулярные проверки restic check и периодическое чтение части данных
  • Есть расписание через systemd timer и понятный лог выполнения
  • Проводится регулярное тестовое восстановление (файлы + запуск сервиса в тестовом контуре)
  • Описана процедура восстановления «с нуля» на новом виртуальном сервере

Бэкап на VPS/VDS без доступа к гипервизору – это не «облегченный» вариант, а отдельная дисциплина: консистентность на уровне приложений, шифрование до отправки в хранилище, контролируемая retention‑политика и обязательные учения по восстановлению. При соблюдении этих принципов restic позволяет получить предсказуемый и проверяемый процесс, который не зависит от наличия гипервизорных снапшотов у провайдера.