Резервное копирование сайта на MODX в Google Диск


О необходимости резервного копирования сказано много. Мы в этой статье рассмотрим удобный и простой способ для серверов, настроенных по этой замечательной инструкции.

Итак, вводные данные:
  • Каждый сайт работает от своего пользователя;
  • Все сайты находятся в /var/www/ ;
  • Системное имя пользователя, имя пользователя БД и название БД совпадают.
Что нам нужно в результате:
  • Создание zip архива всего сайта и sql дампа БД в ~/backup
  • Подстановка даты в имя файлов
  • [Опционально] Закачивание всех архивов в Google Drive и удаление с сервера

Первый вариант решения — каждому пользователю свой скрипт. Минус варианта в том, что при необходимости изменить что-то ключевое в алгоритме придется редактировать большое количество файлов.
Второй вариант решения — один универсальный скрипт с алгоритмом и каждому пользователю свой скрипт, в котором указываются только пароль к БД и UID каталога на Google Drive.
Пойдем по второму пути, ибо удобнее.

Закачивание файлов в Google Drive.

Для этого требуется:
  • Скачать утилиту работы с GDrive, сохранить ее в доступном для всех пользователей месте и добавить атрибут исполнения (+x).
  • Под каждым пользователем запустить shell с помощью команды
    $ sudo -u user /bin/bash
  • Запустить скачанную утилиту
    $ /home/shareduser/downloads/drive-linux-x64 list
  • и получить ссылку
  • После перехода по ней разрешите приложению доступ к своему аккаунту Google
  • Скопируйте полученный код обратно в консоль
  • После этих действий утилита сможет корректно запускаться без лишних запросов.
Универсальный скрипт резервного копирования

Скрипт простой, по комментариям в коде все понятно.
#!/bin/bash
# Пароль пользователя БД
MPWD=$1
# UID каталога в Google Drive
GCAT=$2
# Текущая дата
DATE=$(date +%Y%m%d)
# Текущий пользователь, под которым запущен скрипт
USER=$(getent passwd $UID | sed -e 's/\:.*//')
# Каталог для резервных копий в каталоге пользователя
BDIR="backup"
# Путь к утилите GDRIVe 
DRIVEUTIL="/home/admin/scripts/drive-linux-x64"

# Переходим в домашний каталог
cd ~/
# Архивируем каталог сайта, исключив кэш и директорию с транспортными пакетами
zip -q -r ${BDIR}/${USER}.${DATE}.zip www -x "www/core/cache/" "www/core/packages"
# Переходим в каталог для архивов
cd ~/${BDIR}/
#Создаем дамп БД
mysqldump -u${USER} -p${MPWD} ${USER} > ${USER}.${DATE}.sql
# Если переменная GCAT не пуста, запускаем закачку в облако и последующее удалений созданных файлов
if [ "$GCAT" != "" ]
then
${DRIVEUTIL} upload -f ~/${BDIR}/${USER}.${DATE}.sql --parent ${GCAT}
${DRIVEUTIL} upload -f ~/${BDIR}/${USER}.${DATE}.zip --parent ${GCAT}
rm ~/${BDIR}/${USER}.${DATE}.sql
rm ~/${BDIR}/${USER}.${DATE}.zip
fi
Скрипт сохраняем в /var/www/backup.sh. Он получился удобным — вызывать можно из-под любого пользователя, требуется лишь передать пароль от пользователя БД и ID каталога в GDrive, что мы и сделаем.

Скрипт для пользователя
Сохраняем его в /var/user/backup.sh, добавляем атрибут +x.
#!/bin/bash
cd ~/backup
../../backup.sh DBPASSWORD GDRIVEDIRECTORYUID


Как получить GDRIVEDIRECTORYUID
Открываем любой каталог в Google Drive и копируем из адреса часть, обведенную красной рамкой на изображении:


Итог
У нас теперь есть очень простой способ создания резервных копий и их закачивания в GDrive. Для любого пользователя достаточно создать маленький скрипт с указанием пароля и UID каталога, все остальное будет работать. При этом, если не указывать второй параметр (UID каталога), дополнительных действий в отношении GDrive не требуется, а файлы удаляться не будут.

Остается лишь добавить пользовательские скрипты в cron.

Обновлено 05.07.2016

Скрипт создания резервной копии для любого пользователя. Запускать необходимо либо от самого пользователя, либо от root'а. Передавать 3 параметра:
  1. Имя пользователя
  2. Пароль пользователя от БД
  3. ID каталога в GDrive
Сохранять в любом удобном месте. Например, /var/www/backup.sh

#!/bin/bash
DATE=$(date +%Y%m%d)
USER=$1
MPWD=$2
GCAT=$3
BDIR="backup"
DRIVEUTIL="/home/admin/scripts/drive-linux-x64"

