Просмотров: 7569 (Статистика ведётся с 06.02.2017)
Дата последнего изменения: 18.09.2018
Ольга Пичужкина
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
1
2
3
4
5

В Bitrix Framework есть функционал резервного копирования, но для создания резервной копии требуется участие администратора. Создание резервных копий по расписанию не предусмотрено, так как есть объективные причины, не позволяющие это сделать достаточно эффективно.

Создание архива - длительный и ресурсоёмкий процесс, на один хит это делать никак нельзя.

Варианты решения задачи:

  • сделать интерфейс, через который можно запускать создание архива через внешний планировщик (cron);
  • использовать системные инструменты.

Рассмотрим вариант для Unix.

  • Создаем скрипт
  • Как улучшить
  • Удаление старых архивов
  • Автоматическое восстановление
  • Как пользоваться?
  • Имеем unix подобную систему (Linux, Freebsd и т.д.) и возможность ставить задачи на cron. Традиционно unix предоставляет утилиту tar для создания архивов и bzip для сжатия, а база данных MySQL - утилиту создания дампа базы mysqldump.

    Создаем скрипт

    Архив портала по сути представляет дамп базы данных (содержимое БД в виде файла) и все файлы сайта (включая публичную часть и ядро Bitrix Framework).

    Значит, перейдём в корень портала и дамп базы создадим командой:

    mysqldump -hhost -uuser -ppass dbname > dump.sql

    А архив создадим командой:

    tar -czf archive.tar.gz 

    Теперь если это оформить в простейший скрипт, получим:

    #!/bin/sh
    ###### Config ######
    doc_root=/home/denis/www/test
    host=localhost
    username=username
    password=secret
    database=sitemanager_demo_start
    charset=cp1251
    ###################
    cd $doc_root &&
    mysqldump -h$host -u$username -p$password --default-character-set=$charset $database > $doc_root/bitrix/backup/archive.sql &&
    tar -czf $doc_root/bitrix/backup/archive.tar.gz . &&
    echo OK

    В коде вводятся параметры конфигурации, необходимо указать соответственно свои:

    • путь к корневой папке портала (значение DOCUMENT_ROOT в phpinfo),
    • имя хоста,
    • имя пользователя,
    • пароль и имя БД,
    • кодировку базы данных. Для портала в UTF-8 надо написать utf8, иначе оставить как есть.
    Примечание: Обратите внимание, что пробелы ни перед, ни после "равно" не ставятся.

    Этот вариант скрипта переходит в корень портала, создаёт дамп базы в кодировке, которую мы указали, затем создаёт в папке bitrix/backup архив сайта.

    Конструкция && позволяет прервать выполнение в случае ошибки (например, не удалось подключиться к базе).

    Это будет работать, но в архив попадут архивы сайта, созданные ранее, кеш, да и часть текущего архива тоже, что, прямо скажем, не очень красиво. Поэтому скрипт лучше модифицировать.

    Как улучшить

    Можно воспользоваться параметром исключения --exclude для папки bitrix/backup, добавив дамп базы, который лежит в этой папке, отдельным вызовом. Заодно можно упростить настройку скрипта, адаптировав его под Bitrix Framework, ведь мы же знаем, что все данные подключения к базе хранятся в bitrix/php_interface/dbconn.php. Тогда в качестве настройки можно будет использовать только путь к корневой папке портала.

    #!/bin/sh
    doc_root=$1
    name=$2
    if [ -z $doc_root ]; then
       echo Usage: $0 /path/to/document/root [backup_name]
       exit
    fi
    
    if [ -z $name ]; then
       name=backup
    fi
    
    dbconn=$doc_root/bitrix/php_interface/dbconn.php
    
    readcfg() {
       grep $1 $dbconn | sed 's/.*"\(.*\)".*/\1/'
    }
    
    host=`readcfg DBHost`
    username=`readcfg DBLogin`
    password=`readcfg DBPassword`
    database=`readcfg DBName`
    
    utf=`grep 'BX_UTF' $dbconn | grep true`
    
    if [ -z "$utf" ]; then
       charset=cp1251
    else
       charset=utf8
    fi
    
    backup_dir=$doc_root/bitrix/backup
    
    if [ ! -e $backup_dir ]; then
       mkdir $backup_dir
    fi
    
    cd $doc_root && 
    mysqldump -h$host -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 '*bitrix/tmp/*' --exclude '*bitrix/updates/*' --exclude '*bitrix/backup/*' --exclude '*bitrix/*cache/*' . && 
    gzip -f -9 $backup_dir/$name.tar && 
    echo OK && exit
    echo Error

    Этот вариант скрипта читает параметры dbconn.php, подключается к базе данных, делает дамп. Затем делает архив портала и сжимает его. Дамп удаляет. В случае необходимости создаёт папку bitrix/backup.

    На вход скрипт принимает два параметра: путь к корню портала и имя архива без расширения (не обязательный, по умолчанию backup).

    В случае успеха пишет ОК, иначе Error.

    Удаление старых архивов

    В описанном варианте если имя архива не меняется - он каждый раз переписывается. Если меняется имя архива, можно легко сделать удаление старых бэкапов. Например, удаляем архивы старше недели:

    заменяем строку
    echo OK && exit
    на
    find $backup_dir -ctime +7 -exec rm {} \; && echo OK && exit

    Автоматическое восстановление

    Технически с помощью скрипта можно производить и автоматическое восстановление. Но автоматическое восстановление портала - процедура не безопасная. Что-то пойдёт не так и портал «упадёт». Это следует делать с большой осторожностью.

    Хотя само по себе восстановить базу несложно. Замените

    mysqldump -h$host -u$username -p$password --default-character-set=$charset $database > $backup_dir/$name.sql
    на
    mysql -h$host -u$username -p$password --default-character-set=$charset $database < $backup_dir/$name.sql
    и удалите всё что ниже.

    Внимание ! И всё же мы настоятельно не рекомендуем это делать на живом проекте в автоматическом режиме.

    Как пользоваться?

    • Сохраняем код скрипта в файле на хостинге, желательно за пределами корня портала, например backup.sh, делаем исполняемым:
      chmod +x backup.sh
    • Проверяем из корня портала:
      ./backup.sh
      Должно отобразиться OK, а в папке bitrix/backup появиться файл backup.tar.gz.
    • С целью безопасности лучше задать имя архива, иначе злоумышленник сможет скачать его по прямой ссылке: http://portal.ru/bitrix/backup/backup.tar.gz/ Например:
      /home/denis/bin/backup.sh /var/www/test f43tg245g2_backup
    • Добавляем задачу на cron. Если мы хотим делать резервную копию регулярно в час ночи, пишем:
      crontab -e
      и
      0 1 * * * /home/denis/bin/backup.sh /var/www/test f43tg245g2_backup
    • А если надо, чтобы каждый раз создавался новый архив с именем даты, запись может иметь вид:
      0 1 * * * /home/denis/bin/backup.sh /var/www/test f43tg245g2_backup_`date +\%Y\%m\%d`

    Если на хостинге не действуют ограничения на время работы скриптов через cron (или они достаточно щадящие), то этот вариант должен нормально работать в большинстве случаев.


    23


    Курсы разработаны в компании «1С-Битрикс»