Инкрементные бэкапы на VPS с помощью rsync и cron
Введение
Резервные копии — критически важная часть администрирования любого VPS. Они защищают от случайного удаления файлов, ошибок конфигурации, повреждения данных и компрометации сервера.
В этом руководстве описывается, как настроить инкрементные резервные копии с использованием:
- rsync — эффективного инструмента копирования файлов
- жёстких ссылок (hard links) — для исключения дублирования данных
- cron — для автоматического запуска бэкапов по расписанию
Результат: каждый снапшот выглядит как полноценный бэкап, но дополнительное место занимают только измененные файлы. Метод простой, надежный и подходит для большинства VPS.
Как работают инкрементные бэкапы с rsync
rsync предоставляет два ключевых механизма:
- Копирование только измененных файлов
--link-dest— создает жёсткие ссылки на измененные файлы из предыдущего бэкапа.
Пример структуры каталогов:
/backups/ daily.0/ - today's backup daily.1/ - yesterday's backup daily.2/ - backup from 2 days ago
Каждая папка выглядит как полный бэкап, но фактически место занимают только различия.
Требования
На VPS должны быть:
- Linux
- Доступ root или пользователь с sudo
- Достаточно дискового пространства
- (Опционально) удаленное хранилище для бэкапов
Установка rsync (если не установлен):
sudo apt update
sudo apt install rsync
Важно: Перед бэкапом остановите базы данных или исключите их каталоги данных. Копирование работающих БД через rsync может привести к поврежденным бэкапам.
Создание каталогов для бэкапов
Выберите место хранения:
- Локально:
/backups/ - Внешний диск:
/mnt/storage/backups/ - Удалённый сервер по SSH:
user@backup-server:/data/backups/
Пример (локально):
sudo mkdir -p /backups
sudo chmod 700 /backups
Базовая команда rsync для инкрементальных бэкапов
Below is the key rsync command:
rsync -a --delete \ --link-dest=/backups/daily.1 \ /source/data/ \ /backups/daily.0/
Пояснения:
-a— архивный режим (права, владельцы, даты, симлинки)--delete— удаляет файлы, удалённые в источнике--link-dest— жёсткие ссылки на неизмененные файлы/source/data/— каталог для бэкапа/backups/daily.0/— текущий снапшот
Скрипт ротации ежедневных бэкапов
Скрипт выполняет:
- Ротацию старых бэкапов
- Создание нового инкрементного бэкапа
- Хранение N дней (например: 7)
Создайте файл скрипта:
sudo nano /usr/local/bin/backup_daily.sh
С содержимым:
#!/bin/bash BACKUP_DIR="/backups/" SOURCE="/" EXCLUDE="/etc/backup-exclude.txt" DAYS="7" #REMOTE_USER="<YOUR_REMOTE_USER>" #REMOTE_SERVER="<YOUR_REMOTE_SERVER>" REMOTE_DIR="/backups/" # Rotate for ((i=DAYS-1; i>=0; i--)); do if [ -d "$BACKUP_DIR/daily.$i" ]; then rm -rf "$BACKUP_DIR/daily.$((i+1))" mv "$BACKUP_DIR/daily.$i" "$BACKUP_DIR/daily.$((i+1))" fi done # Prepare backup directories mkdir -p "$BACKUP_DIR/daily.0" if [ ! -d "$BACKUP_DIR/daily.1" ]; then mkdir -p "$BACKUP_DIR/daily.1" fi # Perform incremental backup rsync -a --delete \ --link-dest="$BACKUP_DIR/daily.1" \ --exclude-from="$EXCLUDE" \ "$SOURCE" "$BACKUP_DIR/daily.0" if [ -n "$REMOTE_USER" ] && [ -n "$REMOTE_SERVER" ] && [ -n "$REMOTE_DIR" ]; then rsync -azv --delete "$BACKUP_DIR" "$REMOTE_USER@$REMOTE_SERVER:$REMOTE_DIR" fi
Сделайте исполняемым:
sudo chmod +x /usr/local/bin/backup_daily.sh
Можно изменить переменные в начале скрипта (например, SOURCE, если не нужен бэкап всей системы).
Исключение ненужных директорий
Создайте файл исключений:
sudo nano /etc/backup-exclude.txt
Типичные исключения:
/proc/sys/tmp/run/dev/mnt/media/var/cache/backups
Автоматическое создание бэкапов через cron
Откройте crontab:
sudo crontab -e
Добавьте строку (ежедневный бекап в 03:00):
0 3 * * * /usr/local/bin/backup_daily.sh >/var/log/backup.log 2>&1
This ensures regular automatic snapshots.
Бэкап на удалённый сервер (опционально)
Создайте каталог на сервере назначения:
mkdir -p /backups
Убедитесь, что SSH-ключи настроены. Выполните следующую команду для генерации SSH-ключа:
ssh-keygen
Замените <YOUR_REMOTE_USER> на ваше имя пользователя на удаленном сервере, <YOUR_REMOTE_SERVER> на доменное имя вашего удаленного сервера и выполните следующую команду для копирования SSH-ключа на удаленный сервер:
ssh-copy-id <YOUR_REMOTE_USER>@<YOUR_REMOTE_SERVER>
Раскомментируйте REMOTE_USER, REMOTE_SERVER переменные в верхней части файла backup_daily.sh, замените <YOUR_REMOTE_USER> на ваше имя пользователя на удаленном сервере, <YOUR_REMOTE_SERVER> на доменное имя вашего удаленного сервера и сохраните backup_daily.sh, чтобы включить удаленное резервное копирование.
Загрузка бэкапов в INTROSERV CloudBox
INTROSERV предоставляет онлайн-хранилище, позволяющее автоматически или вручную сохранять защищенные копии важных файлов и данных на удаленных серверах. Чтобы использовать его в качестве удаленного хранилища резервных копий, войдите в веб-интерфейс CloudBox и добавьте свой открытый SSH-ключ в профиль. Настройки профиля находятся в правом верхнем углу.