cd /var/www/${USER}/
zip -q -r ${USER}.${DATE}.zip www -x "www/core/cache/" "www/core/packages"
mv /var/www/${USER}/${USER}.${DATE}.zip /var/www/${USER}/${BDIR}/
cd /var/www/${USER}/${BDIR}/
mysqldump -u${USER} -p${MPWD} ${USER} > ${USER}.${DATE}.sql
chown ${USER}:${USER} ${USER}.${DATE}.*
if [ "$GCAT" != "" ]
then
${DRIVEUTIL} upload -f ~/${BDIR}/${USER}.${DATE}.sql --parent ${GCAT}
${DRIVEUTIL} upload -f ~/${BDIR}/${USER}.${DATE}.zip --parent ${GCAT}
rm ~/${BDIR}/${USER}.${DATE}.sql
rm ~/${BDIR}/${USER}.${DATE}.zip
fi

Пример скрипта быстрого доступа из каталога пользователя:

#!/bin/bash
../../backup.sh USERNAME DBPASSWORD GDRIVEDIRECTORYUID
24 june 2016, 15:00    Воеводский Михаил   G+  
29    1210 +21

Comments (21)

  1. Игорь 25 june 2016, 23:37 # 0
    А как создать резервные копии всех сайтов на сервере и закачать в GDrive, как здесь?
    1. Да, кстати. А нельзя ли слить всю папку с бекапами 50 сайтов сразу в гугл драйв?
      1. Воеводский Михаил 05 july 2016, 09:22 # 0
        Посмотрел пример — скрипт Василия остается практически в незменном виде. Нужно лишь в самом его конце добавить строку выгрузки каталога со всеми архивами в GDrive. Не вижу смысла копировать оригинал скрипта, добавляя только одну строку.
        1. Игорь 05 july 2016, 13:31 # 0
          Напишите, пожалуйста, для «чайников» что и куда необходимо добавить в скрипт Василия
          1. Воеводский Михаил 05 july 2016, 13:38 # 0
            В начале задать значение переменной GCAT, в самом его конце добавить строку:
            drive-linux-x64 upload upload -f $BACKUP --parent ${GCAT}
      2. Сергей Росоловский 25 june 2016, 23:39 # 0
        Неплохо. У меня настроен Dropbox, там как то проще но места уже не хватает, а вот 15 гиг GD меня вполне устраивает. Но если у меня 50 сайтов на сервере, которые работают от 50 разных пользователей мне что 50 раз авторизироваться надо?
        1. Воеводский Михаил 25 june 2016, 23:43 # +1
          Приведенный здесь пример скрипта заточен на копирование сайта текущего пользователя. В понедельник напомните, выложу более универсальный вариант — с приемом имени пользователя, сайт которого необходимо скопировать, в виде параметра.
          1. Игорь 25 june 2016, 23:49 # 0
            Спасибо!
        2. Сергей Росоловский 25 june 2016, 23:49 # 0
          Ага, то есть если я делаю бекапы всех сайтов и кладу их в папку которая принадлежит мне (пользователю с правами админа), то я спокойно могу выкачать в гугл драйв эту папку со всеми бекапами как от одного пользователя?
          1. Игорь 25 june 2016, 23:52 # 0
            В текущем варианте не получится
            1. Ну, а если бы получилось. Был бы хит сезона.
              1. Воеводский Михаил 26 june 2016, 00:00 # 0
                На следующей неделе посмотрю статью Василия о массовом резервном копировании и постараюсь подружить с выгрузкой в GDrive.
            2. Воеводский Михаил 25 june 2016, 23:55 # -1
              Вам потребуется изменить в скрипте пути искомых файлов для создания архивов + изменить создание дампов БД. Какие файлы закачивать, утилите не важно. Главное — скормить имена существующих файлов.
              1. Ну так тогда все гуд. Архивы сделаны и лежат в определенной папке, надо просто раз в неделю выкачивать в гугл драйв эту папку по крону. Желательно после выкачки удалить папку с сервера, а то места в обрез.
                1. Воеводский Михаил 26 june 2016, 00:13 # 0
                  Из скрипта в данном случае будет часть внутри if.
              2. Воеводский Михаил 05 july 2016, 09:24 # 0
                Оказывается, утилита умеет не только файлы по отдельности заливать, но и каталоги — достаточно дать команду
                $ drive-linux-x64 upload /dir/path/
                1. Это хорошо. Буду с Dropbox переходить на Google Drive, там места побольше, да и сервис не будет висеть в памяти сервера.
                  Кстати, а удалять с Google Drive утилита может?
                  1. Воеводский Михаил 05 july 2016, 09:35 # 0
                    Может, команда соответствующая — delete. Но как получить список файлов, а потом его обработать и удалить лишнее — не разбирался.
                    1. Я думаю просто удалять папку, а потом закачать новую, с новыми бекапами.
                      1. Воеводский Михаил 05 july 2016, 10:10 # 0
                        Тоже вариант.
              3. Воеводский Михаил 05 july 2016, 09:37 # 0
                Обновил статью.
                Добавил скрипт, позволяющий запускать создание резервных копий от рута с указанием пользователя, данные которого необходимо заархивировать.
                You need to login to create comments.