Все статьи
Руководства

Резервное копирование VPS: rsync, restic и правило 3-2-1

Коротко

Резервные копии VPS делают по правилу 3-2-1: три копии данных, на двух разных носителях, одна - вне сервера и площадки. Копируют данные, конфиги из /etc и дампы баз, а не всю систему: ОС переустанавливается за минуты. Удобнее всего restic - он шифрует и дедуплицирует копии, хранит историю по политике вроде 7 дневных, 4 недельных и 6 месячных снимков и запускается по systemd timer каждую ночь.

Главное
  • Правило 3-2-1 для резервных копий: три копии данных, на двух разных носителях, одна из них - вне основной площадки; копия на том же VPS от потери сервера не спасает.
  • Для бэкапа VPS копируют данные приложений, конфиги из /etc, домашние каталоги и дампы баз данных, а не всю систему: ОС на VPS переустанавливается за несколько минут.
  • Файлы работающей базы данных копировать нельзя - они получаются несогласованными; сначала делают дамп (pg_dump -Fc для PostgreSQL), а копируют уже его.
  • restic шифрует и дедуплицирует резервные копии, хранит историю снимков и чистит старые командой restic forget --prune по политике, например 7 дневных, 4 недельных и 6 месячных.
  • Резервная копия считается рабочей только после проверки восстановления: раз в месяц восстановите restic restore несколько файлов и дамп базы в отдельную базу.

Зачем свои резервные копии, если сервер надёжный

Надёжность железа и SLA защищают от поломки диска, но не от ошибок и атак: rm -rf не в том каталоге, неудачное обновление, взлом, шифровальщик, удалённая по ошибке таблица или неоплаченный сервер. Во всех этих случаях копия на том же VPS пропадает вместе с данными. Поэтому собственные копии вне сервера нужны всегда - независимо от того, где он работает и что обещает провайдер.

Что такое правило 3-2-1

Правило 3-2-1 - классическая схема резервного копирования: 3 копии данных (рабочая и две резервные), на 2 разных носителях или системах, 1 копия - в другом месте. Для VPS это выглядит так:

КопияГде хранитсяОт чего защищает
Рабочие данныеСам VPSНи от чего - это оригинал
Резервная копия 1Второй сервер в другой локацииПотеря, взлом или удаление основного VPS
Резервная копия 2Объектное хранилище S3 или домашний компьютерОдновременная проблема с обоими серверами

Шаг 1. Решите, что копировать

  • /etc - конфиги nginx, systemd, SSH, файрвола: на их повторную настройку уходят часы;
  • данные приложений - /home, /opt, /srv, /var/www или где лежат ваши проекты, включая файлы .env;
  • дампы баз данных - PostgreSQL, MySQL, SQLite, а не файлы работающей базы;
  • тома Docker (/var/lib/docker/volumes), если данные живут в контейнерах, - лучше тоже через дамп базы;
  • не нужно копировать систему целиком: /usr, /var/cache, /proc, /tmp и node_modules восстанавливаются установкой ОС и пакетов.

Шаг 2. Делайте дампы баз перед копированием

Файлы базы данных, скопированные на ходу, почти наверняка окажутся несогласованными, и база из них не поднимется. Дамп снимается с работающей базы без остановки и всегда согласован. Пример для PostgreSQL - подробнее в статье про PostgreSQL на VPS:

bash
sudo mkdir -p /var/backups/db
sudo -u postgres pg_dump -Fc myapp | sudo tee /var/backups/db/myapp.dump > /dev/null
sudo ls -lh /var/backups/db

Шаг 3. Настройте вход на сервер копий по SSH-ключу

Копирование по расписанию работает без пароля, поэтому для него нужен отдельный SSH-ключ root. ssh-copy-id один раз попросит пароль пользователя backup на втором сервере, а запись в /root/.ssh/config даёт ему короткое имя backup-server. О ключах подробнее - в статье про подключение по SSH:

bash
sudo ssh-keygen -t ed25519 -N "" -f /root/.ssh/backup_key
sudo ssh-copy-id -i /root/.ssh/backup_key.pub backup@203.0.113.20
sudo tee -a /root/.ssh/config > /dev/null <<'EOF'
Host backup-server
    HostName 203.0.113.20
    User backup
    IdentityFile /root/.ssh/backup_key
EOF

Шаг 4. Простой вариант: rsync на другой сервер

rsync копирует только изменившиеся файлы, поэтому повторный запуск занимает секунды. -a сохраняет права и даты, --delete удаляет на копии файлы, которых больше нет на сервере. rsync должен быть установлен на обоих серверах:

bash
sudo apt install -y rsync
sudo rsync -a --delete /etc /home /opt /var/backups backup-server:/srv/backup/myvps/

Шаг 5. restic: шифрование, дедупликация и история

restic хранит копии снимками (snapshot): каждый снимок - полное состояние на момент запуска, но одинаковые части файлов хранятся один раз (дедупликация), поэтому 30 ежедневных снимков редко меняющихся данных занимают немногим больше одного. Всё шифруется на вашем сервере, и сервер копий видит только зашифрованные блоки. Репозиторий по SFTP использует ключ из шага 3:

bash
sudo apt install -y restic
sudo sh -c 'openssl rand -base64 32 > /root/.restic-password && chmod 600 /root/.restic-password'
sudo -i
export RESTIC_REPOSITORY=sftp:backup-server:/srv/restic/myvps
export RESTIC_PASSWORD_FILE=/root/.restic-password
restic init

