Утилита Unison позволяет делать полную синхронизацию файлов и каталогов для целей резервного копирования либо обеспечения высокой доступности сайта либо интернет магазина.
Полная процедура синхронизации файлов включает в себя следующие этапы:
Создание SSH ключей
Для упрощения задачи синхронизирования файлов и каталогов, сперва необходимо создать SSH ключи для доступа к серверам по ключу, для того чтобы иметь возможность подключаться к серверам без пароля. Выполняем команду:
ssh-keygen
Далее следует ввести путь файла в который будут помещены ключи, например $HOME/.ssh/id_rsa. Для того что оставить путь по умолчанию необходимо нажать Enter.
Для ограничения доступа к закрытому ключу используется passphrase (пароль). Пункт создания пароля можно пропустить нажав клавишу Enter, но в таком случае надёжность ключа существенно снижается, т.к. в случае потери его смогут использовать третьи лица.
При успешном создании пары ключей вы увидите randomart image.
Открытые ключи хранятся в файле /$HOME/.ssh/id_rsa.pub, закрытые — /$HOME/.ssh/id_rsa.
Далее необходимо скопировать ключ на сервер в директорию /$HOME/.ssh/authorized_key. Эту операцию можно выполнить следующим образом:
cat ~/.ssh/id_rsa.pub | ssh user@host %22cat >> ~/.ssh/authorized_keys%22
После выполнения всех вышеописанных операций вы получите доступ к серверу по SSH ключу.
Установка Unison
Установка Unison осуществляется с помощью следующих команд:
sudo apt update
sudo apt install unison
Важно чтобы версия Unison была одинакова на всех системах, вплоть до x.xx в номере версии.
Установка SSHFS и монтирование каталога для синхронизации
Чтобы установить SSHF необходимо выполнить команды:
sudo apt update
sudo apt install SSHFS
Теперь необходимо создать директорию для монтирования удаленного раздела к локальному:
sudo mkdir /mnt/destinationdirectory
Чтобы примонтировать раздел удаленного сервера необходимо выполнить команду:
sudo sshfs username@host:/path/to/remote/directory /mnt/destinationdirectory
Копирование файлов с помощью Rsync
Для того чтобы скопировать необходимые директории и файлы с исходными правами владельца и доступа с исходного сервера на сервер назначения необходимо выполнить следущую команду:
rsync -rctuvpogz /path/on/source /mnt/destinationdirectory
Таким образом создаётся валидная копия файлов на сервере назначения с которой можно работать с помощью программы Unison.
Создание конфига Unison
Официальная документация по использованию и конфигурированию Unison доступна по ссылке. В данном материале предлагается пример конфигурации при которой:
-
синхронизация происходит в заданых каталогах (#Directories to sync);
-
сохраняются права доступа и владельца (#Leave chown and chmod);
-
при необходимости могут синхронизироваться только выбранные директории, исключая остальные (#List of included Directories);
-
можно исключать из синхронизации определенные типы файлов (#Excluding file types);
-
для избежания конфликтов при синхронизации, разные версии файлов можно выгружать в отдельную директорию, для дальнейшего их анализа (#Backing up modified files);
-
для отладки можно задать формат вывода разницы версий файлв (# showing backup files differences);
-
возможно включить логирование с указанием пути к файлу лога (#Logging the process ).
Чтобы создать файл конфигурации выполняем команду:
nano ~/.unison/$UNISONCONFIGNAME.prf
Далее вносим соответствующие параметры:
#Directories to sync
root = /path/to/source/directory/
root = /path/to/destination/directory/
#Leave chown and chmod
owner = true
times = true
#List of included Directories (excluding the rest), if needed
#path = cgi-bin
#path = htdocs
#path = conf
#Excluding file types
ignore = Name *~
ignore = Name .*~
ignore = Name *.o
ignore = Name *.tmp
ignore = Name {,.}*{.old}
#Backing up modified files (to avoid sync conflict)
backup = Name *
backups = true
backupdir = /path/to/backup/directory/
# showing backup files differences
#diff = diff -y -W 79 --suppress-common-lines
#Logging the process
log = true
logfile = ./path/to/log/directory/unison.log
Постановка задачи в cron на запуск синхронизации
Открываем crontab для редактирования следующей командой
crontab -e
Далее добавляем строки
SHELL=/bin/bash
* * * * * unison -force newer -times -batch $UNISONCONFIGNAME
Чтобы привести файл к виду:
# For more information see the manual pages of crontab(5) and cron(8) SHELL=/bin/bash
# m h dom mon dow command
* * * * * unison -force newer -times -batch $UNISONCONFIGNAME