Skip to content

This article is available in Russian. An English version is on the way.Open the Russian page

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

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

Level
Intermediate
Reading time
3 min read
Updated
Tested on
Ubuntu 22.04, Ubuntu 24.04, Debian 12
Contents
  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 \  backup-web01@backup.example.com: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 \  backup-web01@backup.example.com: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 backup-web01@backup.example.com

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

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

bash
$ rsync -aH \  -e "ssh -i /root/.ssh/backup_ed25519" \  backup-web01@backup.example.com:current/var/www/ /var/www/

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

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

Read to the end and the article counts toward your learning progress.

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

Was this article helpful?