Резервные копии на 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.