Резервні копії за допомогою rsync
Як налаштувати копіювання файлів на інший сервер через SSH, зробити історію версій за допомогою жорстких посилань і не видалити зайвого небезпечною опцією --delete.
Оновлено 23 серпня 2026 р.
rsync — найпростіший робочий спосіб робити копії: він доступний усюди, передає лише змінені частини файлів і працює через SSH. Для невеликих наборів даних цього достатньо.
Базова команда
rsync -avz --delete \
-e "ssh -i /root/.ssh/backup_key -p 22" \
/var/www/ backup@backup.example.com:/srv/backup/vds/www/
Розбір прапорців:
-a— зберігає права доступу, власників, час і посилання;-v— показує, що відбувається;-z— стискає під час передавання (корисно на каналі до 500 Мбіт/с, якщо даних багато);--delete— видаляє на приймачі те, чого вже немає на джерелі.
Скісна риска в кінці шляху джерела означає «вміст каталогу»; без неї копіюється сам каталог.
/var/www/і/var/wwwдають різні результати, а в парі з--deleteця різниця стирає не те, що потрібно. Завжди спершу запускайте з--dry-run.
rsync -avzn --delete /var/www/ backup@backup.example.com:/srv/backup/vds/www/
Прапорець -n — це пробний запуск.
Ключ для доступу без пароля
Для копіювання за розкладом потрібен вхід без уведення пароля:
ssh-keygen -t ed25519 -f /root/.ssh/backup_key -N ""
ssh-copy-id -i /root/.ssh/backup_key.pub backup@backup.example.com
На приймачі обмежте цей ключ однією командою — тоді викрадений ключ не дасть оболонки. У файлі ~/.ssh/authorized_keys на приймачі:
command="rrsync -wo /srv/backup",restrict ssh-ed25519 AAAA... backup
Історія версій із жорсткими посиланнями
Звичайний rsync зберігає лише поточний стан: якщо ви видалили файл учора й помітили це сьогодні, відновити його нізвідки. --link-dest дає вам історію: незмінені файли не копіюються повторно, а зв'язуються, тож тридцять копій займають трохи більше за одну.
#!/bin/bash
set -euo pipefail
DEST=/srv/backup/vds
TODAY=$(date +%F)
rsync -a --delete \
--link-dest="$DEST/latest" \
/var/www/ "$DEST/$TODAY/"
ln -sfn "$DEST/$TODAY" "$DEST/latest"
find "$DEST" -maxdepth 1 -type d -mtime +30 -name "20*" -exec rm -rf {} +
Запускайте скрипт за розкладом уночі й завжди з журналюванням.
Виключення
rsync -avz --exclude-from=/root/backup-exclude.txt / backup@host:/srv/backup/vds/root/
/proc/
/sys/
/dev/
/run/
/tmp/
/var/lib/docker/
/var/cache/
*.log
Копіювати весь корінь рідко потрібно: корисніше скласти точний список за статтею що саме резервувати.
Коли rsync не підходить
- Якщо потрібне шифрування сховища й дедуплікація, використовуйте Restic.
- Якщо дані змінюються постійно й важлива цілісність, спершу зробіть дамп бази даних, а потім скопіюйте отриманий файл через rsync.
- Приймач — це чуже сховище, якому ви не довіряєте: rsync записує файли як є, без шифрування на боці клієнта.
Типові помилки
--deleteз неправильним шляхом джерела. Порожній каталог джерела стирає приймач. Пробний запуск обов'язковий.- Копія на тому самому диску. Це не резервна копія, а друге місце для тієї самої відмови. Див. копії поза майданчиком.
- Стискання вже стиснених даних.
-zлише сповільнює роботу з архівами та зображеннями. - Нічний запуск упирається в диск. Обмеження швидкості запису залежить від тарифу: див. швидкість диска. Допомагають
--bwlimit=20000і запуск у години низького навантаження. - Ніхто не перевіряє результат. Журналюйте код повернення й стежте за ним:
rsync ... || echo "backup failed" | mail -s alert you@example.com.