Что такое rsync
rsync — утилита для эффективной синхронизации файлов между серверами. Передаёт только изменившиеся части файлов, что делает её идеальной для инкрементальных бэкапов и для переноса файлов сайта между хостингами без лишнего расхода трафика.
Порядок переноса файлов сайта без простоя
- Сделайте первую полную синхронизацию файлов на новый сервер, пока старый сайт продолжает работать.
- Повторите синхронизацию ещё раз непосредственно перед переключением — она скопирует только файлы, изменившиеся с первого раза.
- Проверьте новый сервер через файл
hosts, не трогая DNS домена. - Переключите домен и сразу же запустите финальный
rsyncс флагом--delete, чтобы убрать файлы, удалённые на старом сервере за время переезда. - Держите старый сервер доступным ещё несколько дней на случай отката.
Реальное время простоя при таком порядке — только на переключение DNS или веб-сервера, обычно от одной до пяти минут, а не часы на копирование всех файлов.
Основные ключи rsync
| Ключ | Описание |
|---|---|
| -a | Архивный режим (рекурсия + права + метаданные) |
| -v | Verbose — подробный вывод |
| -z | Сжатие при передаче |
| --delete | Удалять файлы на приёмнике, которых нет на источнике |
| --exclude | Исключить файлы/папки |
| --dry-run | Тестовый прогон без реальных изменений |
| --link-dest | Жёсткие ссылки для инкрементальных бэкапов |
Базовая синхронизация между серверами
# Синхронизация папки на удалённый сервер
rsync -avz --delete /var/www/mysite/ user@backup-server:/backups/mysite/
# С исключениями
rsync -avz --delete --exclude='wp-content/cache/' --exclude='*.log' /var/www/mysite/ user@backup-server:/backups/mysite/
Проверка результата без реальной передачи
Перед первым запуском на реальных данных всегда прогоняйте команду с флагом --dry-run — rsync покажет список файлов, которые будут скопированы или удалены, но ничего не тронет на диске:
rsync -avz --delete --dry-run /var/www/mysite/ user@backup-server:/backups/mysite/
Инкрементальные бэкапы с --link-dest
#!/bin/bash
DATE=$(date +%Y-%m-%d_%H%M)
DEST=/backups/mysite
LATEST=$DEST/latest
rsync -avz --delete --link-dest=$LATEST /var/www/mysite/ $DEST/$DATE/
# Обновляем ссылку на последний бэкап
rm -f $LATEST
ln -s $DEST/$DATE $LATEST
--link-dest создаёт жёсткие ссылки на неизменившиеся файлы вместо их копирования — каждый снапшот выглядит как полная копия, но реально занимает место только за изменившиеся файлы.
Сравнение способов переноса файлов через rsync
| Сценарий | Команда | Особенность |
|---|---|---|
| Разовый перенос всех файлов | rsync -avz источник назначение | без удаления на приёмнике |
| Зеркалирование (полное совпадение) | rsync -avz --delete источник назначение | удаляет лишнее на приёмнике |
| Ежедневный бэкап с историей | rsync -avz --link-dest=предыдущий | экономит место на диске |
Типичные ошибки
| Сообщение | Причина и решение |
|---|---|
| rsync: connection unexpectedly closed | Оборвалось SSH-соединение или не хватило памяти на удалённом сервере — повторите с флагом --partial для докачки |
| Permission denied (publickey) | SSH-ключ не добавлен на удалённый сервер — скопируйте его через ssh-copy-id |
| rsync error: some files/attrs were not transferred | Не хватает прав на изменение владельца файлов — запустите с sudo на обеих сторонах или уберите -o -g из архивного режима |
Откат при проблемах
- Не удаляйте файлы на старом сервере до подтверждения, что новый работает штатно хотя бы сутки.
- Если после переключения выявились пропавшие файлы, запустите обратную синхронизацию со старого сервера на новый, без
--delete. - Разберитесь с причиной несоответствия (обычно — исключения в
--exclude, которые задели нужные файлы) и повторите перенос.
Когда rsync не подходит
--delete удаляет файлы на приёмнике без предупреждения. Всегда используйте --dry-run первый раз. Для баз данных rsync копирует файл СУБД «как есть» и может передать его в несогласованном состоянии, если сервер базы работает во время копирования — для баз нужен mysqldump или pg_dump, а не rsync файлов данных.
Автоматизация через cron
# Ежедневный бэкап в 3 ночи
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Проверка результата
- Сравните число файлов:
find /var/www/mysite | wc -lна источнике и приёмнике должно совпадать. - Проверьте контрольную сумму нескольких ключевых файлов:
md5sumна обеих сторонах. - Откройте сайт через подмену hosts и убедитесь, что все статические файлы загружаются без 404.
Перенос базы данных, который нужно синхронизировать вместе с файлами, описан в статье перенос базы данных MySQL, а общий чек-лист проверки сайта после переезда — в статье проверка после миграции.