Перейти к содержимому

Rsync: бэкап каталога по SSH

Rsync: бэкап каталога по SSH

Классический способ переложить каталог на удалённую машину — rsync поверх SSH. Не нужно открывать дополнительных портов, трафик шифруется, а сам инструмент умеет докачивать изменения и сохранять метаданные. Одна команда — и бэкап готов.


Базовая команда rsync через SSH

Минимальный вызов для копирования локального каталога на удалённый хост:

rsync -avz /path/to/source/ user@host:/path/to/dest/

Слеш в конце у source имеет значение: без него rsync создаст на удалённой стороне подпапку source/, с ним — скопирует содержимое напрямую в dest/.

Если SSH слушает нестандартный порт:

rsync -avz -e 'ssh -p 2222' /path/to/source/ user@host:/path/to/dest/
Подсказка

Для автоматизации в cron лучше указывать порт через -e, а не править /etc/ssh/ssh_config — так проще поддерживать разные хосты с разными портами.


Ключи архивации и синхронизации

-a (archive) — главный флаг. Он объединяет несколько опций в одну: рекурсивный обход, сохранение прав, владельцев, временных метаданных, симлинков и пустых каталогов.

ФлагНазначение
-aАрхивный режим (рекурсия + метаданные)
-vПодробный вывод
-zСжатие при передаче
-P--partial --progress — докачка и прогресс-бар
--deleteУдалять файлы на приёмнике, отсутствующие на источнике
-e sshУказать удалённую оболочку
--bwlimit=KBPSОграничение полосы пропускания
Предупреждение

--delete — мощный инструмент. Если источник случайно очистился, на удалённой машине останется пусто. Проверяйте список перед применением.

Полный пример бэкапа с ограничением полосы и прогрессом:

rsync -avzP --bwlimit=10000 -e 'ssh -p 2222' \
  /data/backup/ user@backupserver:/mnt/backup/

Исключения файлов и каталогов

Для исключения конкретных путей используется --exclude. Паттерны применяются относительно источника:

rsync -avz --exclude='*.log' --exclude='cache/' \
  /data/ user@host:/data/

Если исключений много, удобнее использовать файл-список:

# exclude.txt
*.tmp
*.bak
cache/
lost+found/
rsync -avz --exclude-from='exclude.txt' /data/ user@host:/data/
Примечание

--exclude проверяется по очереди. Более поздние правила могут перекрыть ранние, если пути пересекаются. Для точного контроля используйте --filter.


Dry-run перед запуском

Перед реальным запуском всегда прогоняйте с --dry-run (или -n). rsync покажет, что именно было бы скопировано/удалено, но не трогает файлы:

rsync -avzn --delete --exclude-from='exclude.txt' \
  /data/ user@host:/data/

Сравните вывод с ожидаемым списком. Если всё совпадает — убираете -n и запускаете реальную синхронизацию.

Для cron-задачи с уведомлениями на почту:

#!/bin/bash
rsync -avz --delete --exclude-from='/etc/rsync-exclude.txt' \
  /data/ user@host:/data/ 2>&1 | mail -s "Rsync backup report" admin@example.com

Итого

rsync через SSH покрывает 90% задач бэкапа без дополнительных агентов на стороне приёмника. Ключевой порядок действий: сначала --dry-run, потом --exclude, потом --delete если нужна точная зеркализация. Остальное — настройка под конкретный хост и порт.