Резервное копирование сайта на 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 июня 2016, 12:00
modx.pro
30
5 402
+21

Комментарии: 24

Игорь
25 июня 2016, 23:37
0
А как создать резервные копии всех сайтов на сервере и закачать в GDrive, как здесь?
    Сергей Росоловский
    25 июня 2016, 23:41
    0
    Да, кстати. А нельзя ли слить всю папку с бекапами 50 сайтов сразу в гугл драйв?
      Воеводский Михаил
      05 июля 2016, 09:22
      0
      Посмотрел пример — скрипт Василия остается практически в незменном виде. Нужно лишь в самом его конце добавить строку выгрузки каталога со всеми архивами в GDrive. Не вижу смысла копировать оригинал скрипта, добавляя только одну строку.
        Игорь
        05 июля 2016, 13:31
        0
        Напишите, пожалуйста, для «чайников» что и куда необходимо добавить в скрипт Василия
          Воеводский Михаил
          05 июля 2016, 13:38
          0
          В начале задать значение переменной GCAT, в самом его конце добавить строку:
          drive-linux-x64 upload upload -f $BACKUP --parent ${GCAT}
      Сергей Росоловский
      25 июня 2016, 23:39
      0
      Неплохо. У меня настроен Dropbox, там как то проще но места уже не хватает, а вот 15 гиг GD меня вполне устраивает. Но если у меня 50 сайтов на сервере, которые работают от 50 разных пользователей мне что 50 раз авторизироваться надо?
        Воеводский Михаил
        25 июня 2016, 23:43
        +1
        Приведенный здесь пример скрипта заточен на копирование сайта текущего пользователя. В понедельник напомните, выложу более универсальный вариант — с приемом имени пользователя, сайт которого необходимо скопировать, в виде параметра.
      Сергей Росоловский
      25 июня 2016, 23:49
      0
      Ага, то есть если я делаю бекапы всех сайтов и кладу их в папку которая принадлежит мне (пользователю с правами админа), то я спокойно могу выкачать в гугл драйв эту папку со всеми бекапами как от одного пользователя?
        Игорь
        25 июня 2016, 23:52
        0
        В текущем варианте не получится
          Сергей Росоловский
          25 июня 2016, 23:56
          0
          Ну, а если бы получилось. Был бы хит сезона.
            Воеводский Михаил
            26 июня 2016, 00:00
            0
            На следующей неделе посмотрю статью Василия о массовом резервном копировании и постараюсь подружить с выгрузкой в GDrive.
          Воеводский Михаил
          25 июня 2016, 23:55
          -1
          Вам потребуется изменить в скрипте пути искомых файлов для создания архивов + изменить создание дампов БД. Какие файлы закачивать, утилите не важно. Главное — скормить имена существующих файлов.
            Сергей Росоловский
            26 июня 2016, 00:04
            0
            Ну так тогда все гуд. Архивы сделаны и лежат в определенной папке, надо просто раз в неделю выкачивать в гугл драйв эту папку по крону. Желательно после выкачки удалить папку с сервера, а то места в обрез.
          Воеводский Михаил
          05 июля 2016, 09:24
          0
          Оказывается, утилита умеет не только файлы по отдельности заливать, но и каталоги — достаточно дать команду
          $ drive-linux-x64 upload /dir/path/
            Сергей Росоловский
            05 июля 2016, 09:33
            0
            Это хорошо. Буду с Dropbox переходить на Google Drive, там места побольше, да и сервис не будет висеть в памяти сервера.
            Кстати, а удалять с Google Drive утилита может?
              Воеводский Михаил
              05 июля 2016, 09:35
              0
              Может, команда соответствующая — delete. Но как получить список файлов, а потом его обработать и удалить лишнее — не разбирался.
        Воеводский Михаил
        05 июля 2016, 09:37
        0
        Обновил статью.
        Добавил скрипт, позволяющий запускать создание резервных копий от рута с указанием пользователя, данные которого необходимо заархивировать.
          Павел
          08 июня 2017, 20:38
          0
          Здравствуйте. Полгода пользовался копированием, настроенным по вашей инструкции — всё было в порядке. После переноса на другой сервер при запуске скрипта в ручном режиме — всё работает, при запуске через крон — архивы делаются, а на google-диск не передаются. Не могу понять причину. Можете что-то посоветовать?
            Воеводский Михаил
            09 июня 2017, 11:02
            0
            Приветствую.
            Необходимо запустить утилиту копирования в ГДиск от имени того пользователя, от которого она работает через cron, для ввода токена доступа к ГДиску.
              Павел
              09 июня 2017, 17:28
              0
              Да, я тоже полагаю, что в этом проблема, но когда я запускаю утилиту копирования под root'ом (от него она работает через cron), то она мне не предлагает ввести токен, а читает содержимое папки ГДиска. Возможно, я раньше запускал утилиту под другим пользователем (не root) и под ним вводил токен, но как переучить утилиту на другого пользователя или убедиться, что под ним она работает — я не знаю (в тоже время, если в ручном режиме запустить командник от имени root-пользователя, то архив на ГДиск скидывается).
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            24