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

Перенести сайт на новый сервер, сделать копию папки с данными, каждую ночь отправлять бэкап на другую машину — для всего этого 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.
Перенос сайта на новый сервер
Схема удобна тем, что второй прогон передаёт только изменившееся за время первого.
- Поставьте rsync на обоих серверах, проверьте, что со старого можно зайти на новый по SSH.
- Скопируйте файлы сайта, пока старый сервер работает:
rsync -avzh --progress /var/www/site/ root@IP-нового-сервера:/var/www/site/
- Перенесите базу отдельно дампом, настройте на новом сервере веб-сервер и SSL.
- Перед переключением повторите команду из шага 2 — уйдут только файлы, изменившиеся за время переезда.
- Направьте домен на новый сервер.
Для регулярных бэкапов ту же команду можно запускать через cron. Если нужны версии и шифрование — смотрите restic.
Частые ошибки
bash: rsync: command not found. rsync не стоит на одной из сторон. Удалённая сторона пишет bash: line 1: rsync: command not found, локальная — что соединение неожиданно закрылось. Поставьте rsync на обоих серверах.
Файлы оказались во вложенной папке. В конце источника не было /, rsync скопировал саму папку внутрь назначения. Повторите с путём, заканчивающимся на /.
Как не перезаписывать более новые файлы на той стороне. Ключ -u: файлы, которые в назначении новее, будут пропущены.
Нужен общий прогресс, а не по каждому файлу. --info=progress2 вместо --progress.
Для разовых локальных копий хватит cp.