Backup данных на OneDrive в Linux

В Windows 10 клиент OneDrive установлен в системе по умолчанию и изначально для хранения данных сервис предоставляет 15GB бесплатного пространства. Дополнительно можно получить «вечных» +30GB за счет бонусных программ. В моем случае это были: привлечение новых пользователей, загрузка изображений с камеры и программа лояльности. Как видите, можно получить существенный объем хранилища совсем даром. Так почему бы не использовать это место с пользой? Связи с чем я решил отказаться от использования DropBox и перенести все важные данные в облако OneDrive.

Еще я использовал Яндекс Диск в качестве хранилища бэкапов для Linux сервера. Главное достоинство Яндекс Диска — возможность заливать файлы по протоколу WebDAV просто используя сurl. Что бы все важные данные хранились в одном месте, было принято решение перенести бэкапы в OneDrive.

Для работы с OneDrive в Linux без использования клиента необходимо использовать OneDrive API. Я не горел желанием самостоятельно его ковырять, поэтому был взят уже готовый скрипт скрипт bash-onedrive-upload. Для работы скрипта необходимо указать Client ID и Client secret, для этого в Microsoft account Developer Center необходимо создать новое приложение. В настройках приложения «Edit settings» — «API Settings» обязательно нужно выбрать опцию «Mobile or desktop client app: yes».

Заливаем скрипт bash-onedrive-upload на сервер, bash-json-parser необходимо скачать отдельно и положить в каталог /libs/json/. Даем право на запуск:

chmod 0700 onedrive-authorize onedrive-base onedrive-upload ./libs/json/bash-json-parser

В файле onedrive.cfg необходимо указать полученные Client ID и Client secret:

export refresh_token_file="${script_base_folder}/.refresh_token"

# Authentication config
export api_client_id="Client ID"
export api_client_secret="Client secret"

# Upload config
# Leave empty for root folder
export api_folder_id=""
export max_upload_threads=2

Если оставить параметр export api_folder_id пустым, то по умолчанию файлы будут заливаться в корень OneDrive. При желании можно задать любой вложенный каталог. Для этого из адресной строки веб-интерфейса OneDrive необходимо скопировать id этого каталога.

Запускаем скрипт onedrive-authorize. Скрипт попросит перейти в браузере по указанной ссылке, где вам необходимо разрешить доступ приложению к данным OneDrive. После отверждения откроется пустая страница, из адресной строки которой в окно терминала необходимо скопировать значение параметра code. Если вы все сделали правильно, то увидите в терминале нечто похожее на это:

./onedrive-authorize
Please open the following URL in your browser and follow the steps until you see a blank page:
https://login.live.com/oauth20_authorize.srf?client_id=0000000000000000&scope=wl.skydrive%20wl.skydrive_update%20wl.offline_access&response_type=code&redirect_uri=https://login.live.com/oauth20_desktop.srf

When ready, please enter the value of the code parameter (from the URL of the blank page) and press return
111111111-1111-1111-1111-111111111111
It seems like we have a refresh token, so we are ready to go

После чего можно использовать скрипт для загрузки файлов:

#загрузка файла в коневой каталог
./onedrive-upload file1

#загрузка файла в вложенный каталог
./onedrive-upload -f "path" file1

Скрипт создания бэкапа и загрузки на сервер OneDrive:

BACKUP_FILES="/home/www /etc/nginx"
MYSQL_USER="user"
MYSQL_PASS="password"
TMP_DIR=/tmp/backup
BACKUP_TAR=/tmp/backup.`date +%y.%m.%d`.tar

mkdir -p $TMP_DIR

# Backup files
tar -czf $TMP_DIR/fs.tar.gz -P $BACKUP_FILES

# Backup MySQL
for db in $(mysql -B -s -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' | grep -v information_schema)
do
# Exclude database
    if [ $db != "performance_schema" ] && [ $db != "mysql" ]; then
    mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $db | gzip > $TMP_DIR/mysql.$db.sql.gz
    fi
done

# Merge files
tar -cf - -C $TMP_DIR . > $BACKUP_TAR

# OneDrive upload
./onedrive-upload -f "Sites/backup" $BACKUP_TAR

rm -r $TMP_DIR $BACKUP_TAR

Скрипт создает отдельный файл дампа для каждой базы MySQL, за исключением служебных данных, которые прописаны в исключения.