Первый снимок, список снимков, чистка по политике хранения и проверка целостности репозитория. forget --prune оставляет 7 последних дневных, 4 недельных и 6 месячных снимков и удаляет данные, на которые больше не ссылается ни один снимок:

bash
restic backup /etc /home /opt /var/backups --exclude-caches
restic snapshots
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
restic check

Кроме SFTP restic умеет писать в S3-совместимые хранилища - так удобно сделать вторую резервную копию по правилу 3-2-1. Список поддерживаемых хранилищ - в документации на restic.net.

Шаг 6. Запускайте копирование по расписанию

Соберите дамп и restic в один скрипт: set -eu остановит его на первой ошибке, и битый дамп не уйдёт в копию как удачный:

bash
sudo tee /usr/local/sbin/backup.sh > /dev/null <<'EOF'
#!/bin/sh
set -eu
export RESTIC_REPOSITORY=sftp:backup-server:/srv/restic/myvps
export RESTIC_PASSWORD_FILE=/root/.restic-password

# дамп базы - если на сервере есть PostgreSQL
mkdir -p /var/backups/db
runuser -u postgres -- pg_dump -Fc myapp > /var/backups/db/myapp.dump

restic backup /etc /home /opt /var/backups --exclude-caches
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
EOF
sudo chmod 700 /usr/local/sbin/backup.sh

systemd timer запускает скрипт каждую ночь в 03:30 со случайной задержкой до 15 минут, а Persistent=true выполнит пропущенный запуск, если сервер в это время был выключен. Результат каждого запуска виден в journalctl -u backup:

bash
sudo tee /etc/systemd/system/backup.service > /dev/null <<'EOF'
[Unit]
Description=Restic backup
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/backup.sh
EOF
sudo tee /etc/systemd/system/backup.timer > /dev/null <<'EOF'
[Unit]
Description=Daily restic backup

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

[Install]
WantedBy=timers.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
systemctl list-timers backup.timer

Если привычнее cron, та же задача - одна строка в sudo crontab -e:

crontab
30 3 * * * /usr/local/sbin/backup.sh >> /var/log/backup.log 2>&1

Шаг 7. Проверьте восстановление

Резервная копия, из которой ни разу не восстанавливали, - это надежда, а не бэкап. Раз в месяц восстановите несколько файлов во временный каталог и сравните с оригиналом, а дамп базы разверните в отдельную базу через pg_restore:

bash
restic snapshots
restic restore latest --target /root/restore-test --include /etc/nginx
diff -r /etc/nginx /root/restore-test/etc/nginx && echo OK

Заодно засеките время: сколько займёт поднять всё на чистом сервере - установить ОС, пакеты, вернуть /etc, данные и базу. Этот план восстановления стоит записать до аварии, а не во время неё.

Куда складывать копии

ХранилищеПлюсыМинусы
Второй VPS в другой странеПолный контроль, работают rsync и restic по SFTPНужно обслуживать второй сервер
Объектное хранилище S3Не нужно администрировать, оплата за объёмПлата за хранение и скачивание
Домашний компьютер или NASБесплатно, копия физически у васЗависит от домашнего интернета и питания

У Tihost три локации - Германия, Финляндия и Польша, поэтому сервер для копий удобно взять в другой стране, чем основной: авария одного дата-центра не затронет обе копии. Как выбрать локацию - в статье о выборе локации VPS. Для хранилища копий подходят конфигурации Starter - в старшей из них диск больше всего:

КонфигурацияГерманияФинляндияПольша
1 vCPU·2 GB RAM·40 GB NVMe$4.00$4.00$5.00
2 vCPU·4 GB RAM·80 GB NVMe$7.70$7.70$9.60
4 vCPU·4 GB RAM·140 GB NVMe$12.30$12.30$15.40
Запустите сервер за 2 минуты

AMD Ryzen 9, NVMe и защита от DDoS в Германии, Финляндии и Польше. Оплата криптовалютой или картой.

Заказать сервер

Частые вопросы

Что такое правило резервного копирования 3-2-1?

Правило 3-2-1 - это три копии данных, на двух разных носителях или системах, и одна из них - вне основной площадки. Для VPS это сам сервер, копия на втором сервере в другой локации и ещё одна в объектном хранилище или дома.

Чем restic лучше rsync для резервных копий?

rsync с --delete поддерживает зеркало, и испорченный или удалённый файл при следующем запуске пропадает и из копии. restic хранит историю снимков, шифрует данные и дедуплицирует их, поэтому можно вернуться к состоянию недельной давности.

Нужно ли копировать весь VPS целиком?

Нет. Достаточно копировать /etc, данные приложений, домашние каталоги и дампы баз данных. ОС и пакеты быстрее переустановить, а копия всей системы занимает больше места и хуже переносится на другой сервер.

Можно ли просто скопировать каталог базы данных?

Копировать файлы работающей базы данных нельзя: копия получится несогласованной. Сначала сделайте дамп - pg_dump -Fc для PostgreSQL или mysqldump для MySQL - и копируйте файл дампа.

Как часто делать резервные копии VPS?

Для большинства проектов достаточно ежедневной копии ночью с хранением 7 дневных, 4 недельных и 6 месячных снимков. Если потеря данных за сутки недопустима, базу копируют чаще - например, каждый час.

Что будет, если потерять пароль от репозитория restic?

Без пароля репозиторий restic расшифровать невозможно, и все копии в нём бесполезны. Храните пароль не только на сервере, но и в менеджере паролей.