Що таке rsync
rsync — утиліта для ефективної синхронізації файлів між серверами. Передає лише змінені частини файлів, що робить її ідеальною для інкрементальних бекапів і для перенесення файлів сайту між хостингами без зайвої витрати трафіку.
Порядок перенесення файлів сайту без простою
- Зробіть першу повну синхронізацію файлів на новий сервер, поки старий сайт продовжує працювати.
- Повторіть синхронізацію ще раз безпосередньо перед перемиканням — вона скопіює лише файли, що змінилися з першого разу.
- Перевірте новий сервер через файл
hosts, не чіпаючи DNS домену. - Перемкніть домен і одразу запустіть фінальний
rsyncіз прапорцем--delete, щоб прибрати файли, видалені на старому сервері за час переїзду. - Тримайте старий сервер доступним ще кілька днів на випадок відкату.
Реальний час простою при такому порядку — лише на перемикання DNS чи вебсервера, зазвичай від однієї до п'яти хвилин, а не години на копіювання всіх файлів.
Основні ключі rsync
| Ключ | Опис |
|---|---|
| -a | Архівний режим (рекурсія + права + метадані) |
| -v | Verbose — детальний вивід |
| -z | Стиснення під час передавання |
| --delete | Видаляти файли на приймачі, яких немає на джерелі |
| --exclude | Виключити файли/теки |
| --dry-run | Тестовий прогін без реальних змін |
| --link-dest | Жорсткі посилання для інкрементальних бекапів |
Базова синхронізація між серверами
# Синхронізація теки на віддалений сервер
rsync -avz --delete /var/www/mysite/ user@backup-server:/backups/mysite/
# З винятками
rsync -avz --delete --exclude='wp-content/cache/' --exclude='*.log' /var/www/mysite/ user@backup-server:/backups/mysite/
Перевірка результату без реального передавання
Перед першим запуском на реальних даних завжди проганяйте команду з прапорцем --dry-run — rsync покаже список файлів, які буде скопійовано або видалено, але нічого не торкнеться на диску:
rsync -avz --delete --dry-run /var/www/mysite/ user@backup-server:/backups/mysite/
Інкрементальні бекапи з --link-dest
#!/bin/bash
DATE=$(date +%Y-%m-%d_%H%M)
DEST=/backups/mysite
LATEST=$DEST/latest
rsync -avz --delete --link-dest=$LATEST /var/www/mysite/ $DEST/$DATE/
# Оновлюємо посилання на останній бекап
rm -f $LATEST
ln -s $DEST/$DATE $LATEST
--link-dest створює жорсткі посилання на незмінені файли замість їхнього копіювання — кожен знімок виглядає як повна копія, але реально займає місце лише за змінені файли.
Порівняння способів перенесення файлів через rsync
| Сценарій | Команда | Особливість |
|---|---|---|
| Разове перенесення всіх файлів | rsync -avz джерело призначення | без видалення на приймачі |
| Дзеркалювання (повний збіг) | rsync -avz --delete джерело призначення | видаляє зайве на приймачі |
| Щоденний бекап з історією | rsync -avz --link-dest=попередній | економить місце на диску |
Типові помилки
| Повідомлення | Причина і рішення |
|---|---|
| rsync: connection unexpectedly closed | Обірвалося SSH-з'єднання або не вистачило пам'яті на віддаленому сервері — повторіть із прапорцем --partial для докачування |
| Permission denied (publickey) | SSH-ключ не додано на віддалений сервер — скопіюйте його через ssh-copy-id |
| rsync error: some files/attrs were not transferred | Не вистачає прав на зміну власника файлів — запустіть із sudo на обох сторонах або приберіть -o -g з архівного режиму |
Відкат у разі проблем
- Не видаляйте файли на старому сервері до підтвердження, що новий працює штатно щонайменше добу.
- Якщо після перемикання виявилися зниклі файли, запустіть зворотну синхронізацію зі старого сервера на новий, без
--delete. - Розберіться з причиною невідповідності (зазвичай — винятки в
--exclude, які зачепили потрібні файли) і повторіть перенесення.
Коли rsync не підходить
--delete видаляє файли на приймачі без попередження. Завжди використовуйте --dry-run першого разу. Для баз даних rsync копіює файл СУБД «як є» і може передати його в неузгодженому стані, якщо сервер бази працює під час копіювання — для баз потрібен mysqldump або pg_dump, а не rsync файлів даних.
Автоматизація через cron
# Щоденний бекап о 3 ночі
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Перевірка результату
- Порівняйте кількість файлів:
find /var/www/mysite | wc -lна джерелі і приймачі має збігатися. - Перевірте контрольну суму кількох ключових файлів:
md5sumна обох сторонах. - Відкрийте сайт через підміну hosts і переконайтеся, що всі статичні файли завантажуються без 404.
Перенесення бази даних, яку потрібно синхронізувати разом із файлами, описано у статті перенесення бази даних MySQL, а загальний чек-лист перевірки сайту після переїзду — у статті перевірка після міграції.