#!/bin/bash ####################################################################################################################### # Это скрипт для резервного бекапирования виртуального хоста апач. # Должна соблюдаться структура каталогов от SvC, иначе работоспособность не гарантируется. # Скрипт бекапирует: # каталог с сайтом htdocs # базу данных MySQL # Сохраняет zip архив в папку backups рядом с папкой htdocs и (если настроено) отправляет на сервер резеревных копий # # Ничего изменять в этом файле не надо (если конечно вы не отдаете отчет своим действиям) # Параметры подключения и прочие конфигурации прописываются в конфигурационном файле. # Если конфигурационного файла нет, то при запуске будет создан шаблон конфигурационного файла # # Автор: SvC # Версия: 1.4.2.8 от 11.01.2021 # ####################################################################################################################### IFS_old=$IFS IFS="" # я не знаю что это за магический костыль, но благодаря ему перестали съедаться переносы строк true_script_name='vhost_backup' script_name=`basename $0` settings_path=`dirname $0` settings_name=$script_name.conf settings_fullname=$settings_path/$settings_name script_fullname=$settings_path/$script_name # проверка на наличие файла конфигурации if [ -e $settings_fullname ]; then settings_out=`/bin/cat $settings_fullname` check_update=`echo $settings_out | grep -P 'check_update' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` script_token=`echo $settings_out | grep -P 'script_token' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` mysql_server=`echo $settings_out | grep -P 'mysql_server' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` mysql_user=`echo $settings_out | grep -P 'mysql_user' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` mysql_pass=`echo $settings_out | grep -P 'mysql_pass' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` mysql_sid=`echo $settings_out | grep -P 'mysql_sid' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` backup_server=`echo $settings_out | grep -P 'backup_server' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` backup_user=`echo $settings_out | grep -P 'backup_user' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` backup_path=`echo $settings_out | grep -P 'backup_path' | cut -d '#' -f 1 | cut -d '=' -f 2 | awk '{$1=$1;print}'` # проверка обновлений if [ "$check_update" == "true" ]; then current_ver=`cat $script_fullname | grep -P '# Версия:' | head -1 | awk '{print $3}'` update_url="ss.svcserv.ru/update.php?script_name=$true_script_name¤t_ver=$current_ver&script_token=$script_token" update_ver=`curl -sL $update_url` if ((`echo $update_ver | cut -d '.' -f 4` > `echo $current_ver | cut -d '.' -f 4`)); then echo -e "\e[01;33mДоступно обновление ($current_ver -> $update_ver)\e[0m" echo 'Чтобы скачать напишите:' echo '' if [ "$script_name" == "$true_script_name" ]; then echo -e " rm $true_script_name && wget http://ss.svcserv.ru/$true_script_name && chmod ugo+x $true_script_name\e[0m" else echo -e " rm $script_name && wget http://ss.svcserv.ru/$true_script_name && chmod ugo+x $true_script_name && mv $true_script_name $script_name\e[0m" fi echo '' fi fi ####################################################################################################################### # тело скрипта #mysqldump -u${mysql_user} -p${mysql_pass} ${mysql_db} > db.sql #filename=${PWD##*/}_`date +%Y.%m.%d_%H.%M`.zip #zip -r backups/${filename} htdocs/ db.sql > /dev/null #rm db.sql #scp -C backups/${filename} backuper@10.8.0.22:/mnt/md0/backups/www/wiki.svcserv.ru # создание дампа MySQL if [ "$mysql_server" ]; then mysqldump -u${mysql_user} -p${mysql_pass} ${mysql_sid} > db_dump.sql fi # архивирование файлов filename=${PWD##*/}_`date +%Y.%m.%d_%H.%M`.zip zip -r backups/${filename} htdocs/ db_dump.sql > /dev/null # выгрузка файла на удаленный сервер if [ "$backup_server" ]; then scp -C backups/${filename} $backup_user@$backup_server:$backup_path fi # удаление файла дампа MySQL после запаковки в архив if [ "$mysql_server" ]; then rm db_dump.sql fi # конец тела скрипта ####################################################################################################################### # если конфигурационного файла нет else script_token=`< /dev/urandom tr -dc A-Za-z0-9 | head -c32` echo "" echo "Файл $settings_name отсутствует" echo "Cоздан шаблон файла, заполните его и запустите команду заново" echo "# это файл настроек для скрипта $settings_name # скрипт и файл настроек должны иметь одинаковое имя, если вы переименовываете скрипт, то файл настроек должен быть так же переименован check_update=true # проверять ли обновления скрипта script_token=$script_token # токен позволяющий однозначно идентифицировать скрипт mysql_server=127.0.0.1 # адрес сервера MySQL. Если не используется, нужно оставить поле пустым mysql_user=myuser # имя пользователя MySQL mysql_pass=mypass # пароль пользователя MySQL mysql_sid=mysid # имя базы данных MySQL backup_server=127.0.0.1 # адрес сервера для бекапов. Если не используется, нужно оставить поле пустым backup_user=backuper # имя пользователя для сервера бекапов backup_path=/home/backuper/backups # папка на удаленном сервере бекапов " > $settings_fullname fi