rsync — синхронизация и копирование файлов: инкремент, SSH, exclude, при необходимости зеркало с --delete. Удобен для бэкапов, миграций и выкладки темы/плагинов/uploads WordPress на VPS. Ниже — флаги, типичные сценарии, деплой и перенос дампа БД отдельно от файлов.
Зачем rsync
- Инкремент — по возможности уходят только изменения, а не весь каталог.
- Сжатие (
-z) — меньше трафика на узком канале. - SSH — привычный транспорт между машинами.
- Автоматизация — скрипты,
cron, systemd timer.
Нюанс путей: src/ копирует содержимое в destination; src без слэша может создать вложенный каталог src внутри destination. Перед боевым --delete всегда -n (dry-run).
Установка
На многих Linux-системах пакет уже есть. Если нет:
Debian / Ubuntu
sudo apt update && sudo apt install rsync
RHEL / Alma / Rocky / CentOS
sudo dnf install rsync # или: sudo yum install rsync
macOS (Homebrew) — системный rsync часто старый; Homebrew даёт свежую сборку:
brew install rsync
Базовые примеры
1. Локально: каталог в каталог
rsync -avh /path/source/ /path/destination/
-a— archive: рекурсия, симлинки, права, времена, владелец (где позволяет FS);-v— подробный вывод;-h— размеры «по-человечески».
2. На удалённый хост по SSH
rsync -avh -e ssh /path/source/ user@remote_server:/path/destination/
-e ssh явно задаёт транспорт (часто rsync и так ходит по SSH). Порт не 22:
rsync -avh -e "ssh -p 2222" /path/source/ user@host:/path/destination/
3. Бэкап с исключениями
rsync -avh --exclude='*.tmp' --exclude='cache/' /path/source/ /path/backup/
Много правил удобнее в файле: --exclude-from=excludes.txt.
4. Не затирать уже существующие на приёмнике
rsync -avh --ignore-existing /path/source/ /path/destination/
Файлы, которые уже есть на destination, не обновляются — только «докинуть отсутствующие». Зеркало с удалением лишнего — это --delete (осторожно).
5. Сжатие
rsync -avzh /path/source/ user@remote_server:/path/destination/
-z жмёт поток. На гигабите и SSD выигрыш часто скромный; на слабом uplink — заметный. Уже сжатые архивы и медиа почти не выиграют.
6. Миграция с прогрессом
rsync -avzh --progress -e ssh user@old_server:/path/ /path/destination/
Тяните с old на new в два прохода: первый пока сервис жив, второй после короткого maintenance — догонит хвост изменений.
7. Зеркало между серверами
rsync -avz --delete /var/www/html/ user@server2:/var/www/html/
--delete удалит на server2 файлы, которых нет в источнике. Перед этим: rsync -avzn --delete ... и бэкап. Не направляйте delete на каталог с данными, которых нет в src (локальные конфиги, .env вне репозитория).
8. Cron
Ежедневно в 02:00 (crontab пользователя с доступом по ключу):
0 2 * * * rsync -avh -e ssh /data/ user@remote_server:/backup/ >>/var/log/rsync-backup.log 2>&1
WordPress: локалка → VPS
rsync удобен, когда нужно выкатить тему, плагин или uploads без zip/scp всего wp-content. Базу rsync «не понимает»: дамп через WP-CLI / mysqldump, файл — rsync, импорт на сервере, при смене домена — search-replace URL.
1. Подготовка
SSH-ключ, чтобы не вводить пароль в скриптах:
ssh-keygen -t ed25519 ssh-copy-id user@vps_ip
Обычно синхронизируют:
- темы:
wp-content/themes/your-theme/ - плагины:
wp-content/plugins/(или один плагин) - медиа:
wp-content/uploads/ - дамп БД — отдельным шагом
Часто исключают: node_modules/, .git/, кэши сборщиков, *.log, иногда wp-config.php (чтобы не затереть прод-креды).
2. Тема
rsync -avz --progress \ --exclude="*.log" \ --exclude="node_modules/" \ --exclude=".git/" \ /path/to/local/wp-content/themes/your-theme/ \ user@vps_ip:/path/to/vps/wp-content/themes/your-theme/
3. Uploads
rsync -avz --progress \ /path/to/local/wp-content/uploads/ \ user@vps_ip:/path/to/vps/wp-content/uploads/
Первый прогон на большой медиатеке долгий; следующие быстрее. Если на проде пользователи сами грузят файлы, «локалка затирает VPS» опасна — продумайте направление sync.
4. База данных
Экспорт локально (WP-CLI):
wp db export local-db.sql
Перенос файла:
rsync -avz local-db.sql user@vps_ip:/path/to/vps/backups/
Импорт на VPS:
ssh user@vps_ip cd /path/to/vps wp db import /path/to/vps/backups/local-db.sql # при смене домена: wp search-replace 'http://local.test' 'https://example.com' --all-tables
Перед импортом на прод — бэкап текущей БД. Не заливайте локальный wp-config.php поверх боевого.
5. Скрипт выкладки
#!/bin/bash set -euo pipefail VPS="user@vps_ip" REMOTE_WP="/path/to/vps" LOCAL_WP="/path/to/local" rsync -avz --progress \ --exclude="*.log" --exclude="node_modules/" --exclude=".git/" \ "$LOCAL_WP/wp-content/themes/your-theme/" \ "$VPS:$REMOTE_WP/wp-content/themes/your-theme/" rsync -avz --progress \ --exclude="*.log" --exclude="node_modules/" --exclude=".git/" \ "$LOCAL_WP/wp-content/plugins/" \ "$VPS:$REMOTE_WP/wp-content/plugins/" rsync -avz --progress \ "$LOCAL_WP/wp-content/uploads/" \ "$VPS:$REMOTE_WP/wp-content/uploads/" # БД - только если осознанно (staging, не слепой cron на прод): # wp db export /tmp/local-db.sql # rsync -avz /tmp/local-db.sql "$VPS:$REMOTE_WP/backups/"
chmod +x sync-script.sh. Автоимпорт БД по cron на живой сайт обычно лишний риск: файлы — да, БД — по задаче и с бэкапом.
6. Cron для файлов
0 2 * * * /path/to/sync-script.sh >>/var/log/wp-rsync.log 2>&1
Короткий чеклист
- Сначала
-n/--dry-run, потом без него. - Следите за trailing slash у путей.
--deleteтолько когда зеркало действительно нужно.- Не затирайте прод
wp-config.phpи секреты. - После переноса БД — URL search-replace и проверка прав на uploads.
rsync закрывает бэкапы, миграции и деплой файлов WordPress без лишней возни. Связка SSH-ключ + точечные exclude + осторожный --delete + отдельный контур для БД даёт предсказуемый процесс и на одном VPS, и между серверами.
