- Правило 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:
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:
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 должен быть установлен на обоих серверах:
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:
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 месячных снимков и удаляет данные, на которые больше не ссылается ни один снимок:
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 остановит его на первой ошибке, и битый дамп не уйдёт в копию как удачный:
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.shsystemd timer запускает скрипт каждую ночь в 03:30 со случайной задержкой до 15 минут, а Persistent=true выполнит пропущенный запуск, если сервер в это время был выключен. Результат каждого запуска виден в journalctl -u backup:
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:
30 3 * * * /usr/local/sbin/backup.sh >> /var/log/backup.log 2>&1Шаг 7. Проверьте восстановление
Резервная копия, из которой ни разу не восстанавливали, - это надежда, а не бэкап. Раз в месяц восстановите несколько файлов во временный каталог и сравните с оригиналом, а дамп базы разверните в отдельную базу через pg_restore:
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 |
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 расшифровать невозможно, и все копии в нём бесполезны. Храните пароль не только на сервере, но и в менеджере паролей.