Основы rsync: синхронизация локального каталога с каталогом сайта на сервере

30 Oct 2026

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

Все примеры проверены на rsync 3.2.7.

Что такое rsync

rsync — утилита для копирования и синхронизации файлов. От cp и scp её отличают три вещи:

Утилита должна быть установлена на обеих машинах: на локальной и на сервере.

rsync --version            # проверка
sudo dnf install rsync     # RHEL / AlmaLinux
sudo apt install rsync     # Debian / Ubuntu

Если на сервере rsync нет, команда завершится ошибкой rsync: command not found (код выхода 127).

Синтаксис

rsync [параметры] источник назначение

Всегда сначала источник (что копируем), потом назначение (куда копируем).

Удалённый путь записывается как user@host:путь. Если путь относительный, он считается от домашнего каталога пользователя на сервере.

Сначала пробный прогон: -n и -v

rsync может удалить или перезаписать больше, чем вы рассчитывали. Поэтому любая команда сначала запускается с -n:

rsync -nva --delete src/dir/ dst/
sending incremental file list
deleting old.txt
a.txt
new.txt

sent 115 bytes  received 111 bytes  452.00 bytes/sec
total size is 14  speedup is 0.06 (DRY RUN)

Признак пробного режима — пометка (DRY RUN) в последней строке. Строки deleting … — это то, что будет удалено в назначении.

Подробный вывод: -i

Параметр -i (--itemize-changes) показывает, что именно изменится в каждом файле:

rsync -nai --delete src/dir/ dst/
*deleting   old.txt
>f.st...... a.txt
>f+++++++++ new.txt

Строка читается так: первый символ — направление (> — файл передаётся на приёмник), второй — тип (f файл, d каталог, L ссылка). Далее идут признаки отличий: s — размер, t — время. Знаки +++++++++ — объекта нет в назначении, он будет создан. *deleting — объект будет удалён.

Завершающий слеш в пути источника

Слеш в конце пути источника определяет, что именно копируется. Это самая частая причина ошибок.

Исходная структура:

src/
└── dir/
    ├── a.txt
    └── b.txt

Без слеша копируется сам каталог:

rsync -a src/dir dst/
dst/
└── dir/
    ├── a.txt
    └── b.txt

Со слешем копируется только содержимое каталога:

rsync -a src/dir/ dst/
dst/
├── a.txt
└── b.txt

Слеш в конце пути назначения ни на что не влияет.

Чтобы избежать неоднозначности, указывайте источник со слешем и всегда проверяйте результат через -n.

Путь назначения на удалённой машине

rsync -a src/dir/ user@host:dest_dir

Путь dest_dir — относительный, он считается от домашнего каталога: /home/user/dest_dir. Абсолютный путь начинается со слеша: user@host:/var/www/html/.

Если в пути назначения ничего нет после двоеточия, это домашний каталог:

rsync -a file.txt user@host:

rsync создаёт только последний уровень каталога назначения. Если не хватает промежуточных, команда завершится ошибкой mkdir ... failed: No such file or directory, код 11. Начиная с версии 3.2.3 можно добавить --mkpath, и тогда создаётся вся цепочка:

rsync -a --mkpath src/dir/ dst/x/y/z/

Параметры

-a — режим архива

Сокращение для -rlptgoD:

Флаг Что делает
-r рекурсивно обходит каталоги
-l копирует символические ссылки как ссылки
-p сохраняет права доступа
-t сохраняет время модификации
-g сохраняет группу
-o сохраняет владельца
-D сохраняет устройства и специальные файлы

Флаг -t важен для скорости: благодаря ему при следующем запуске rsync видит совпадающее время и пропускает файл.

Владелец и группа сохраняются только если приёмник работает от root. Для обычного пользователя флаги -o и -g не дают эффекта, ошибки при этом нет.

-e — команда для подключения, нестандартный порт SSH

По умолчанию rsync подключается по SSH на порт 22. Если сервер слушает другой порт, передайте его через -e:

