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

Разархивируем архив.
```
tar xvzf gdrive_verison
```
Перенесем grive в директорию bin. Чтобы утилита была видна в переменной среды.

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

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

## Пишем скрипт резервного копирования.
Открываем редактор 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 обновляеться редко то мне это подходит.
Результат работы скрипта:
