Skip to content
VDS · Резервні копії та диск

Резервні копії за допомогою 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.