rsync -a -e "ssh -p 2222" html/ user@host:html/

Порт SSH указывается строчной -p. Не путайте со scp, где порт задаётся заглавной -P.

Альтернатива — описать сервер в ~/.ssh/config и не указывать порт в каждой команде:

Host myserver
    HostName host.example.com
    User user
    Port 2222
rsync -a html/ myserver:html/

--exclude — исключить файлы и каталоги

rsync -a -e "ssh -p 2222" --exclude 'assets/css' html/ user@host:html/

Правила сопоставления шаблона:

Исключённые файлы не удаляются в назначении при использовании --delete.

--delete — привести назначение к виду источника

--delete удаляет в назначении всё, чего нет в источнике:

rsync -a --delete -e "ssh -p 2222" test/ user@host:test/

Это самый опасный параметр rsync. Типичная катастрофа — неверный путь назначения:

# хотели обновить /var/www/html, а указали /var/www/
rsync -a --delete html/ user@host:/var/www/

Из /var/www/ будет удалено всё, чего нет в html/, включая другие сайты. Поэтому правила такие:

  1. Сначала команда с -nv (или -nai), и внимательное чтение списка deleting.
  2. Только потом та же команда без -n.
  3. В скриптах ограничивайте ущерб: --max-delete=N прервёт работу, если удалений больше N.

Родственные параметры:

Другие полезные параметры

Параметр Назначение
-z сжимать данные при передаче (для уже сжатых файлов — jpg, zip — бесполезно)
-h размеры в человекочитаемом виде
-P сокращение для --partial --progress: прогресс и докачка прерванных файлов
-u не трогать файлы, которые новее на приёмнике
--ignore-existing не обновлять файлы, которые уже есть в назначении
-c сравнивать по контрольной сумме, а не по размеру и времени (медленно)
--bwlimit=КБ/с ограничить скорость
--stats вывести итоговую статистику

Практика: деплой каталога сайта

Задача: каталог html/ на локальной машине должен оказаться в /var/www/html/ на сервере.

Обычный пользователь не имеет права записи в /var/www/html/, поэтому деплой делается в два шага через домашний каталог.

Шаг 1. Локальная машина → домашний каталог сервера.

rsync -nva --delete -e "ssh -p 2222" html/ user@host:html/    # проверка
rsync -a --delete -e "ssh -p 2222" html/ user@host:html/      # выполнение

Шаг 2. На сервере: домашний каталог → каталог веб-сервера.

sudo rsync -nva --delete ~/html/ /var/www/html/    # проверка
sudo rsync -a --delete ~/html/ /var/www/html/      # выполнение

После sudo rsync -a файлы в /var/www/html/ получат владельца user. Веб-серверу этого достаточно, если права позволяют чтение. Если нужен другой владелец, добавьте --chown (rsync 3.1.0+, работает при запуске от root):

sudo rsync -a --delete --chown=apache:apache ~/html/ /var/www/html/

Имя пользователя веб-сервера зависит от системы: apache или nginx на RHEL-семействе, www-data на Debian и Ubuntu.

Деплой одной командой

Можно запустить rsync на сервере от root прямо через SSH:

rsync -a --delete -e "ssh -p 2222" --rsync-path="sudo rsync" html/ user@host:/var/www/html/

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

Типичные ошибки

Симптом Причина
В назначении появился лишний вложенный каталог у источника нет завершающего слеша
Удалилось лишнее --delete без пробного прогона или неверный путь назначения
rsync: command not found (код 127) на одной из машин нет rsync
Connection refused указан не тот порт SSH, не добавлен -e "ssh -p …"
Permission denied (13) нет прав записи в каталоге назначения
mkdir ... failed: No such file or directory (код 11) не хватает промежуточных каталогов, нужен --mkpath
Источник и назначение перепутаны порядок аргументов: сначала источник

Справка

man rsync
rsync --help

Мануал онлайн: https://download.samba.org/pub/rsync/rsync.1
Документация проекта: https://rsync.samba.org/documentation.html