---
# System prepended metadata

title: Настройка резервного копирования на google диск.
tags: [Linux]

---

###### tags: Linux, bash, backup, gdrive 
:::danger
Gdrive перестал работать. Возможно были изменения в api гугла. Если кому-то давал это задние то найдите аналог grive и сделайте резервное копирование в облоко (не обязательно google диск). 
:::
# Настройка резервного копирования на google диск.
В этой заметки: установка утилиты gdrive для подключения гугл диска, написание bash скрипта для резервного копирования каталогов на гугл диск, а также добавления скрипта в crontab. 
## Установка grive. 
Перейдем по [ссылке](https://github.com/prasmussen/gdrive/releases) и скачаем архив с необходимой нам версией. 

![](https://i.imgur.com/4XVZrTr.png)

Разархивируем архив. 
```
tar xvzf gdrive_verison
```

Перенесем grive в директорию bin. Чтобы утилита была видна в переменной среды. 

![](https://i.imgur.com/smw6en8.png)

Используем команду grive list 

![](https://i.imgur.com/6TsGYWP.png)

По полученной ссылке нужно перейти в бразуере и подтвердить доступ приложению. Скопировать код авторизации и вставить его в поле Enter verification code.

Теперь команда grive list будет показывать список файлов на диске с их ID. 

![](https://i.imgur.com/if1PwM0.png)

## Пишем скрипт резервного копирования. 
Открываем редактор nano. 
```
nano /usr/local/bin/backup_script.sh
```
Скрипт будет принимать два параментра **$1** - путь резервируемой директории или файла и **$2** - название бекапа

Для начала отформатируем вывод команды echo обернув эту команду в функцию print. 

```bash
#!/bin/bash
# Вывод сообщения со стилями
function print {
    echo
    echo -e "\e[38;5;82m    $1"
    echo -e "\e[0m"
}
```
Далее создаем переменную с именем архива. Имя архива будет состоять из названия копируемой директории, самого имени, а также даты проведения бекапа. Добавляем вывод имени бекапа с помощью **ehco**. Создаем переменную содержащию путь до директории. Создаем переменную содержащию ID директории в которую будет делать бекап. ID директории можно узнать в выводе команды **grive list**. 

```bash
archive_name=$1$2-$(date +%Y-%m-%d.%H%M%S)
echo $archive_name
src_path=$1
dir_id= # ID директории на гуглдиске
```
Архивируем указанную директорию с помощью архиватора 7z в каталог tmp чтобы не засорять систему. C помощью -xr! игнорируем нежелательные для нас файлы по маске. И выводим информацию о размере архива.
```bash
print "Compress..."
7z a -p'password' /tmp/${archive_name}.7z ${src_path} -xr!"*.log" -xr!"node_modules"
ls -lh /tmp/${archive_name}.7z
```
Загружаем архив на гугл диск.
```bash
print "Upload..."
gdrive upload --delete --parent ${dir_id} /tmp${archive_name}.7z
```
Добавляем условие если ошибки нету то сообщение info пишим в лог. 
```bash
if [ $? -eq 0 ]; then
print "OK..."
echo "INFO: $(date +%Y-%m-%d.%H%M%S) GDRIVE UPLOAD BACKUP - DIR_BACKUP:${1}" >> /var/log/backups.log
```
Если есть ошибка то 
```bash
else
print FAIL
echo "ERROR: $(date +%Y-%m-%d.%H%M%S) GDRIVE NO UPLOAD BACKUP - DIR_BACKUP:${1}" >> /var/log/backups.log
fi
```
Также мы можем настроить **postfix в режиме сателит** и добавить в скрипт возможность сообщать нам на почту об успешности бекапа. 

Полный код скрипта. 
```bash
#!/bin/bash
function print {
    echo
    echo -e "\e[38;5;82m    $1"
    echo -e "\e[0m"
}
archive_name=$1$2-$(date +%Y-%m-%d.%H%M%S)
echo $archive_name
src_path=$1
dir_id= # ID директории на гуглдиске
print "Compress..."
7z a -p'password' /tmp/${archive_name}.7z ${src_path} -xr!"*.log" -xr!"node_modules"
ls -lh /tmp/${archive_name}.7z
print "Upload..."
gdrive upload --delete --parent ${dir_id} /tmp${archive_name}.7z
if [ $? -eq 0 ]; then
print "OK..."
echo "INFO: $(date +%Y-%m-%d.%H%M%S) GDRIVE UPLOAD BACKUP - DIR_BACKUP:${1}" >> /var/log/backups.log
else
print FAIL
echo "ERROR: $(date +%Y-%m-%d.%H%M%S) GDRIVE NO UPLOAD BACKUP - DIR_BACKUP:${1}" >> /var/log/backups.log
fi
```
Не забудьте сделать скрипт исполняемым. 
```
chmod 0744 /usr/local/bin/backup_script.sh
```
## Добавляем скрипт в Crontab. 
Открываем crontab.
```
nano /etc/crontab
```
И добавляем следующую строку.
```
30 4 * * sun root /usr/local/bin/backup_script.sh /etc/wireguard/ wg_backup > /var/log/last_backups_output.log
```
В данном случае мы указываем чтобы скрипт делал бекап директории /etc/wireguard название бекапа wg_backup в 4:30 каждое воскресенье. Так как конфигурация vpn обновляеться редко то мне это подходит. 

Результат работы скрипта:

![](https://i.imgur.com/hmv5XFt.png)


