Під час міграції сайту потрібно перенести тисячі файлів між серверами. Вибір інструмента впливає на швидкість, безпеку та зручність — особливо за повторних синхронізацій.
Порівняння інструментів перенесення
| Інструмент | Швидкість | Безпека | Інкрементальність | Вимоги |
|---|---|---|---|---|
| rsync | Висока | Висока (SSH) | Так (лише зміни) | SSH на обох серверах |
| SCP | Середня | Висока (SSH) | Ні | SSH на обох серверах |
| FTP/SFTP | Середня | Низька/Висока | Ні | FTP-клієнт |
| tar + SSH pipe | Висока | Висока | Ні | tar, SSH |
rsync — найкращий вибір для міграції
rsync передає лише змінені блоки файлів, що робить його незамінним для фінальної синхронізації перед перемиканням DNS:
# Синхронізувати директорію з віддаленим сервером
rsync -avz --progress /var/www/example.com/ root@new-server:/var/www/example.com/
# Ключі:
# -a — архівний режим (зберігає права, час, симлінки)
# -v — детальний вивід
# -z — стиснення під час передавання
# --progress — показати прогрес
# Виключити непотрібні директорії
rsync -avz --exclude=".git" --exclude="node_modules" /var/www/example.com/ root@new-server:/var/www/example.com/
# Видалити на цілі файли, яких немає в джерелі
rsync -avz --delete /var/www/example.com/ root@new-server:/var/www/example.com/
SCP — швидке перенесення архівів
># Скопіювати файл на віддалений сервер
scp backup.tar.gz root@new-server:/tmp/
# Скопіювати директорію рекурсивно
scp -r /var/www/example.com root@new-server:/var/www/
# Скопіювати з віддаленого сервера локально
scp root@old-server:/var/www/example.com/config.php ./
# Використати нестандартний SSH-порт
scp -P 2222 backup.tar.gz root@new-server:/tmp/
tar + SSH pipe — перенесення без проміжних файлів
# Передати директорію напряму без створення архіву на диску
tar -czf - /var/www/example.com/ | ssh root@new-server "tar -xzf - -C /var/www/"
# Це швидше, ніж: створити архів → scp → розпакувати
SFTP (безпечний FTP) через lftp
># Паралельне завантаження через lftp (5 з'єднань)
lftp -u username,password sftp://new-server <<'EOF'
mirror -P5 /var/www/example.com /var/www/example.com
quit
EOF
- День 1: Первинна синхронізація rsync (усі файли, повільно)
- День міграції: Фінальний rsync --delete (лише зміни, швидко — 1–5 хвилин)
- Перемкнути DNS
SSH-ключі для автоматизації
># Створити пару ключів (без пароля для автоматизації)
ssh-keygen -t ed25519 -C "migration-key" -f ~/.ssh/migration_key -N ""
# Додати публічний ключ на новий сервер
ssh-copy-id -i ~/.ssh/migration_key.pub root@new-server
# Використати конкретний ключ у rsync
rsync -avz -e "ssh -i ~/.ssh/migration_key" /var/www/example.com/ root@new-server:/var/www/example.com/
Типові помилки під час перенесення файлів
| Помилка | Причина | Що робити |
|---|---|---|
| rsync: command not found на віддаленому сервері | Пакет rsync не встановлено на цільовому сервері — клієнта недостатньо, потрібен і на сервері | Встановіть з обох боків: apt install rsync -y |
| Permission denied (publickey) | SSH-ключ ще не скопійовано на новий сервер, або використовується не той ключ за замовчуванням | Додайте ключ явно: ssh-copy-id -i ~/.ssh/migration_key.pub root@new-server |
| rsync error: some files/attrs were not transferred (code 23) | Не вистачає прав на частину файлів, або серед них є биті символьні посилання в нікуди | Запустіть з --dry-run -v, щоб побачити конкретні проблемні файли перед реальним перенесенням |
| scp: /var/www/example.com: No such file or directory | Цільову директорію на новому сервері ще не створено | Створіть її заздалегідь: ssh root@new-server "mkdir -p /var/www/example.com" |
Який інструмент обрати за сценарієм
| Сценарій | Рекомендований інструмент |
|---|---|
| Разове перенесення одного архіву | SCP |
| Регулярна синхронізація з повторними запусками | rsync |
| Перенесення без проміжного файлу на диску, мало вільного місця | tar + SSH pipe |
| Багато дрібних файлів, потрібне паралельне завантаження | lftp з прапором mirror -P |
Коли жоден із цих інструментів не підходить
- Переноситься база даних, а не файли — rsync і SCP копіюють файлову систему, для бази потрібен mysqldump або фізичний бекап СУБД
- Обсяг даних — десятки терабайт — пряме перенесення мережею триватиме днями, розумніше фізичне відправлення диска або пряма реплікація в об'єктне сховище
- Перенесення між дуже різними файловими системами (наприклад з Windows-хостингу) — права доступу й атрибути не переносяться один в один, потрібна додаткова нормалізація
- Сайт продовжує приймати запис даних від користувачів під час перенесення — потрібна пауза запису або черга синхронізації, інакше останні хвилини активності будуть втрачені
Для регулярних повторюваних синхронізацій між серверами, а не разового перенесення, є окремий розбір у статті «rsync: синхронізація серверів та резервне копіювання». Якщо переноситься саме WordPress, повний сценарій з базою даних описано у статті «Перенесення WordPress на VDS: покрокова інструкція».
Перевірка результату
Після перенесення переконайтеся, що на обох сторонах дані ідентичні:
# Кількість файлів має збігатися на старому і новому сервері
find /var/www/example.com -type f | wc -l
ssh root@new-server "find /var/www/example.com -type f | wc -l"
# Сумарний розмір директорії на обох сторонах
du -sh /var/www/example.com
ssh root@new-server "du -sh /var/www/example.com"
# Контрольна сума ключового файлу конфігурації
md5sum /var/www/example.com/wp-config.php
ssh root@new-server "md5sum /var/www/example.com/wp-config.php"
Повний чекліст перевірки сайту після перенесення, включно з DNS і SSL, — у статті «Чекліст перевірки сайту після міграції на новий хостинг».