Есть разные способы резервного копирования на Google диск, самый простой на мой взгляд это использовать Duplicati, единственный минусом которого является пожалуй то, что архив созданный Duplicati можно распаковать только Duplicati, так как он создает архивы по какому то своему алгоритму и простая распаковка ничего не даст правильного расположения и названия файлов. В данной статье пойдет речь о том, как делать архивирование на Google диск c помощью gdrive3
Программу можно скачать отсюда, настройки со стороны Google описаны тут или тут в картинках, в данной статье не рассматривается эти настройки, предпологается, что программа скачана и помещена по одному из путей PATH, например /usr/local/bin
Открываем терминал и регистрируем программу на гугле
gdrive account add
вводим Client ID и Client Secret, программа выдаст Вам ссылку, копируем её и вставляем в браузер, после авторизации браузер выдаст Вам адрес начинающийся с 127.0.0.1:8085…, копируем полностью адрес из строки адреса браузера, открываем новую вкладку терминала (старую не закрываем) и вводим curl и скопированный адрес, должно начинаться так:
curl 127.0.0.1:8085...
в первой вкладке терминала должна программа завершить свою работу, это значит аккаунт зарегистрирован
Есть много способов сделать архивирование файлов и базы данных, я приведу пример архивирования баз данных mysql и файлов, а затем мы архивы будем копировать на гугл диск
Архивирование баз данных.
заходим в терминал по ssh и создаем файл
nano /root/script/dbbackup
со следующим содержимым:
#!/bin/bash USER="dbuser" PASSWORD="dbpassword" OUTPUT="/root/gdbackup/db_backup" #директория для хранения резервных копий databases=`docker exec mariadb mariadb --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database` for db in $databases; do if [[ "$db" != "information_schema" ]] && [[ "$db" != _* ]] ; then echo "Dumping database: $db" mkdir -p $OUTPUT/$db/$1 docker exec mariadb mariadb-dump -u root -plordoftherings $db > $OUTPUT/$db/$1/`date +%Y%m%d`.$db.sql if ! [ -d $OUTPUT/$db/$1/ ]; then echo 'No directory' mkdir $OUTPUT/$db/$1 fi if ! [ -f $OUTPUT/$db/$1/`date +%Y%m%d`.$db.sql.gz ]; then echo 'No file' gzip $OUTPUT/$db/$1/`date +%Y%m%d`.$db.sql else rm $OUTPUT/$db/$1/`date +%Y%m%d`.$db.sql fi find $OUTPUT/$db/day -type f -mtime +8 -delete find $OUTPUT/$db/week -type f -mtime +34 -delete fi done
USER, PASSWORD и OUTPUT вставьте свои, папки по пути OUTPUT должны быть созданы
у меня mariadb стоит в Docker контейнере, по этому 5-я строка запроса к базе данных имеет такой вид, если у Вас не в Docker контейнере то необходимо во всех строках (5-я и 10-я) удалить «docker exec mariadb «,
скрипт принимает параметр и работает следующим образом:
создает папку с именем базы данных, в папке создает папку с переданным параметром и туда создает архив соответствующей базы данных, после чего удаляет файлы в папке day старше 8-и дней и в папке week старше 34 дней, предпологается, что в эти папки будут копироваться файлы соответственно ежедневно и еженедельно, для автоматического копирования добавляем в crontab:
0 0 * * * /root/script/dbbackup /day 0 0 * * 0 /root/script/dbbackup /week 0 0 1 * * /root/script/dbbackup /month
соответственно архивы будут создаваться каждый день/неделю и месяц и помещаться в соответствующие папки
Архивирование папок
В архивировании папок нет ничего сложного, можно создавать каждый раз полный архив папки и потом копировать его на Google диск, но в данном примере будет создаваться первый раз весь архив папки и при последующем запуске скрипта будет создаваться архив только с новыми и измененными файлами.
создаем файл:
nano /root/script/backup
со следующим содержимым
#!/bin/sh BACKUP=/root/gdbackup/backup # путь к дирректории с бэкапами FOLDER=/root/folder # папка для архивации DAY=$(date +%d) #Получаем номер дня MON=$(date +%m) #Получаем номер месяца DATE=$(date +%Y%m%d) mkdir -p $BACKUP if ! [ -f $BACKUP/backup.snar ]; then echo 'No file' NU="_NEW" else NU="_ADD" fi # Создаем архив tar --create \ --gzip \ --file=$BACKUP/$DATE$NU.tgz \ --ignore-failed-read \ --listed-incremental=$BACKUP/backup.snar \ $FOLDER
и добавляем в crontab запуск скрипта с необходимой периодичностью, создаваться будут такие файлы:
файл с окончанием NEW — это полный начальный архив, файлы с окончанием ADD это архивы в которых новые или измененные файлы, backup.snap — это индексный файл в котором информация о добавленных файлах, если его удалить то создастся архив со всеми файлами.
Копирование файлов на Google диск
создаем скрипт для копирования файлов на Google диск
nano /root/script/gdbackup
со следующим содержимым:
#!/bin/bash BACKUP_DIR="/root/gdbackup" # папка для архива GD_DIR="gdbackup" # название папки для архивации на Google диске MTIME=-7 #копировать файлы не старше (-7 - семь дней) IFS='/' # разделитель пути файлов BAK_TMP="${BACKUP_DIR##*/}" find "$BACKUP_DIR" -type f -mtime $MTIME| while read file; do PATHF=$GD_DIR/${file#*/$BAK_TMP/} PATHFF=$file echo "" echo "Найден файл: $PATHF" COUNT1=0 COUNT2=0 for part in $PATHF; do COUNT1=$((COUNT1 + 1)) done for part in $PATHF; do COUNT2=$((COUNT2 + 1)) if [ $COUNT2 = $COUNT1 ]; then #проверяем есть ли файл на диске FILE_ID=$(gdrive files list --parent "$FOLDER_S" --skip-header | grep "$part" | awk '{print $1}') if [ -z "$FILE_ID" ]; then # файла нет, копируем файл на диск echo "нет файла на гугл диске, копируем файл $PATHFF" gdrive files upload --parent "$FOLDER_S" "$PATHFF" else echo "Файл $part существует, имеет ID: $FILE_ID" fi else #папка if [ "$COUNT2" -eq 1 ]; then # первая папка echo "проверяем есть ли папка $part" FOLDER_ID=$(gdrive files list --skip-header | grep "$part" | awk '{print $1}') if [ -z "$FOLDER_ID" ]; then echo "Папки нет, создаем папку $part" FOLDER_S=$(gdrive files mkdir $part | awk '{print $6}') echo "Папка $part создана, имеет ID: $FOLDER_S" else echo "корневая папка $part есть, имеет ID: $FOLDER_ID" FOLDER_S=$FOLDER_ID fi else # не первая папка if [ -z "$FOLDER_S" ]; then echo "НЕТ ИДЕНТИФИКАТОРА!!!!!!!" else FOLDER_ID=$(gdrive files list --parent "$FOLDER_S" --skip-header | grep "$part" | awk '{print $1}') fi if [ -z "$FOLDER_ID" ]; then echo "папки не существует, создаем вложенную папку $part в папке с ID $FOLDER_S" FOLDER_ID=$(gdrive files mkdir --parent "$FOLDER_S" $part | awk '{print $6}') echo "Папка $part создана в папке "$FOLDER_S", имеет ID: $FOLDER_ID" FOLDER_S=$FOLDER_ID else echo "папка $part есть, имеет ID: $FOLDER_ID" FOLDER_S=$FOLDER_ID fi fi fi done done
соответственно меняем на свои:
BACKUP_DIR=»/root/gdbackup» # папка для архива
GD_DIR=»gdbackup» # название папки для архивации на Google диске
MTIME=-7 #копировать файлы не старше (-7 — семь дней)
для первого запуска скрипта если у Вас уже сделана система архивирования и архивов уже поднакопилось можно сделать MTIME больше, а потом изменить обратно на количество дней кратно периодичности запуска, у меня запуск скрипта раз в неделю.
скрипт проверяет есть ли папка, если нет то создает и проверяет есть ли файл, если нету то копирует.
Старые файлы которые удалены скрипт с Google диска не удаляет.