Photo by Kai Wenzel
Резервное копирование на Google Drive

Резервное копирование на google drive

2.07.23
22.08.23

На любом сервере должно быть организовано резервное копирование файлов и баз данных. Вопрос с хранением резервных копий решается по-разному. Можно сохранять резервные копии где-то локально, но если у вас виртуальный сервер, то лучше хранить их в удалённом хранилище. Вполне реально для этих целей использовать Google Drive (Гугл диск).

На гитхабе есть проект, на момент написания статьи — живой и поддерживаемый.

Далее, поведём речь о сервере на базе linux. Скачайте архив и распакуйте его, как рекомендует автор в

/usr/local/bin

Затем надо пройти не слишком простую процедуру получения «Client ID» и «Client Secret«. Вот инструкция от автора проекта. Делайте всё пошагово и всё получится.

Далее надо добавить ваш аккаунт:

gdrive account add

Утилита запросит у вас Client ID и Client Secret. После чего выдаст ссылку, её надо скопировать в строку браузера, в котором вы залогинены на google drive. Ответь утвердительно и поставьте галочки в обоих чек-боксах.

После чего браузер выдаст вам ссылку вида 127.0.0.1:8085/…… и в окне будет написано «Не найдено», просто скопируйте ссылку и перейдите на сервер, организовав новое SSH-подключение, старое окно с работающей gdrive не закрывайте! Вставьте её вместе с curl:

curl 127.0.0.1:8085/.....

После чего в «старом» окне gdrive завершит работу создав аккаунт. Теперь всё готово к работе.

Если вы подумали что на этом всё, то спешу огорчить, ещё нет. Раздел справки в gdrive вполне достаточный, но есть нюансы. Формат использования утилиты gdrive:

gdrive <COMMAND>

Перечень команд:

about        Print information about gdrive
account      Commands for managing accounts
drives       Commands for managing drives
files        Commands for managing files
permissions  Commands for managing file permissions
version      Print version information
help         Print this message or the help of the given subcommand(s)

Основная команда это files:

gdrive files <COMMAND>

Commands:
  info      Print file info
  list      List files
  download  Download file
  upload    Upload file
  update    Update file. This will create a new version of the file. The older versions will typically be kept for 30 days
  delete    Delete file
  mkdir     Create directory
  rename    Rename file/directory
  move      Move file/directory
  copy      Copy file
  import    Import file as a google document/spreadsheet/presentation. Example of file types that can be imported: doc, docx, odt, pdf, html, xls, xlsx, csv, ods, ppt, pptx, odp
  export    Export google document to file
  help      Print this message or the help of the given subcommand(s)

Основные команды тут list, upload, delete. Именно их и будем использовать. Будем думать что у вас уже налажена система резервного копирования и далее будем делать удаленное копирование резервных копий.

Удаленное копирование на Google Drive

Просто скопировать архив на Гугл диск можно простой командой:

gdrive files upload your-archive.tar.gz 

Проблема проявится после загрузки следующего архива. Дело в том, что Гугл сохраняет сколько угодно много файлов под одним и тем же именем, пока не закончится место. Перезаписать более старый архив более свежим не получиться. Гугл создаст новый файл с таким же именем. Есть команда удаления файлов, но в качестве аргумента нужен file ID:

gdrive files delete file_id 

Чтобы узнать file_id надо воспользоваться командой list:

gdrive files list

Результатом будет список файлов вместе с их ID:

1TAFZLrh_-Edhrrk_TeortMQNQvjUl9a7 archive.tar.gz regular 5.8 MB 2023-06-14 13:43:45

Для того чтобы автоматизировать процесс надо создать директорию, например backups следующей командой:

gdrive files mkdir backups 

После создания утилита выведет id этой директории. Надо скопировать этот id и можно использовать вот такой bash-скрипт:

#!/bin/bash

back_dir="/var/backups/" # место где храните локальные бэкапы 
folder="1RcQRg7MtvCg66UyqlzuG7Yq7HS" # id удалённой директории

# Before delete files
files=`/usr/local/bin/gdrive files list --parent $folder --skip-header | awk '{print($1)}'`
arr=( $files )
for i in "${arr[@]}"
do
/usr/local/bin/gdrive files delete $i;
done

# Create array of files 
arr=( `ls ${back_dir}${1}*.bz2` )

for i in "${arr[@]}"; do
        # Upload archive
        /usr/local/bin/gdrive files upload $i --parent $folder
done

Думаю, из скрипта понятно что мы сначала очищаем удалённую директорию, а затем копируем туда файлы из локальной директории.
Минусы в таком подходе есть: например, если скрипт запускается по крону и работает в автоматическом режиме на сервере, то может возникнуть ситуация когда локальная копия не создалась по каким-то причинам, а удалённую данный скрипт очистит. В этом случае надо сделать проверку на наличие локальных копий.
Так же, скрипт можно расширить, если вы хотите хранить разные по времени копии, например, ежедневные, еженедельные и ежеквартальные. В этом случае надо создать разные удалённые директории и копировать в них.