rsync передаёт только изменившиеся части файлов, поэтому ежедневная копия даже большого каталога занимает секунды. Схема: рабочий сервер (web-01) отправляет данные на отдельный сервер хранения (backup.example.com) по SSH.
Подготовка
На обоих серверах:
$ apt install -y rsyncНа сервере хранения создайте отдельного пользователя и каталог:
$ adduser --disabled-password --gecos "" backup-web01$ mkdir -p /srv/backups/web-01$ chown backup-web01: /srv/backups/web-01Отдельный ключ с ограничениями
На рабочем сервере создайте ключ без фразы-пароля — он нужен для запуска по расписанию:
$ 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.
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 — ничего не копируется, только показывается список:
$ 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: он хранит владельцев в самом снимке.
По расписанию
$ #!/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"$ chmod +x /usr/local/bin/backup-files.sh30 3 * * * root flock -n /run/backup-files.lock /usr/local/bin/backup-files.sh >> /var/log/backup-files.log 2>&1flock не даст запуститься второй копии, если предыдущая ещё не закончилась.
Проверьте результат
$ tail -n 5 /var/log/backup-files.log$ ssh -i /root/.ssh/backup_ed25519 [email protected]Вторая команда должна завершиться отказом: ключ разрешает только rsync. На сервере хранения загляните в /srv/backups/web-01/current и сравните размеры с оригиналом через du -sh.
Восстановление
$ 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 ни разу не подключался к серверу хранения. Подключитесь один раз вручную.
- Копируют файлы работающей базы данных. Для баз делайте дамп и уже его включайте в копию.