Резервное копирование сайта на MODX в Google Диск
О необходимости резервного копирования сказано много. Мы в этой статье рассмотрим удобный и простой способ для серверов, настроенных по этой замечательной инструкции.
Итак, вводные данные:
Первый вариант решения — каждому пользователю свой скрипт. Минус варианта в том, что при необходимости изменить что-то ключевое в алгоритме придется редактировать большое количество файлов.
Второй вариант решения — один универсальный скрипт с алгоритмом и каждому пользователю свой скрипт, в котором указываются только пароль к БД и UID каталога на Google Drive.
Пойдем по второму пути, ибо удобнее.
Закачивание файлов в Google Drive.
Для этого требуется:
Скрипт простой, по комментариям в коде все понятно.
Скрипт для пользователя
Сохраняем его в /var/user/backup.sh, добавляем атрибут +x.
Как получить GDRIVEDIRECTORYUID
Открываем любой каталог в Google Drive и копируем из адреса часть, обведенную красной рамкой на изображении:
Итог
У нас теперь есть очень простой способ создания резервных копий и их закачивания в GDrive. Для любого пользователя достаточно создать маленький скрипт с указанием пароля и UID каталога, все остальное будет работать. При этом, если не указывать второй параметр (UID каталога), дополнительных действий в отношении GDrive не требуется, а файлы удаляться не будут.
Остается лишь добавить пользовательские скрипты в cron.
Скрипт создания резервной копии для любого пользователя. Запускать необходимо либо от самого пользователя, либо от root'а. Передавать 3 параметра:
Пример скрипта быстрого доступа из каталога пользователя:
Итак, вводные данные:
- Каждый сайт работает от своего пользователя;
- Все сайты находятся в /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 параметра:
- Имя пользователя
- Пароль пользователя от БД
- ID каталога в GDrive
#!/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
А как создать резервные копии всех сайтов на сервере и закачать в GDrive, как здесь?
Да, кстати. А нельзя ли слить всю папку с бекапами 50 сайтов сразу в гугл драйв?
Посмотрел пример — скрипт Василия остается практически в незменном виде. Нужно лишь в самом его конце добавить строку выгрузки каталога со всеми архивами в GDrive. Не вижу смысла копировать оригинал скрипта, добавляя только одну строку.
Напишите, пожалуйста, для «чайников» что и куда необходимо добавить в скрипт Василия
В начале задать значение переменной GCAT, в самом его конце добавить строку:
drive-linux-x64 upload upload -f $BACKUP --parent ${GCAT}
Неплохо. У меня настроен Dropbox, там как то проще но места уже не хватает, а вот 15 гиг GD меня вполне устраивает. Но если у меня 50 сайтов на сервере, которые работают от 50 разных пользователей мне что 50 раз авторизироваться надо?
Приведенный здесь пример скрипта заточен на копирование сайта текущего пользователя. В понедельник напомните, выложу более универсальный вариант — с приемом имени пользователя, сайт которого необходимо скопировать, в виде параметра.
Спасибо!
Ага, то есть если я делаю бекапы всех сайтов и кладу их в папку которая принадлежит мне (пользователю с правами админа), то я спокойно могу выкачать в гугл драйв эту папку со всеми бекапами как от одного пользователя?
В текущем варианте не получится
Ну, а если бы получилось. Был бы хит сезона.
На следующей неделе посмотрю статью Василия о массовом резервном копировании и постараюсь подружить с выгрузкой в GDrive.
Вам потребуется изменить в скрипте пути искомых файлов для создания архивов + изменить создание дампов БД. Какие файлы закачивать, утилите не важно. Главное — скормить имена существующих файлов.
Ну так тогда все гуд. Архивы сделаны и лежат в определенной папке, надо просто раз в неделю выкачивать в гугл драйв эту папку по крону. Желательно после выкачки удалить папку с сервера, а то места в обрез.
Из скрипта в данном случае будет часть внутри if.
Оказывается, утилита умеет не только файлы по отдельности заливать, но и каталоги — достаточно дать команду
$ drive-linux-x64 upload /dir/path/
Это хорошо. Буду с Dropbox переходить на Google Drive, там места побольше, да и сервис не будет висеть в памяти сервера.
Кстати, а удалять с Google Drive утилита может?
Кстати, а удалять с Google Drive утилита может?
Может, команда соответствующая — delete. Но как получить список файлов, а потом его обработать и удалить лишнее — не разбирался.
Я думаю просто удалять папку, а потом закачать новую, с новыми бекапами.
Тоже вариант.
Обновил статью.
Добавил скрипт, позволяющий запускать создание резервных копий от рута с указанием пользователя, данные которого необходимо заархивировать.
Добавил скрипт, позволяющий запускать создание резервных копий от рута с указанием пользователя, данные которого необходимо заархивировать.
Здравствуйте. Полгода пользовался копированием, настроенным по вашей инструкции — всё было в порядке. После переноса на другой сервер при запуске скрипта в ручном режиме — всё работает, при запуске через крон — архивы делаются, а на google-диск не передаются. Не могу понять причину. Можете что-то посоветовать?
Приветствую.
Необходимо запустить утилиту копирования в ГДиск от имени того пользователя, от которого она работает через cron, для ввода токена доступа к ГДиску.
Необходимо запустить утилиту копирования в ГДиск от имени того пользователя, от которого она работает через cron, для ввода токена доступа к ГДиску.
Да, я тоже полагаю, что в этом проблема, но когда я запускаю утилиту копирования под root'ом (от него она работает через cron), то она мне не предлагает ввести токен, а читает содержимое папки ГДиска. Возможно, я раньше запускал утилиту под другим пользователем (не root) и под ним вводил токен, но как переучить утилиту на другого пользователя или убедиться, что под ним она работает — я не знаю (в тоже время, если в ручном режиме запустить командник от имени root-пользователя, то архив на ГДиск скидывается).
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.