Фев 15 2009

Скрипт backup для SysCP

Последнее время, я что то усиленно ударился в написание скриптов. Но ничего это дело очень даже полезное. Так вот. Есть такая панель управления хостингом SysCP, одному из моих товарищей понадобился бекап клиентских данных, так что бы не надо было каждый раз заводить нового пользователя, менять скрипт бекапа, и вообще задумываться о нем.

В ходе изучения этой системы управления хостингом выяснилось:
1. Папки для хостов клиентов создаются в персональной папке клиента, которая определяется при регистрации нового клиента в системе, и корневая папка совпадает с именем пользователя.
2. Все базы MySQL создаются опять таки исходя из имени пользователя и каждая следующая база нумеруется, то есть банально, если login клиента hilik, то первая база mysql будет hilik1, вторая hilik2 и так далее.

Исходя из этого удалось написать такой скрипт и разместить ее к примеру в /root/bin/:

#!/bin/sh
#Каталог, в котором находятся клиентские папки
BASE='/var/clients/www/'
#В этот каталог размещаются бекапы
TO='/home/backup/'
#Дата запуска
DATE=`/bin/date  +%d%m%y`
#За эту дату бекап можно удалять
OLDDATE=`/bin/date  --date '7 day ago' +%d%m%y`
#Исключим из бекапа эти каталоги
EXCLUDE='wiki|webalizer|apache2-default'
#Базы MySQL находятся в этом каталоге
DBDIR='/var/lib/mysql'
#На этот емейл будут отправляться логины и пароли новых пользователей
MAILTO='sh@hilik.org.ua'
#Ограничим наш скрипт по ресурсам
NICE='/usr/bin/nice -n +20'
MYSQLDUMP='/usr/bin/mysqldump'
#Login доступа к mysql
MYSQLOGIN='root'
#Пароль доступа к MySQL
MYSQLPASS='hilik'
#MAIN PROCESS
#Получение списка клиентских каталогов
DIR=`/bin/ls -1 $BASE | /bin/egrep -v -E "($EXCLUDE)"`
#Запускаем цикл по клиентам
for i in $DIR
do
        #Если нет клиентского каталога для бекапа
        #создаем каталог, логин и пароль и отправляем на почту
        if [ ! -e $TO/$i ]
        then
                /bin/mkdir $TO/$i
                pass=`< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c8`
                echo "Order deny,allow">/$TO/$i/.htaccess
                echo "AuthType Basic">>/$TO/$i/.htaccess
                echo "AuthName Administrator">>/$TO/$i/.htaccess
                echo "AuthUserFile $TO/$i/.htpasswd">>/$TO/$i/.htaccess
                /usr/bin/htpasswd -b -c $TO/$i/.htpasswd $i $pass
                echo "Add new user $i with password $pass"| /usr/bin/mail -s "New user" $MAILTO
        fi
        echo $i
        #Создаем архив клиентского каталога
        $NICE /bin/tar --exclude *.log* -jcf $TO/$i/$i-$DATE.tar.bz2 $BASE/$i
        #Получаем все базы клиента, дампим и архивируем их
        BASA="$DBDIR/$i*"
        DB=`/bin/ls -d -1 $BASA`
        for k in $DB
        do
                db=`/usr/bin/basename $k`
                echo $db
                $NICE $MYSQLDUMP -u$MYSQLOGIN -p$MYSQLPASS $db > $TO/$i/$db-$DATE.sql
                $NICE /bin/bzip2 -z $TO/$i/$db-$DATE.sql
 
        done
        #После бекапа одного клиента - дадим 10 секундную паузу
        /bin/sleep 10
done

Назовем наш скрипт к примеру backup.sh и сделаем исполняемым:

chmod +x /root/bin/backup.sh

После этого, достаточно настроить apache, на директорию, где хранятся бекапы, отдать урл и логин с паролем клиенту. Теперь клиент сможет в любой момент получить свой бекап и делать с ним что ему нужно. Следует только помнить, что хранение бекапов на том же сервере, что и исходная информация не гарантирует сохранность данных. Поэтому, следует и самому время от времени переписывать архивы сайтов.

Что бы бекап работал автоматически, установим его на крон, на 3 ночи:

crontab -e

В открывшемся редакторе пропишем такую строку:

0      3       *       *       *       /root/bin/backup.sh

Проверить функционирование бекапа можно будет утром, а теперь нужно остановиться на вопросе восстановления данных.
Восстановление файлов в директориях сайтов осуществляется так:
1. Необходимо взять один из файлов бекапов файлов, исходя из того, что для клиента hilik, файл будет иметь такой вид hilik-150209.tar.bz2, где цифры это день, месяц и год бекапа.
2. Распаковываем файлы командой tar xvfj hilik-150209.tar.bz2
3. Находим среди распакованных файлов нужные и заливаем их на сервер

Восстановление базы mysql осуществляется так:
1. Берем файл, к примеру hilik1-150209.sql.bz2, распаковываем его командой bunzip2 hilik1-150209.sql.bz2.
2. Из получившегося файла hilik1.sql можно восстановить либо всю базу, либо открыв в редакторе извлечь дамп одной таблицы и влить одну таблицу. Для всей базы hilik1 восстановление пройдет так:

mysql -uroot -p <hilik1-150209.sql

Идеально было бы конечно, что бы к бекапам прибегать не приходилось, но иметь их хороший админ, просто обязан.

Добавить в закладки:

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

Украинская Баннерная Сеть