###### tags: Rsync, Linux, bash. # Настройка Rsync. В этой заметки: Установка и настройка Rsync для сервера хранения бекапов, написание скрипта на bash и добавление его в cron. ## Установка Rsync. Установим пакет rsync на бекап сервер. ``` apt install rsync ``` Откроем конфиг */etc/default/rsync* и приведем строку к такому виду: ``` RSYNC_ENABLE=true ``` Создаем пустой файл конфигурации /etc/rsyncd.conf, он нужен для запуска службы. ``` touch /etc/rsyncd.conf ``` Запускаем rsync: ``` systemctl enable --now rsync ``` Проверяем, что работает: ``` netstat -tulnp | grep rsync ``` ![](https://i.imgur.com/ldAEMxY.png) ## Настройка rsync. Будем использовать следующую логику бекапов.При первом запуске мы делаем полный бэкап интересующей нас информации в папку **backup**. Потом раз в сутки мы сверяем имеющийся архив с источником и делаем его вновь актуальным, перезаписывая все изменившиеся файлы, но при этом не удаляем их, а складываем в папку **increment**, где каждый день создается папка с именем в виде даты, в которую складываются все измененные файлы за текущий день. Таким образом, у нас всегда будет полный архив, актуальный на момент последней синхронизации, плюс набор папок за каждый день с изменившимися в этот день файлами. Сколько дней хранить, можно выбрать по необходимости. Для начала нужно открыть 873 порт, если используется фаервол. ``` ufw allow 873/tcp ``` В начале настроем rsync на серверах с которых будем брать информацию для бекапов. ![](https://i.imgur.com/2UdWYpM.png) Откроем файл */etc/rsyncd.conf*. Укажем путь до файла логов и файла процесса. Настройте папку - источник бекапов. Все директивы логически понятны. ``` pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log transfer logging = true munge symlinks = yes # папка источник для бэкапа [data] path = /data uid = root read only = yes list = yes comment = Data backup Dir auth users = backup secrets file = /etc/rsyncd.scrt ``` Создаем файл с учетными данными для подключения: ``` nano /etc/rsyncd.scrt ``` ![](https://i.imgur.com/tYTybxK.png) где backup - имя пользователя, qwerty - пароль. Делаем права на чтение только root, иначе rsync не запустится: ``` chmod 0600 /etc/rsyncd.scrt ``` Перезапускаем службу. ``` systemctl restart rsync ``` Теперь идем на сервер приемник, в котором будут храниться архивные копии с серверов источников. Там создаем скрипт инкрементного бэкапа c использованием rsync: ``` nano /usr/local/bin/backup-server.sh ``` Указываем что это будет именно bash скрипт. Команда date выведит текущую дату в консоль. ``` #!/bin/bash date ``` Создаем переменную в которой указываем директорию в которую будем складывать бекапы. ``` backups_dir=/backups/ ``` Создаем переменную с именем сервера который архивируем. ``` srv_name=server ``` Указываем адресс удаленного сервера который архивируем. ``` srv_ip=10.143.2.108 # сюда нужно писать IP сервера который резервируете! ``` Указываем пользователя rsync ``` srv_user=backup ``` Указываем что будем бекапить с удаленного сервера. В качестве название выступает название настраиваемой папки из файла */etc/rsyncd.conf* удалееного сервера. ``` srv_dir=data ``` Выводим сообщение что запускаем backup сервера. ``` echo "Start backup ${srv_name}" ``` Создаем папку для инкрементных бэкапов. ``` mkdir -p ${syst_dir}${srv_name}/increment/ ``` Запускаем непосредственно бэкап с параметрами: ``` /usr/bin/rsync -avz --progress --delete --password-file=/etc/rsyncd.scrt ${srv_user}@${srv_ip}::${srv_dir} ${syst_dir}${srv_name}/backup/ --backup --backup-dir=${syst_dir}${srv_name}/increment/`date +%Y-%m-%d`/ ``` Чистим папки с инкрементными архивами старше 30-ти дней: ``` /usr/bin/find ${syst_dir}${srv_name}/increment/ -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \; ``` Выводим время завершения бекапа и сообщение. ``` date echo "Finish backup ${srv_name}" ``` Получаем такой скрипт. ![](https://i.imgur.com/wTSfqB9.png) Делаем скрипт исполняемым: ``` chmod 0744 /usr/local/bin/backup-server.sh ``` Создаем файл с паролем для авторизации на сервере источнике: ``` nano /etc/rsyncd.scrt ``` Со следующем содержимым: ``` qwerty # пароль пользователя backup указанный на архивируемом сервере. ``` Делаем права на чтение только root, иначе rsync выдаст ошибку: **ERROR: password file must not be other-accessible** ``` chmod 0600 /etc/rsyncd.scrt ``` Создайте на сервере который резервируете директорию /data а в ней файл с текстом. ![](https://i.imgur.com/NRTh2cG.png) На этом все, теперь можно запускать скрипт и ожидать его выполнения. ![](https://i.imgur.com/jf3dVsW.png) На серевере на который заливаем бекапы увидим такое. ![](https://i.imgur.com/yJ7MJiJ.png) Добавляем скрипт в crontab. ``` echo "15 24 * * * root backup-server.sh" >> /etc/crontab ``` ## Дополнительные возможности rsync. ### Копирование через ssh. Rsync может работать через ssh. Это избавляет от необходимости настраивать отдельно службу и авторизацию, но при этом будут использоваться системные учетные записи. Для того, чтобы скопировать файлы с помощью rsync по ssh нет необходимости запускать службу, настраивать конфиг, создавать файл с авторизацией. Можно просто запустить примерно такую команду на передачу файлов. ``` /usr/bin/rsync -avz --progress --delete root@10.1.6.221:/data/mysql_dump /backup ``` Если для подключения вы используете публичный ключ или нестандартный порт ssh, указать эти параметры можно следующим образом. > [color=red] **Будьте внимательны при использовании ключа --delete. Не перепутайте источник, откуда качаете файлы, с приемником, куда копируете. Если их перепутать и в качестве источника указать пустую папку, а в качестве приемника с файлами, файлы будут удалены моментально и без предупреждения.** ``` /usr/bin/rsync -avz --progress --delete -e "ssh -p 1234 -i /root/.ssh/id_rsa.pub" root@10.1.6.221:/data/mysql_dump /backup ``` ### Настройка исключений. Вы можете настроить исключение файлов или каталогов при копировании с помощью rsync. Делается это с помощью ключа --exclude или --exclude-from. Первый позволяет указать исключение непосредственно в команде на исполнение. Второй позволяет загружать список исключений из файла. Пример первого варианта: ``` /usr/bin/rsync -avz --progress --delete --exclude='*.jpeg' root@10.1.6.221:/var/www/html /backup ``` Вы скопируете директорию с сайтом, исключив из нее все картинки с расширением .jpeg. Таких исключений можно добавить сколько угодно в одной команде. Но удобнее их выносить в отдельный файл. Примерно так. ``` /usr/bin/rsync -avz --progress --delete --exclude-from=exclude.lst root@10.1.6.221:/var/www/html /backup ``` Содержимое файла exclude.lst. ``` */bitrix/managed_cache/MYSQL/* */bitrix/backup/* */bitrix/html_pages/site.ru/* */upload/resize_cache/* */bitrix/cache/* */log.txt */rating/logs/my_file.log ``` Это пример исключений для bitrix сайта. Все эти команды и исключения можно комбинировать и использовать в скриптах на примере того, что я привел в самом начале. Используемый источник: https://serveradmin.ru/rsync-nastroyka-bekapa-na-centos-debian-ubuntu/#Kopirovanie_rsync_cerez_ssh