rsync копирует файлы так, что при повторном запуске передаются только изменения. Поэтому он подходит и для бэкапов, и для переноса сайтов между серверами, и для выкладки локальной разработки на VPS.
Установка
Обычно rsync уже есть в системе. Если нет:
sudo apt install rsync # Debian, Ubuntu sudo dnf install rsync # Fedora, RHEL brew install rsync # macOS
Для работы с сервером rsync должен быть установлен с обеих сторон.
Базовая команда
rsync -avh /path/source/ /path/destination/
-aархивный режим: рекурсивно, с правами, владельцами, датами и ссылками;-vподробный вывод;-hразмеры в понятном виде.
Важная мелочь: косая черта в конце источника. source/ копирует содержимое каталога, source копирует сам каталог внутрь назначения.
Через SSH
rsync -avzh /path/source/ user@server:/path/destination/
Ключ -z сжимает данные при передаче. Он полезен для текста и бесполезен для уже сжатых картинок и архивов. Нестандартный порт SSH задают так: -e "ssh -p 2222".
Полезные варианты
Исключить временные файлы и кэш:
rsync -avh --exclude='*.tmp' --exclude='cache/' src/ backup/
Не трогать файлы, которые уже есть в назначении:
rsync -avh --ignore-existing src/ dst/
Сделать точную копию, удалив в назначении лишнее:
rsync -avh --delete src/ dst/
С --delete всегда сначала запускайте пробный прогон: -n или --dry-run покажет, что будет сделано, ничего не меняя.
Показать прогресс при переносе больших объёмов:
rsync -avh --info=progress2 user@old:/var/www/ /var/www/
Автоматизация через cron
Ежедневный бэкап в 2:00:
0 2 * * * rsync -a --delete /data/ user@backup:/backup/data/ >> /var/log/rsync-backup.log 2>&1
Для этого нужен вход по ключу без пароля, подробнее в статье о SSH-ключах.
Выкладка WordPress с локальной машины на VPS
Обычно синхронизируют только код темы и плагинов, а загрузки и wp-config.php не трогают:
rsync -avz --delete \ --exclude='.git/' \ --exclude='node_modules/' \ ./wp-content/themes/my-theme/ \ user@vps:/var/www/site/wp-content/themes/my-theme/
Если нужно перенести весь сайт:
rsync -avz \ --exclude='wp-config.php' \ --exclude='wp-content/cache/' \ ./ user@vps:/var/www/site/
После этого поправьте владельца файлов на сервере, например sudo chown -R www-data:www-data /var/www/site.
Файлы это только половина сайта. Базу данных переносят отдельно, удобнее всего через WP-CLI:
wp db export site.sql rsync -avz site.sql user@vps:/tmp/ ssh user@vps "cd /var/www/site && wp db import /tmp/site.sql && wp search-replace 'http://site.local' 'https://site.ru' --all-tables"
При смене адреса сайта пригодится инструкция о переносе WordPress на новый домен.