Вставьте свой открытый SSH-ключ в раздел "Public keys".

Раскомментируйте REMOTE_USER, REMOTE_SERVER переменные в верхней части файла backup_daily.sh, замените <YOUR_REMOTE_USER> на ваше имя пользователя на сервере CloudBox, <YOUR_REMOTE_SERVER> на доменное имя вашего сервера CloudBox и сохраните backup_daily.sh, чтобы включить удаленное резервное копирование.
Тестирование бэкапов
Перед использованием обязательно проверьте корректность работы:
- Запуск вручную:
sudo /usr/local/bin/backup_daily.sh - Проверка размеров бэкапов:
du -sh /backups/*. Большим должен быть только один бэкап. - Проверьте целостность файлов:
ls -l /backups/daily.0/etc/
Восстановление данных
Восстановить отдельный файл:
cp /backups/daily.2/etc/nginx/nginx.conf /etc/nginx/
Полное восстановление:
sudo rsync -a /backups/daily.0/ /
Внимание: системные файлы будут перезаписаны.
Безопасность
- Используйте строгие права доступа к каталогам резервного копирования (
chmod 700). - В SSH используйте только ключи, отключите пароли.
- Не храните бэкапы на том же диске, что и VPS.
- Для удалённых бэкапов используйте шифрование (LUKS и т.п.).
Мониторинг и логи
Логирование включено в cron: /var/log/backup.log
Регулярно проверяйте логи:
tail -f /var/log/backup.log
Заключение
Использование rsync + cron даёт:
- быстрые инкрементные бэкапы
- экономию дискового пространства
- простое восстановление
- полностью автоматизированный процесс
Метод надежен, прост и отлично подходит для Linux VPS, даже для начинающих администраторов.