###### 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
```

## Настройка rsync.
Будем использовать следующую логику бекапов.При первом запуске мы делаем полный бэкап интересующей нас информации в папку **backup**. Потом раз в сутки мы сверяем имеющийся архив с источником и делаем его вновь актуальным, перезаписывая все изменившиеся файлы, но при этом не удаляем их, а складываем в папку **increment**, где каждый день создается папка с именем в виде даты, в которую складываются все измененные файлы за текущий день. Таким образом, у нас всегда будет полный архив, актуальный на момент последней синхронизации, плюс набор папок за каждый день с изменившимися в этот день файлами. Сколько дней хранить, можно выбрать по необходимости.
Для начала нужно открыть 873 порт, если используется фаервол.
```
ufw allow 873/tcp
```
В начале настроем rsync на серверах с которых будем брать информацию для бекапов.

Откроем файл */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
```

где 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}"
```
Получаем такой скрипт.

Делаем скрипт исполняемым:
```
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 а в ней файл с текстом.

На этом все, теперь можно запускать скрипт и ожидать его выполнения.

На серевере на который заливаем бекапы увидим такое.

Добавляем скрипт в 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