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