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

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 на новый домен.

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


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