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

Итак, вводные данные:
  • Каждый сайт работает от своего пользователя;
  • Все сайты находятся в /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.