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

Бэкап файлов на другой сервер через rsync

Копировать каталоги на сервер хранения по SSH, ограничить ключ только записью в свой каталог и запускать по расписанию.

Уровень
Средний
Время чтения
3 мин чтения
Обновлено
Проверено на
Ubuntu 22.04, Ubuntu 24.04, Debian 12
Содержание
  1. Подготовка
  2. Отдельный ключ с ограничениями
  3. Первый запуск
  4. По расписанию
  5. Проверьте результат
  6. Восстановление
  7. Частые ошибки

rsync передаёт только изменившиеся части файлов, поэтому ежедневная копия даже большого каталога занимает секунды. Схема: рабочий сервер (web-01) отправляет данные на отдельный сервер хранения (backup.example.com) по SSH.

Подготовка

На обоих серверах:

bash
$ apt install -y rsync

На сервере хранения создайте отдельного пользователя и каталог:

bash
$ adduser --disabled-password --gecos "" backup-web01$ mkdir -p /srv/backups/web-01$ chown backup-web01: /srv/backups/web-01

Отдельный ключ с ограничениями

На рабочем сервере создайте ключ без фразы-пароля — он нужен для запуска по расписанию:

bash
$ ssh-keygen -t ed25519 -N "" -f /root/.ssh/backup_ed25519 -C "backup web-01"$ cat /root/.ssh/backup_ed25519.pub

На сервере хранения добавьте публичный ключ в /home/backup-web01/.ssh/authorized_keys с ограничениями: только rsync и только внутри своего каталога. Скрипт rrsync входит в пакет rsync.

/home/backup-web01/.ssh/authorized_keys — одной строкой
command="/usr/bin/rrsync /srv/backups/web-01",restrict ssh-ed25519 AAAA… backup web-01
Права на сервере хранения
$ mkdir -p /home/backup-web01/.ssh$ chmod 700 /home/backup-web01/.ssh$ chmod 600 /home/backup-web01/.ssh/authorized_keys$ chown -R backup-web01: /home/backup-web01/.ssh

Первый запуск

С rrsync пути на стороне хранилища указываются относительно разрешённого каталога. Сначала пробный прогон с -n — ничего не копируется, только показывается список:

bash
$ rsync -aH --delete -n -v \  -e "ssh -i /root/.ssh/backup_ed25519" \  /etc /var/www /home \  [email protected]:current/

Если список выглядит правильно, запустите без -n. Ключи: -a копирует рекурсивно с правами и датами, -H сохраняет жёсткие ссылки, --delete удаляет в копии то, что удалено на сервере. Владельцев файлов непривилегированный пользователь на стороне хранилища сохранить не может — при восстановлении проверьте их (chown -R www-data: /var/www/site) или используйте restic: он хранит владельцев в самом снимке.

По расписанию

/usr/local/bin/backup-files.sh
$ #!/bin/sh$ set -e$ rsync -aH --delete \  -e "ssh -i /root/.ssh/backup_ed25519" \  /etc /var/www /home \  [email protected]:current/$ echo "$(date -Is) ok"
bash
$ chmod +x /usr/local/bin/backup-files.sh
/etc/cron.d/backup-files
30 3 * * * root flock -n /run/backup-files.lock /usr/local/bin/backup-files.sh >> /var/log/backup-files.log 2>&1

flock не даст запуститься второй копии, если предыдущая ещё не закончилась.

Проверьте результат

bash
$ tail -n 5 /var/log/backup-files.log$ ssh -i /root/.ssh/backup_ed25519 [email protected]

Вторая команда должна завершиться отказом: ключ разрешает только rsync. На сервере хранения загляните в /srv/backups/web-01/current и сравните размеры с оригиналом через du -sh.

Восстановление

bash
$ rsync -aH \  -e "ssh -i /root/.ssh/backup_ed25519" \  [email protected]:current/var/www/ /var/www/

Частые ошибки

  • Слеш в конце источника меняет смысл: /var/www/ копирует содержимое каталога, /var/www — сам каталог.
  • Host key verification failed в cron — root ни разу не подключался к серверу хранения. Подключитесь один раз вручную.
  • Копируют файлы работающей базы данных. Для баз делайте дамп и уже его включайте в копию.

Дочитайте до конца — статья засчитается в обучении автоматически.

  • rsync
  • бэкап
  • ssh
  • cron
  • копирование файлов

Статья помогла?