Перейти к содержимому
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.