rsync: копирование, синхронизация и перенос сайта на другой сервер

Как rsync решает, что копировать, правило косой черты, передача по SSH с исключениями, безопасный --delete и схема переезда сайта на новый VPS. Ubuntu, Debian, AlmaLinux.

17 октября 2026 г.·4 мин чтения·rsync, backup, ssh, linux

Перенести сайт на новый сервер, сделать копию папки с данными, каждую ночь отправлять бэкап на другую машину — для всего этого cp уже не подходит. rsync копирует локально и по сети через SSH, а при повторном запуске передаёт только то, что изменилось. У него две ловушки, из-за которых данные оказываются не там или исчезают совсем; обе разобраны ниже.

Все команды проверены на VPS с Ubuntu 24.04 и Debian 12 — на tanaka.host оба образа ставятся при заказе сервера, а если что-то пойдёт не так, выручит консоль в кабинете.

Почему не cp

cp каждый раз копирует всё, что ему указали, не глядя на то, что уже лежит в назначении. Для десятков гигабайт, где поменялась пара файлов, это долго и, если речь о другом сервере, забивает весь канал.

rsync сначала сравнивает списки файлов с двух сторон. Файл считается неизменившимся, если совпали размер и время модификации, — такой пропускается целиком. Изменившийся файл тоже не всегда идёт полностью: принимающая сторона режет старую версию на блоки и шлёт их контрольные суммы, передающая находит совпадения и отправляет только отличия. Папка 8 МБ, в один файл дописали строку — второй запуск передаст чуть больше килобайта.

Ключ -a (архивный режим) сохраняет права, владельца, время и символические ссылки — без него копия будет неточной. По сети rsync работает поверх SSH: отдельная служба не нужна, достаточно, чтобы сам rsync стоял на обеих сторонах.

Что нужно

rsync на каждом сервере, который участвует в копировании. В минимальных образах его часто нет:

sudo apt install -y rsync     # Ubuntu, Debian
sudo dnf install -y rsync     # AlmaLinux, Rocky

Для копирования по сети — доступ по SSH ко второму серверу.

1. Скопируйте папку локально

rsync -avh /srv/site/ /backup/site/
  • -a — архивный режим: права, владелец, время, ссылки, папки целиком;
  • -v — список копируемых файлов;
  • -h — размеры в понятном виде, 8.21M вместо байтов.

Поменяйте что-нибудь и запустите ещё раз — передастся только изменённое.

2. Правило косой черты

Косая черта в конце источника меняет результат. Без неё копируется сама папка, с ней — только содержимое.

# Внутри /tmp/t1 появится папка site
rsync -a /srv/site /tmp/t1/

# В /tmp/t2 окажутся файлы и папки из site
rsync -a /srv/site/ /tmp/t2/

Самый надёжный способ не путаться — всегда ставить / в конце обоих путей, когда нужно синхронизировать содержимое одной папки с содержимым другой.

3. Скопируйте на другой сервер

Адрес удалённой стороны — пользователь@IP:/путь. -z сжимает данные в пути, --progress показывает ход по каждому файлу.

# С этого сервера на другой
rsync -avzh --progress /srv/site/ root@IP-адрес-сервера:/var/www/site/

# С другого сервера на этот
rsync -avzh --progress root@IP-адрес-сервера:/var/www/site/ /srv/site/

Нестандартный порт SSH или ключ в другом файле — через -e:

rsync -avzh -e "ssh -p 2222 -i ~/.ssh/my_key" /srv/site/ root@IP-адрес-сервера:/var/www/site/

Лишнее исключается --exclude, пути — относительно источника:

rsync -avzh --exclude "logs/" --exclude "*.tmp" /srv/site/ root@IP-адрес-сервера:/var/www/site/

4. Точная копия с –delete

По умолчанию rsync только добавляет и обновляет, но не удаляет в назначении то, чего уже нет в источнике. Для зеркала нужен --delete. Это самый опасный ключ rsync, поэтому сначала — пробный запуск с -n, который покажет всё, что собирается сделать, и ничего не тронет.

# Пробный запуск, ничего не меняет
rsync -avhn --delete /srv/site/ /backup/site/

# Если в списке deleting только то, что действительно нужно удалить
rsync -avh --delete /srv/site/ /backup/site/

Не перепутайте источник и назначение. С --delete и переставленными путями rsync сделает зеркалом не копию, а оригинал, и удалит в нём всё, чего нет в копии. Любую команду с --delete сначала запускайте с -n.

Перенос сайта на новый сервер

Схема удобна тем, что второй прогон передаёт только изменившееся за время первого.

  1. Поставьте rsync на обоих серверах, проверьте, что со старого можно зайти на новый по SSH.
  2. Скопируйте файлы сайта, пока старый сервер работает:
rsync -avzh --progress /var/www/site/ root@IP-нового-сервера:/var/www/site/
  1. Перенесите базу отдельно дампом, настройте на новом сервере веб-сервер и SSL.
  2. Перед переключением повторите команду из шага 2 — уйдут только файлы, изменившиеся за время переезда.
  3. Направьте домен на новый сервер.

Для регулярных бэкапов ту же команду можно запускать через cron. Если нужны версии и шифрование — смотрите restic.

Частые ошибки

bash: rsync: command not found. rsync не стоит на одной из сторон. Удалённая сторона пишет bash: line 1: rsync: command not found, локальная — что соединение неожиданно закрылось. Поставьте rsync на обоих серверах.

Файлы оказались во вложенной папке. В конце источника не было /, rsync скопировал саму папку внутрь назначения. Повторите с путём, заканчивающимся на /.

Как не перезаписывать более новые файлы на той стороне. Ключ -u: файлы, которые в назначении новее, будут пропущены.

Нужен общий прогресс, а не по каждому файлу. --info=progress2 вместо --progress.

Для разовых локальных копий хватит cp.