Перейти к содержимому

rsync: копирование файлов между серверами

Как скопировать папку на другой сервер и обратно, докачать после обрыва, сделать точную копию с удалением лишнего и перенести данные со старого сервера. И scp для одного файла.

Содержание

rsync копирует файлы по SSH и при повторном запуске передаёт только то, что изменилось. Оборвалась связь — запустите ту же команду ещё раз, и она докачает остаток. Поэтому им удобно переносить сайт или данные на новый сервер и делать копии.

Установка

rsync нужен на обоих серверах — и на том, откуда копируете, и на том, куда. Если команды нет:

sudo apt install rsync    # Ubuntu, Debian
sudo dnf install rsync    # AlmaLinux
sudo pkg install rsync    # FreeBSD

Скопировать папку на другой сервер

rsync -avP /var/www/example.ru/ ubuntu@203.0.113.10:/var/www/example.ru/
  • -a — папки целиком, с правами, датами и ссылками;
  • -v — показывать, что копируется;
  • -P — прогресс, и недокачанные файлы при обрыве не стираются, а докачиваются.

Забрать с сервера к себе — то же, только наоборот:

rsync -avP ubuntu@203.0.113.10:/var/www/example.ru/ ~/backup/example.ru/
Внимание Косая черта в конце пути важна. /var/www/example.ru/ — содержимое папки, /var/www/example.ru без черты — сама папка: внутри назначения появится ещё одна example.ru. Чтобы не гадать, ставьте черту в конце обоих путей.

Сначала посмотреть, что будет

Ключ -n показывает, что rsync сделал бы, но ничего не трогает:

rsync -avn /var/www/example.ru/ ubuntu@203.0.113.10:/var/www/example.ru/

Точная копия: --delete

Обычно rsync только добавляет и обновляет файлы. С --delete он ещё и удаляет в назначении то, чего больше нет в источнике, — получится точная копия. Если при этом перепутать местами источник и назначение, rsync удалит свежие файлы. Поэтому с --delete всегда сначала запуск с -n:

rsync -avn --delete /var/www/example.ru/ ubuntu@203.0.113.10:/var/www/example.ru/
rsync -av --delete /var/www/example.ru/ ubuntu@203.0.113.10:/var/www/example.ru/

Не копировать лишнее: --exclude='cache/', --exclude='*.log'.

Другой порт SSH и свой ключ

rsync -avP -e 'ssh -p 2222' /data/ ubuntu@203.0.113.10:/data/
rsync -avP -e 'ssh -i ~/.ssh/backup_key' /data/ ubuntu@203.0.113.10:/data/

Перенос со старого сервера

Удобный порядок для переезда сайта или данных:

  1. Скопируйте всё заранее, пока старый сервер работает. Это самая долгая часть, сайт при этом не останавливается.
  2. Перед переключением остановите на старом сервере то, что меняет файлы (или включите на сайте режим обслуживания), и запустите ту же команду ещё раз — она перенесёт только изменения, это минуты.
  3. Базу данных переносите не копированием файлов, а выгрузкой: MySQL на своём сервере, PostgreSQL на облачном сервере.

Файлы, которые может читать только root (/etc, чужие домашние папки), учётка вроде ubuntu прочитать не сможет. Запустите rsync на удалённой стороне через sudo — ключ --rsync-path:

rsync -avP --rsync-path="sudo rsync" ubuntu@198.51.100.20:/etc/nginx/ ~/old-nginx/

Это сработает, если sudo на том сервере не спрашивает пароль, — у учётки администратора в наших образах так и есть. После копирования проверьте владельцев: на новом сервере пользователи могут называться иначе — поправьте их командой chown.

scp — для одного файла

Скопировать пару файлов проще scp — он тоже работает по SSH и есть везде, где есть ssh, включая Windows:

scp dump.sql.gz ubuntu@203.0.113.10:~/
scp ubuntu@203.0.113.10:/var/log/nginx/error.log .
scp -P 2222 file ubuntu@203.0.113.10:~/     # порт — большая P

scp не умеет докачивать и не пропускает уже скопированное — для больших объёмов берите rsync.

Если rsync ругается

  • rsync: command not found или remote command not found — rsync не установлен на одном из серверов.
  • Permission denied (publickey) — не подходит ключ или имя пользователя. Проверьте, что обычный ssh с теми же параметрами пускает.
  • Permission denied на отдельных файлах — у учётки нет прав их читать или записывать: см. раздел про перенос.
  • Код ошибки 23 в конце — часть файлов не скопировалась, причина — в строках выше.

Не нашли ответ? Напишите в поддержку — подскажем.