• На проекте открылась регистрация только для продавцов. Для обычных пользователей будет открыта позже. Подробнее.
    P.S. Не надо скидывать ссылки на форумы, где у вас ноль сообщений. Подобные заявки будут отклонятся.

Скриптинг bash script backup для сайта

Infoman

IPv6
WebVoice
На днях столкнулся с задачей поставить на крон автобекап сайтов(файлов в директориях и базы данных).
Для начала сам скрипт, а ниже распишу подробней.
Код:
#!/bin/sh

doc_root=/home/i/infoman/site
name=backup_`date +\%Y\%m\%d`

dbconn=$doc_root/public_html/library/config.php

readcfg() {
   grep $1 $dbconn | sed 's/.*"\(.*\)".*/\1/'
}

host1=`readcfg host`
username=`readcfg username`
password=`readcfg password`
database=`readcfg dbname`

utf=`grep 'BX_UTF' $dbconn | grep true`

if [ -z "$utf" ]; then
   charset=cp1251
else
   charset=utf8
fi

backup_dir=$doc_root/backup

if [ ! -e $backup_dir ]; then
   mkdir $backup_dir
fi

cd $doc_root &&
mysqldump -h$host1 -u$username -p$password --default-character-set=$charset $database > $backup_dir/$name.sql &&
tar -cf $backup_dir/$name.tar $backup_dir/$name.sql && 
rm $backup_dir/$name.sql &&
tar -rf $backup_dir/$name.tar --exclude '*backup/*' --exclude '*public_html/files/*' . &&
gzip -f -9 $backup_dir/$name.tar &&
find $backup_dir -ctime +30 -exec rm {} \; &&
echo OK && exit
echo Error


doc_root определяет рутовую директорию
name имя файла, в нашем случае будет backup+дата_создания
Код:
doc_root=/home/i/infoman/site
name=backup_`date +\%Y\%m\%d`

Если мы хотим добавлять в бекап еще и бд, то у нас есть два пути:
  1. Прописываем данные для соединения с базой руками
  2. Указываем в dbconn путь до файла с конфигом и функция readcfg() сама все сделает.
    Приведу пример пары конфигов
    Система управления сайтом Bitrix
    Код:
    dbconn=$doc_root/bitrix/php_interface/dbconn.php
    
    host1=`readcfg DBHost`
    username=`readcfg DBLogin`
    password=`readcfg DBPassword`
    database=`readcfg DBName`
    Часть содержимого dbconn.php:
    PHP:
    define("DBPersistent", false);
    $DBType = "mysql";
    $DBHost = "localhost";
    $DBLogin = "root";
    $DBPassword = "1Bdy&idPd9lKy";
    $DBName = "infomanbd";
    $DBDebug = false;
    $DBDebugToFile = false;

    Для xenforo
    Код:
    dbconn=$doc_root/public_html/library/config.php
    
    host1=`readcfg host`
    username=`readcfg username`
    password=`readcfg password`
    database=`readcfg dbname`
    Часть содержимого config.php:


    PHP:
    $config['db']['host'] = "localhost";
    $config['db']['port'] = "3306";
    $config['db']['username'] = "infomanbd";
    $config['db']['password'] = "13I^bCeUdyDHdfrFF";
    $config['db']['dbname'] = "infomanbd";
    Обратите внимание что данные для подключения заключены в двойные кавычки, иначе функция readcfg() не сработает.
Далее нам надо указать какие директории не включать в архив бекапа
Код:
tar -rf $backup_dir/$name.tar --exclude '*backup/*' --exclude '*public_html/files/*' . &&
В данном случае папка backup в которой будут складываться бекапы и на самом сайте папка files, в которой хранятся тяжелые файлы.

Чтоб со временем у нас не закончилось место на хостинге, будем удалять архивы с бекапом старше 30 дней
Код:
find $backup_dir -ctime +30 -exec rm {} \; &&


Сохраняете этот скрипт например как backup.sh, на директорию выше чем ваш сайт.
Например ваш сайт лежит тут: /home/i/infoman/site/public_html/<файлы сайта>
Скрипт будет находиться: /home/i/infoman/site/backup.sh
Бекапы будут сохранятся в: /home/i/infoman/site/backup/

Самому скрипту надо дать права 700, через SSH это делается так: chmod +x backup.sh

Теперь вы можете поставить данный скрипт на cron, либо запускать руками ./backup.sh
 
Сверху