- Автор темы
- Администратор
- Модер.
- Команда форума
- #1
backup.sh:
Как видим, все очень просто. В соответствующей секции (комментарии подскажут) нужно указать настройки подключения к ФТПшнику. Никаких особых заморочек с инкрементальным архивом и т.п. Т.е. для огромных проектов этот скрипт не подойдет (точнее, не будет столь удобен, как инкрементальные архивы). Не забудьте заранее создать на ФТПшнике папки: monday, wednesday, friday, daily; mysql/monday, mysql/wednesday, mysql/friday, mysql/daily. На всякий случай бекап храним в четырех версиях - дневной, за понедельник, среду, пятницу. Файл backup.sh должен быть разрешен для выполнения (chmod +x backup.sh)
А теперь о настройке источников резервирования. Наверняка на сервере под каждый сайт (или группу сайтов) заведен свой пользователь, а это значит, что путь к папкам с файлами сайтов будет отличаться от пользователя к пользователю. Именно это и есть причина указания папок в файле настроек. Ну, и базы... Наверняка ведь разные
backup.ini:
Секции (в квадратных скобках) можно называть, например, именем сайта (domen.vasya.com). Соответственно для первой пользовательской секции в настройках файлы бекапов будут иметь имена: vasyapupkin.tar.gz - файлы, vasyapupkin.sql.gz - база. Секция [main] является обязательной, поскольку хранит данные для коннекта к БД и путь для сохранения бекапов на локальном сервере. Файл backup.ini должен иметь chmod 600 и находиться в той же папке, что и backup.sh.
Команда для крона указана в шапке backup.sh.
Код:
#!/bin/sh
########################################
# простейший bash-скрипт для создания и хранения резервной копии сайта БД Mysql
# резервные копии сохраняются ежедневные (daily), а также Пн (monday), Ср (wednesday), Пт (friday)
# Copyleft (c) Sayid Munawar. [email protected]
# LICENSE: anyone can copy / modify / distribute. whatever lah
#
# пример задания в crontab ( выполнится Пн-Пт в 18:00)
# 0 18 * * 1-5 /home/backup/backup.sh
########################################
PATH=$PATH:/usr/bin:/bin:/usr/local/bin
inifile=`dirname $0`/backup.ini
# Настройки подключения к FTP
FTP_SERVER="ftp://ftp.host.net"
FTP_USER="ftplogin:ftppassword"
## Далее ничего не изменяем
DATENAME=`date %A | tr "[:upper:]" "[:lower:]"`
if [ $DATENAME != monday -a $DATENAME != friday -a $DATENAME != wednesday ] ; then
DATENAME="daily"
fi
##Проверяем, есть ли файл с настройками копирования в папке со скриптом
test ! -r $inifile && echo "ERROR! backup.ini not found nor readable" && exit 1
##Проверяем, применен ли chmod 600 к файлу настроек (запретить доступ на чтение и запись для всех, кроме владельца)
echo -n `stat -c '%a' $inifile` | grep -q '[0-7]00' >/dev/null 2>&1
test $? -gt 0 && echo "ERROR! $inifile can be read by others" && exit 2
## Парсим ini файл (backup.ini)
#
# $1 -> file.ini
# $2 -> section
_parse_ini () {
if [ -z "$1" ] || [ -z "$2" ]; then return 0; fi
eval `cat $1 |
sed -e 's/[[:space:]]*=[[:space:]]*/=/g'
-e 's/;.*$//'
-e 's/[[:space:]]*$//'
-e 's/^[[:space:]]*//'
-e "s/^(.*)=([^"']*)$/1="2"/" |
sed -n -e "/^[$2]/,/^s*[/{/^[^;].*=.*/p;}"`
}
_parse_ini $inifile main
## Проверяем подключение к MySQL
mysql -u $mysql_user -p${mysql_pass} -e '' > /dev/null 2>&1
test $? -gt 0 && echo "ERROR! Failed to connect to mysql" && exit 4
## Проверяем наличие/создаем директорию назначения на локальном сервере
test ! -d $target && mkdir -p $target
# Получаем pwd - текущую папку
cwd=`pwd`
# Производим операцию архивирования
for section in `cat $inifile | grep '^[' | grep -v main | sed 's/[//' | sed 's/]//'`; do
outdir=$target/$section/$DATENAME
echo Backing up ${section} to $outdir...
# парсим .ini
_parse_ini $inifile $section
# Проверяем, есть ли вообще папка-источник
test ! -d $path && echo "Warning: $path not found. Backup process of $section skipped" && echo && continue
mysql -u $mysql_user -p${mysql_pass} -e '' $mysql_db > /dev/null 2>&1
test $? -gt 0 && echo "Warning: Database $mysql_db not found. Backup process of $section skipped" && echo && continue
test ! -d $outdir && mkdir -p $outdir
cd $path
## Архивируем папку-источник таром с одновременным гзипованием в папку назначения на локальном сервере
tar -czpf $outdir/$section.tar.gz .
cd $cwd
## Дампим базу данных и гзипуем в папке назначения на локальном сервере
mysqldump -Q -u $mysql_user -p${mysql_pass} $mysql_db | gzip > $outdir/${mysql_db}.sql.gz
## Создаем символические ссылки на последние версии архивов
ln -fs $outdir/$section.tar.gz $target/$section/latest.tar.gz
ln -fs $outdir/${mysql_db}.sql.gz $target/$section/latest.sql.gz
## Коннектимся к ФТП и кладем архивы в соответствующие папки
curl -T $outdir/$section.tar.gz $FTP_SERVER/$DATENAME/$section.tar.gz --user $FTP_USER
curl -T $outdir/${mysql_db}.sql.gz $FTP_SERVER/mysql/$DATENAME/$section.sql.gz --user $FTP_USER
done
Как видим, все очень просто. В соответствующей секции (комментарии подскажут) нужно указать настройки подключения к ФТПшнику. Никаких особых заморочек с инкрементальным архивом и т.п. Т.е. для огромных проектов этот скрипт не подойдет (точнее, не будет столь удобен, как инкрементальные архивы). Не забудьте заранее создать на ФТПшнике папки: monday, wednesday, friday, daily; mysql/monday, mysql/wednesday, mysql/friday, mysql/daily. На всякий случай бекап храним в четырех версиях - дневной, за понедельник, среду, пятницу. Файл backup.sh должен быть разрешен для выполнения (chmod +x backup.sh)
А теперь о настройке источников резервирования. Наверняка на сервере под каждый сайт (или группу сайтов) заведен свой пользователь, а это значит, что путь к папкам с файлами сайтов будет отличаться от пользователя к пользователю. Именно это и есть причина указания папок в файле настроек. Ну, и базы... Наверняка ведь разные
backup.ini:
Код:
[main]
target = /home/backup/storage ; Путь для сохранения бекапов на локальном сервере
mysql_user = root ; root может подключиться к любой БД
mysql_pass = secret ; mysql root пароль
[vasyapupkin]
path = /home/vasyapupkin/vasyapupkin.com/public_html ; Путь к файлам сайта
mysql_db = vasyapupkin ; Имя базы данных
[petyarus]
path = /home/petyarus/petya.ru/public_html
mysql_db = test
Секции (в квадратных скобках) можно называть, например, именем сайта (domen.vasya.com). Соответственно для первой пользовательской секции в настройках файлы бекапов будут иметь имена: vasyapupkin.tar.gz - файлы, vasyapupkin.sql.gz - база. Секция [main] является обязательной, поскольку хранит данные для коннекта к БД и путь для сохранения бекапов на локальном сервере. Файл backup.ini должен иметь chmod 600 и находиться в той же папке, что и backup.sh.
Команда для крона указана в шапке backup.sh.