rsync: синхронизация файлов, бэкапы и деплой WordPress на VPS

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, и между серверами.

Источники и ссылки


Комментарии загружаются…