Інкрементні бекапи на 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 для інкрементних бекапів
Основна команда rsync:
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
Це забезпечує створення автоматичних бекапів.
Бекап на віддалений сервер (опціонально)
Створіть каталог на віддаленому сервері:
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 забезпечує:
- Швидкі інкрементні бекапи
- Ефективне використання диску завдяки hard links
- Просте відновлення
- Повністю автоматизований процес
Метод надійний, простий для початківців і чудово підходить для Linux VPS.