Архив сайта, форума, баз данных - бэкап на Яндекс Диск
Клиентское и серверное программное обеспечение

Модератор: Группа Модераторов

  Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Serg » Пн дек 17, 2012 14:32

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑
I. Что это ?

Часто возникает необходимость автоматически (в том числе по расписанию) создавать бэкапы файлов сайтов, форумов, баз данных и хранить их в сети или на локальном компьютере. После появления Гугл Диска и Яндекс Диска появилась возможность хранить архивы бэкапов на них.

Библиотека класса PHP class.b2yd.php предназначена для создания бэкапов сайтов и баз данных с выгрузкой на Яндекс Диск, ftp, отправкой по e-mail.

Автор: Serg (c) 2012

Лицензия: General Public License (LGPL)

Системные требования:
  • версия php не ниже 5.0.0 с поддержкой zlib, mysql, curl
  • сервер с cron (crontab) для запуска по расписанию и поддержкой cgi при отсутствии возможности запуска скриптов php по расписанию
  • остальные - в соответствии с требованиями используемых библиотек классов PHP
Благодарности:
  • Прототип
  • Прототип дампа mysql взят здесь
Спасибо авторам за предоставленные примеры !

Требуемые библиотеки:
  • pclzip.lib.php + исправление ошибок
  • class_webdav_client.php + патч + исправление ошибок
  • PHPMailer + исправление ошибок
  • class.aes256cbc.php
  • class.phpBB.php
Исправления ошибок и дополнения реализованы Serg .

II. Установка

Для хостингов с ограничениями по:
  • операциям ввода-вывода,
  • времени выполнения скрипта,
  • максимальному размеру файла,
  • и др.
см. пример masterhost.ru в следующей главе.

Библиотека поставляется в виде архива zip, все дополнительные скрипты включены, примеры и readme.txt в комплекте. Как устанавливать:
  1. Переписать содержимое каталогов, включая подкаталоги, в корень своего сайта (обычно /html или /www, в примере используется /html):
    root.b2yd -> /html/b2yd
    root.cgi-bin -> /html/cgi-bin
  2. Используя пример (example.class.b2yd.php) создать собственный скрипт, например, my.class.b2yd.php и переписать его в каталог /html/b2yd
  3. Изменить права (chmod):
    /html/b2yd/work (с вложенными подкаталогами и файлами) - 777
    /html/cgi-bin/b2yd.cgi - 755
    для скриптов PHP задать права в соответствии с требованиями хостинга - обычно 755
  4. Проверить работу своего скрипта, задав строку в браузере:
    Код: Выделить всё
    http://mysite.ru/b2yd/my.class.b2yd.php?debug=2&log=1
    где mysite.ru - Ваш сайт
  5. При отсутствии ошибок по результатам проверки в предыдущем пункте добавить строку в crontab, например:
    если поддерживается прямой вызов скриптов PHP:
    Код: Выделить всё
    0 2 * * 1,3,5 http://mysite.ru/cgi-bin/b2yd.cgi?http://mysite.ru/b2yd/my.class.b2yd.php?debug=0&log=1
    если не поддерживается прямой вызов скриптов PHP, воспользуйтесь wget:
    Код: Выделить всё
    0 2 * * 1,3,5 /usr/local/bin/wget -b -O /dev/null -T 36000 -t 1 "http://mysite.ru/cgi-bin/b2yd.cgi?http://mysite.ru/b2yd/my.class.b2yd.php?debug=0&log=1" > /dev/null
    или
    Код: Выделить всё
    0 2 * * 1,3,5 /usr/local/bin/wget -b -O /dev/null -T 36000 -t 1 "http://mysite.ru/b2yd/my.class.b2yd.php?debug=0&log=1" > /dev/null
    где:
    0 2 * * 1,3,5 - расписание для cron: в понедельник, среду и пятницу в 02:00
    mysite.ru - Ваш сайт
    /usr/local/bin/wget - путь к wget
III. Установка на хостинги с ограничениями (на примере masterhost.ru)

A) Проблемы:
  1. В .htaccess невозможно задать требуемые параметры.
    Использовать php_value запрещено, если в .htaccess такие директивы присутствуют, при попытке запуска скрипта Вы получите сообщение об ошибке !
    Ограничение можно обойти следующим образом:
    - Запускаем PuTTY, подключаемся, вводим логин и пароль.
    - Выполняем команды:
    Код: Выделить всё
    cp /usr/local/bin/php-cgi /home/uXXXXX/mydomain.ru/cgi-bin/php-cgi
    или (в зависимости от тарифного плана)
    Код: Выделить всё
    cp /usr/local/bin/php /home/uXXXXX/mydomain.ru/cgi-bin/php-cgi
    далее:
    Код: Выделить всё
    cp /usr/local/etc/php.ini /home/uXXXXX/mydomain.ru/cgi-bin/php-cgi.ini
    chmod 755 /home/uXXXXX/mydomain.ru/cgi-bin/php-cgi
    uXXXXX и mydomain.ru замените соответственно своим параметрам.
    Затем подключаем интерпретатор в .htaccess директивами:
    Код: Выделить всё
    Action php-script /cgi-bin/php-cgi
    AddHandler php-script .php
    После этого меняем нужные параметры в /cgi-bin/php.ini (пример прилагается - см. архив комплекта поставки).
  2. Перегрузка сервера дисковыми операциями.
    В журнале ошибок появляются записи вида:
    Код: Выделить всё
    IO limit exceeded (xx)
    Resource limit exceeded, access to mydomain.ru is temporarily denied
    Следует настроить параметры скрипта:
    Код: Выделить всё
    // Для хостингов, на которых может возникнуть перегрузка по дисковым операциям (IO limit exceeded)
    // Для masterhost.ru - 150mb/120s с 10-кратным запасом ~ 130kb/s
    // Максимум нагрузки в байтах (для masterhost.ru - 150 мегабайт за 2 минуты)
    $b2yd_load_max = (150 * 1024 * 1024) / 120 / 10;
    " / 10" в строке - чтобы занимать 10% от разрешенного. Однако, в результате скорость будет примерно 130 килобайт в секунду, и архивы размером в полгигабайта будут создаваться несколько часов.
    Обратите внимание: чем больше список каталогов для архивирования в одной операции, тем больше PclZip выполняет рааботы с диском. Это связано с алгоритмом добавления файлов в архив.
    Оптимально работать только с каталогами и не более одного на операцию.
  3. Тайм-аут выполнения скрипта.
    В журнале ошибок появляются записи вида:
    Код: Выделить всё
    Timeout waiting for output from CGI script /home/uXXXXX/mydomain.ru/cgi-bin/php-cgi
    (70007)The timeout specified has expired: ap_content_length_filter: apr_bucket_read() failed
    Тайм-аут составляет около 300 секунд. Затем сервер разрывает соединение с ошибкой.
    Это ограничение в настоящее время преодолено, кроме случая запуска из браузера на клиентской машине.
  4. Максимальный размер файла.
    При превышении допустимого размера файла скрипт "тихо умирает" без каких-либо сообщений в логах сервера.
    В этом случае надо использовать возможность создания списка файлов и архивов из нескольких частей (см. пример: example.list.b2yd.php).
    Так, для тарифов нижнего уровня на masterhot.ru стабильно работает 20МБ, можно без риска увеличить до 40-50МБ.
  5. Запуск php-скрипта по расписанию (cron).
    Необходимо добавить скрипт в crontab. Как это сделать - см. здесь.
    Запуск скрипта выполняем посредством wget. Пример строки crontab:
    Код: Выделить всё
    0 1 * * 1,4 /usr/local/bin/wget -b -O /dev/null -T 36000 -t 1 "http://mysite.ru/cgi-bin/myscript.php" > /dev/null
    В примере - запуск по понедельникам и четвергам в 01:00. Вместо mysite.ru и myscript.php следует подставить свои значения.
B) Установка:
  1. Переписать содержимое каталогов, включая подкаталоги, в корень своего сайта (обычно /www, в примере используется /www):
    root.b2yd -> /html/b2yd
    Если Вы не выполнили самостоятельно подключение интерпретатора, то можете попробовать использовать прилагаемый, копируйте:
    root.cgi-bin.masterhost.ru -> /html/cgi-bin
  2. Используя пример (example.class.b2yd.php) создать собственный скрипт, например, my.class.b2yd.php и переписать его в каталог /html/b2yd
  3. Изменить права (chmod):
    /www/b2yd/work (с вложенными подкаталогами и файлами) - 777
    /www/cgi-bin/php.cgi - 755
    /www/cgi-bin/php-cgi.cgi - 755
    для скриптов PHP задать права в соответствии с требованиями хостинга - обычно 755
  4. Проверить работу своего скрипта, задав строку в браузере:
    Код: Выделить всё
    http://mysite.ru/b2yd/my.class.b2yd.php?debug=2&log=1
  5. При отсутствии ошибок по результатам проверки в предыдущем пункте добавить строку в crontab, например:
    Код: Выделить всё
    0 2 * * 1,3,5 /usr/local/bin/wget -b -O /dev/null -T 36000 -t 1 "http://mysite.ru/cgi-bin/my.class.b2yd.php?debug=0&log=1" > /dev/null
    где:
    0 2 * * 1,3,5 - расписание для cron: в понедельник, среду и пятницу в 02:00
    mysite.ru - Ваш сайт
    /usr/local/bin/wget - путь к wget
    Пример в случае создания архива из нескольких частей:
    Код: Выделить всё
    0 2 * * 1,3,5 /usr/local/bin/wget -b -O /dev/null -T 36000 -t 1 "http://mysite.ru/cgi-bin/my.list.class.b2yd.php?debug=0&log=1" > /dev/null
    0 3-8,0-1 * * * /usr/local/bin/wget -b -O /dev/null -T 36000 -t 1 "http://mysite.ru/cgi-bin/my.list.class.b2yd.php?debug=0&log=1&list=1" > /dev/null
    где:
    0 2 * * 1,3,5 - расписание для cron: понедельник, среда, пятница в 2 часа 00 минут
    0 3-8,0-1 * * * - расписание для cron: ежедневно с 0 до 1 и с 3 до 8 часов в 00 минут

    IV. Аварийное прекращение работы скрипта (по требованию)

    Если Вы ошиблись при тестировании или скрипт слишком долго работает, достаточно переписать файл b2yd.break (см. root.b2yd/break) в подкаталог /work пути размещения b2yd.
    После остановки скрипта не забудьте удалить этот файл !

    V. Бонус для форумов phpBB3

    См. Bender.php и Bender2.php ))

    VI. Дополнительные сведения

    Как сказано выше, для настройки библиотеки требуется настроить каталог для хранения временных файлов, лога и др., см. $work_dir. По умолчанию временные файлы создаются в подкаталоге ./work, в нем необходимы права на запись (777). Каталог хранения временных файлов (если задан) не входит в путь для архивирования.

    В рабочем каталоге будет располагаться файл b2yd.log.txt - лог выполнения, если $log > 0.

    Если задан максимальный размер файла лога ($log_max_size), то:
    • первым создаётся файл b2yd.log.txt, если такой файл существует и превышает заданный размер - b2yd.log1.txt и т.д.,
    • по достижению нумерации 9 удаляются файлы логов: b2yd.log.txt, b2yd.log1.txt ... b2yd.log4.txt
    • затем происходит переименование b2yd.log5.txt -> b2yd.log.txt, b2yd.log6.txt -> b2yd.log1.txt ... b2yd.log9.txt -> b2yd.log4.txt и активным становится b2yd.log5.txt,
    • таким образом, всегда остаются как минимум 5 последних файлов логов.
    Права для скриптов - в соответствии с требованиями хостинга (обычно 755).

    Скрипт удобнее всего размещать в папке /b2yd. Обычно в www или html, то есть там, где хранятся файлы сайта.

    Формат имени архивного файла на Яндекс Диске:
    <префикс><тип><дата и время>[_hash_<hash>].zip
    где:
    <имя> - параметр backup_name, если опущен - то "<n>", где n - номер архива в массиве бэкапов, считаетя с 1
    <тип> - "_files" для бэкапа файлов, "_mysql_<имя базы данных>" для баз данных MySQL
    <дата и время> - "_" и затем дата и время в формате функции data "YmdHis" (можно изменить);
    <hash> - если разрешено добавление hash к имени файла (суффикс, см. $add_hash), то:
    • если $add_hash равен 'md5' (умолчание) - md5 файла (если удалось получить) в формате _md5_<строка md5>
    • если $add_hash равен 'sha1' - sha1 файла (если удалось получить) в формате _sha1_<строка sha1>
    Если файл зашифрован, к нему добавляется расширение .enc; зашифрованный файл можно расшифровать утилитой openssl (см. http://openssl.org , для Windows дистрибутив можно найти здесь, а описание ключей, например, здесь). Пример командной строки (как расшифровать):
    Код: Выделить всё
    openssl enc -d -aes-256-cbc -salt  -pass pass:mypass -in myfile.zip.enc -out myfile.zip
    где вместо 'mypass' подставьте свой пароль, вместо 'myfile' - имя своего файла. Для расшифровки нескольких файлов под Windows, если пароли для всех файлов одинаковые, удобно сделать командный файл (пример):
    Код: Выделить всё
    @echo off
    for %%i in (*.zip.enc) do openssl enc -d -aes-256-cbc -salt -pass pass:mypass -in %%i -out %%~ni
    где ~ni означает, что надо использовать имя файла без расширения (то есть без последнего .enc).
    Под unix-подобной ОС, полагаю, сделать подобное никому не составит труда))

    Не рекомендуется включать много файлов или каталогов в один архив, используя $backup_dir с массивом из многих элементов, это может вызвать большую нагрузку на сервер ! Лучше создайте много маленьких архивов, процесс архивации пойдет значительно быстрее и будет требовать меньше дисковых операций (это особенности реализации PclZip). Оптимальный вариант - по одному каталоу в архиве. Рекомендуется располагать операции с файлами (например, '../*.*') первыми, если их объем меньше объема содержимого каталогов, включаемых в архив.

    Если скрипт завершается по превышению максимально допустимого времени выполнения, то попробуйте:
    • Измените max_execution_time в php.ini, если есть доступ, иначе
    • Если используется apache, создайте .htaccess в каталоге, где располагается скрипт, с таким содержимым (или добавьте, если файл существует)
      Код: Выделить всё
      php_value max_execution_time "36000"
      php_value upload_max_filesize "64M"
      php_value post_max_size "64M"
      php_value memory_limit "-1"
      Собственно, нужен только max_execution_time, остальное - для ускорения работы.
    VII. Типовой пример (examlpe.class.b2yd.php)

    Код: Выделить всё
    <?php
    //
    // [email protected] : Создание архива сайта и баз данных с выгрузкой на Яндекс Диск.
    //
    // class.b2yd.php v.2.1.0
    // Пример
    // crontab: 30 00 * * 2,5 /usr/local/bin/wget -b -O /dev/null -T 3600 -t 1 'http://mysite.ru/cgi-bin/mysite.class.b2yd.php' > /dev/null
    // Расписание: по вторникам и пятницам в 00:30

    // Класс b2yd
    require_once('class.b2yd.php');
    $b2yd = new b2yd();

    // Рабочий каталог (для временых файлов, лога и файла прекращения выполнения) без слэша в конце
    // Если задан, то этот каталог всегда исключается из файловых архивов.
    $b2yd->work_dir = './work';                     // Рабочий каталог (например, './work', требуются права на запись - 777)

    // Отладочная информация (глобальная переменная)
    $b2yd->debug = 2;                           // 0 - нет, > 0 - уровень отладки (обычно 1)
    $b2yd->log = 1;                              // 0 - нет, иначе вести лог в текущем каталоге в файле $work_dir/b2yd.log.txt (требуются права на запись - 777)
    $b2yd->log_max_size = 256 * 1024;   // 0 - не учитывать, иначе максимальный размер файла лога, после которого переходим на следующий

    // Поправка для времени сервера (не все указали зону UTC+4)
    $b2yd->timeaddh = 0;                        // 0 - нет, иначе, например, плюс 1 час

    // Время выполнения скриптов
    $b2yd->timeout = 36000;                        // 10 часов

    // Для хостингов, на которых может возникнуть перегрузка по дисковым операциям (IO limit exceeded)
    $b2yd->load_max = 0;                        // Максимум нагрузки байт/сек (для masterhost.ru - 150 мегабайт за 2 минуты)
    // Для masterhost.ru - 150mb/120s с 10-кратным запасом ~ 130kb/s
    //$b2yd->load_max = (150 * 1024 * 1024) / 120 / 10;   // Максимум нагрузки в байтах (для masterhost.ru - 150 мегабайт за 2 минуты)

    // Параметры запуска
    if($b2yd->request_var('debug',-1)    >= 0) $b2yd->debug    = $b2yd->request_var('debug',-1);
    if($b2yd->request_var('log',-1)      >= 0) $b2yd->log      = $b2yd->request_var('log',-1);
    if($b2yd->request_var('timeaddh',-1) >= 0) $b2yd->timeaddh = $b2yd->request_var('timeaddh',-1);
    if($b2yd->request_var('timeout',-1)  >= 0) $b2yd->timeout  = $b2yd->request_var('timeout',-1);
    if($b2yd->request_var('load_max',-1) >= 0) $b2yd->load_max = $b2yd->request_var('load_max',-1);

    // Работаем
    $b2yd->job(
          // Хранилища
          array(
             // Яндекс Диск
             array(
                // Логин
                'yandex_login' => 'mylogin',
                // Если задан массив логинов - хранилища выбираются последовательно для каждого нового бэкапа,
                // что позволяет избавиться от ограничений размера Яндекс Диска, подключив несколько штук
                //'yandex_login' => array('mylogin', 'mylogin2', 'mylogin3', 'mylogin4', 'mylogin5'),
                // Пароль
                'yandex_pass' => 'mypass',
                // Если задан массив логинов и пароли разные - следует задать аналогичный по размеру массив паролей (см. ниже),
                // если пароль одинаковый для всех логинов, задать его один раз (как в примере выше)
                //'yandex_pass' => array('mypass', 'mypass2', 'mypass3', 'mypass4', 'mypass5'),
                // Папка на Яндекс Диске не выше 1 уровня (если не существует - создается, например: /test)
                'yandex_dir' => '/BackUps.mysite.ru',
                // Сколько предыдущих архивов с таким префиксом имени хранить (0 - без ограничений, 1 - хранится 2 архива: предыдущий и текущий)
                // Предыдущие архивы удаляются только если $yandex_nfiles имет ненулевое значение
                'yandex_nfiles' => 14,
                // Сколько предыдущих архивов хранить, если нет места на диске (0 - опция отключена)
                // В случае отсутсвия места на диске предыдущие архивы удаляются только если $yandex_nsfiles имет ненулевое значение
                'yandex_nsfiles' => 7,
                ),
             ),
          // Бэкапы
          array(
             // Бэкап файлов
             array(
                // Относительный путь к архивируемым файлам с вложенными подкаталогами (если скрипт находится, например, в /html/b2yd то для /html/forum указываем ../forum)
                // Могут использоваться маски. Может задаваться массив.
                'backup_dir' => array('../forum', '../site'),
                // Пропускаемые файлы и каталоги (массив) для любого $backup_dir и $bacup_nosub, путь задается без их учета
                'backup_skip' => array('forum/cache/*.php'),
                // Имя бэкапа
                'backup_name' => 'www_full',
                ),
             // Бэкап баз данных
             array(
                // Имя хоста
                'backup_db_host' => 'localhost',
                // Имя базы данных
                'backup_db_name' => 'db_mysite1',
                // Имя пользователя
                'backup_db_user' => 'mysite1',
                // Пароль пользователя
                'backup_db_pass' => 'pass1',
                // Имя бэкапа
                'backup_name' => 'www_phpbb',
                // Шифровать файл архива (если задан), алгоритм aes-256-cbc + salt
                'backup_enc_alg' => 'aes256cbc',
                // Пароль на зашифрованный файл архива
                'backup_enc_pass' => 'mypass',
                ),
             array(
                // Имя хоста
                'backup_db_host' => 'localhost',
                // Имя базы данных
                'backup_db_name' => 'db_mysite2',
                // Имя пользователя
                'backup_db_user' => 'mysite2',
                // Пароль пользователя
                'backup_db_pass' => 'pass2',
                // Имя бэкапа
                'backup_name' => 'www_drupal',
                ),
             ),
          // Уведомления
          array(
             // email
             array (
                // Если параметры с префиксом email_smtp задан - отправка через указанный smtp сервер.
                // Иначе (параметры smtp закомментированы или отсутствуют) - отправка с использованием транспорта mail - см. функция PHP mail().
                // Для masterhost.ru следует использовать mail.
                // Сервер smtp для отправки почты (без префиксов "http://" и завершающего "/", можно указать два сервера - через ";")
                'email_smtp_server' => 'smtp.yandex.ru',
                // Порт сервера smtp (по умолчанию 25)
                //'email_smtp_port' => 25,
                // Аутентификация smtp (параметр опущен или 0 - не нужна, иначе - нужна)
                'email_smtp_auth' => 1,
                // Шифрование (параметр опущен или пустой - нет, иначе можно задать 'tls' или 'ssl')
                //'email_smtp_secure' => '',
                // Логин
                'email_smtp_login' => 'b2yd_myservice',
                // Пароль
                'email_smtp_pass' => 'b2yd_mypass',
                // E-mail отправителя (если опущен или пустой - '[email protected]')
                'email_from' => '[email protected]',
                // Имя отправителя (если опущено или пустое - b2yd)
                'email_fromname' => 'myname',
                // Адрес получателей, массив
                'email_to' => array('[email protected]', '[email protected]'),
                // Адрес ответа (если опущен или пустой - данные берутся из $email_from)
                'email_replyto' => '[email protected]',
                // Адрес копии (если опущен или пустой - нет)
                //'email_cc' => '[email protected]',
                // Адрес скрытой копии (если опущен или пустой - нет)
                //'email_bcc' => '[email protected]',
                // Уведомлять не только по завершению, но и при старте (параметр опущен или нулевой - нет, иначе - да)
                // Это нужно для получения информации о запуске, если есть вероятность останова выполнения скрипта сервером или из-за фатальных ошибок
                'email_onstart' => 1,
                ),
             // phpbb3
             array (
                // URL форума phpbb3 (с префиксом "http://" и без завершающего "/")
                'phpbb3_server' => 'http://mysite.ru/forum',
                // Логин на форуме (бот-пользователь должен быть заранее создан)
                'phpbb3_login' => 'b2yd bot',
                // Пароль
                'phpbb3_pass' => '123456',
                // Номер форума (бот-пользователь должен иметь права на размещение сообщений в этом форуме)
                'phpbb3_forum' => 111,
                // Номер темы (бот-пользователь должен иметь права на размещение сообщений в этой теме)
                'phpbb3_topic' => 222,
                // Тема сообщения (если опущена, используется по умолчанию, обычно <Re: ><тема предыдущего сообщения>)
                'phpbb3_subject' => 'mysite.ru',
                // Уведомлять не только по завершению, но и при старте (параметр опущен или нулевой - нет, иначе - да)
                // Это нужно для получения информации о запуске, если есть вероятность останова выполнения скрипта сервером или из-за фатальных ошибок
                //'phpbb3_onstart' => 1,
                ),
             )
       );

    $b2yd->job(
          // Хранилища
          array(
             // Яндекс Диск
             array(
                // Логин
                'yandex_login' => 'mylogin',
                // Пароль
                'yandex_pass' => 'mypass',
                // Папка на Яндекс Диске не выше 1 уровня (если не существует - создается, например: /test)
                'yandex_dir' => '/BackUps.mysite2.ru',
                // Сколько предыдущих архивов с таким префиксом имени хранить (0 - без ограничений, 1 - хранится 2 архива: предыдущий и текущий)
                // Предыдущие архивы удаляются только если $yandex_nfiles имет ненулевое значение
                'yandex_nfiles' => 10,
                // Сколько предыдущих архивов хранить, если нет места на диске (0 - опция отключена)
                // В случае отсутсвия места на диске предыдущие архивы удаляются только если $yandex_nsfiles имет ненулевое значение
                'yandex_nsfiles' => 5,
                ),
             // ftp
             array(
                // Сервер (без префиксов "ftp://", "ftp." и завершающего "/")
                'ftp_server' => 'myftp.ru',
                // Порт (параметр может быть опущен)
                //'ftp_port' => 21,
                // Пассивные режим (если задано любое непустое и ненулевое значение, если параметр опущен или иное знчение - то активный режим)
                'ftp_passive' => 1,
                // Тайм-аут (параметр может быть опущен, тогда принимается 90 сек)
                //'ftp_timeout' => 1000,
                // Права доступа (восьмеричное значение, параметр может быть опущен)
                //'ftp_chmod' => 0777,
                // Логин
                'ftp_login' => 'myftplogin',
                // Пароль
                'ftp_pass' => 'myftppass',
                // Папка на ftp-сервере (например, "/dir1/dir2"), если параметр опущен - корневая
                'ftp_dir' => '/backups',
                // Сколько предыдщих архивов с таким префиксом имени хранить (0 - без ограничений, 1 - хранится 2 архива: предыдущий и текущий)
                // Предыдущие архивы удаляются только если $ftp_nfiles имет ненулевое значение
                'ftp_nfiles' => 5,
                ),
             // email
             array (
                // Если параметры с префиксом email_smtp задан - отправка через указанный smtp сервер.
                // Иначе (параметры smtp закомментированы или отсутствуют) - отправка с использованием транспорта mail - см. функция PHP mail().
                // Для masterhost.ru следует использовать mail.
                // Сервер smtp для отправки почты (без префиксов "http://" и завершающего "/", можно указать два сервера - через ";")
                'email_smtp_server' => 'smtp.yandex.ru',
                // Порт сервера smtp (по умолчанию 25)
                //'email_smtp_port' => 25,
                // Аутентификация smtp (параметр опущен или 0 - не нужна, иначе - нужна)
                'email_smtp_auth' => 1,
                // Шифрование (параметр опущен или пустой - нет, иначе можно задать 'tls' или 'ssl')
                //'email_smtp_secure' => '',
                // Логин
                'email_smtp_login' => 'b2yd_myservice',
                // Пароль
                'email_smtp_pass' => 'b2yd_mypass',
                // E-mail отправителя (если опущен или пустой - '[email protected]')
                'email_from' => '[email protected]',
                // Имя отправителя (если опущено или пустое - b2yd)
                'email_fromname' => 'myname',
                // Адрес получателей, массив
                'email_to' => array('[email protected]', '[email protected]', '[email protected]'),
                // Адрес ответа (если опущен или пустой - данные берутся из $email_from)
                'email_replyto' => '[email protected]',
                // Адрес копии (если опущен или пустой - нет)
                //'email_cc' => '[email protected]',
                // Адрес скрытой копии (если опущен или пустой - нет)
                //'email_bcc' => '[email protected]',
                ),
             ),
          // Бэкапы
          array(
             // Бэкап файлов
             array(
                // Относительный путь к архивируемым файлам
                'backup_dir' => '../forum',
                // Пропускаемые файлы и каталоги (массив) без учета $backup_dir
                'backup_skip' => array('*'.'/cache/'.'*.php'),
                // Имя бэкапа
                'backup_name' => 'www_phpbb3',
                ),
             // Бэкап баз данных
             array(
                // Имя хоста
                'backup_db_host' => 'localhost',
                // Имя базы данных
                'backup_db_name' => 'db_mysite1',
                // Имя пользователя
                'backup_db_user' => 'mysite1',
                // Пароль пользователя
                'backup_db_pass' => 'pass1',
                // Имя бэкапа
                'backup_name' => 'www_phpbb3',
                ),
             )
       );

    ?>

    VIII. Типовой пример работы с создаваемым списком (examlpe.class.b2yd.php)

    Код: Выделить всё
    <?php
    //
    // [email protected] : Создание архива сайта и баз данных с выгрузкой на Яндекс Диск.
    //
    // class.b2yd.php v.2.1.0
    // Пример
    // Создание списков
    // crontab: 30 00 * * 2,5 /usr/local/bin/wget -b -O /dev/null -T 3600 -t 1 'http://mysite.ru/cgi-bin/mysite.list.class.b2yd.php' > /dev/null
    // Расписание: по вторникам и пятницам в 00:30
    // Обработка списков
    // crontab: 30 1-23 * * * /usr/local/bin/wget -b -O /dev/null -T 3600 -t 1 'http://mysite.ru/cgi-bin/mysite.list.class.b2yd.php?list=1' > /dev/null
    // Расписание: ежедневно начиная с 01:30 наждый час

    // Класс b2yd
    require_once('class.b2yd.php');
    $b2yd = new b2yd();

    // Рабочий каталог (для временых файлов, лога и файла прекращения выполнения) без слэша в конце
    // Если задан, то этот каталог всегда исключается из файловых архивов.
    $b2yd->work_dir = './work';                     // Рабочий каталог (например, './work', требуются права на запись - 777)

    // Отладочная информация (глобальная переменная)
    $b2yd->debug = 2;                           // 0 - нет, > 0 - уровень отладки (обычно 1)
    $b2yd->log = 1;                              // 0 - нет, иначе вести лог в текущем каталоге в файле $work_dir/b2yd.log.txt (требуются права на запись - 777)

    // Поправка для времени сервера (не все указали зону UTC+4)
    $b2yd->timeaddh = 0;                        // 0 - нет, иначе, например, плюс 1 час

    // Время выполнения скриптов
    $b2yd->timeout = 3600;                        // 1 час

    // Для хостингов, на которых может возникнуть перегрузка по дисковым операциям (IO limit exceeded)
    $b2yd->load_max = 0;                        // Максимум нагрузки байт/сек (для masterhost.ru - 150 мегабайт за 2 минуты)
    // Для masterhost.ru - 150mb/120s с 10-кратным запасом ~ 130kb/s
    //$b2yd->load_max = (150 * 1024 * 1024) / 120 / 10;   // Максимум нагрузки в байтах (для masterhost.ru - 150 мегабайт за 2 минуты)

    // Параметры запуска
    if($b2yd->request_var('debug',-1)    >= 0) $b2yd->debug    = $b2yd->request_var('debug',-1);
    if($b2yd->request_var('log',-1)      >= 0) $b2yd->log      = $b2yd->request_var('log',-1);
    if($b2yd->request_var('timeaddh',-1) >= 0) $b2yd->timeaddh = $b2yd->request_var('timeaddh',-1);
    if($b2yd->request_var('timeout',-1)  >= 0) $b2yd->timeout  = $b2yd->request_var('timeout',-1);
    if($b2yd->request_var('load_max',-1) >= 0) $b2yd->load_max = $b2yd->request_var('load_max',-1);

    // Список ?
    $list = $b2yd->request_var('list',0);
    $max = $b2yd->request_var('max',20 * 1024 * 1024);

    // Параметры операций - пример для сайта + форума на движке phpbb3
    $storage =
          // Хранилища
          array(
                // Ханилище - Яндекс Диск
                array(
                   // Логин
                   'yandex_login' => 'mylogin',
                   // Если задан массив логинов - хранилища выбираются последовательно для каждого нового бэкапа,
                   // что позволяет избавиться от ограничений размера Яндекс Диска, подключив несколько штук
                   //'yandex_login' => array('mylogin', 'mylogin2', 'mylogin3', 'mylogin4', 'mylogin5'),
                   // Пароль
                   'yandex_pass' => 'mypass',
                   // Если задан массив логинов и пароли разные - следует задать аналогичный по размеру массив паролей (см. ниже),
                   // если пароль одинаковый для всех логинов, задать его один раз (как в примере выше)
                   //'yandex_pass' => array('mypass', 'mypass2', 'mypass3', 'mypass4', 'mypass5'),
                   // Папка на Яндекс Диске не выше 1 уровня (если не существует - создается, например: /test)
                   'yandex_dir' => '/BackUps.mysite.ru',
                   // Сколько предыдущих архивов с таким префиксом имени хранить (0 - без ограничений, 1 - хранится 2 архива: предыдущий и текущий)
                   // Предыдущие архивы удаляются только если $yandex_nfiles имет ненулевое значение
                   'yandex_nfiles' => 14,
                   // Сколько предыдущих архивов хранить, если нет места на диске (0 - опция отключена)
                   // В случае отсутсвия места на диске предыдущие архивы удаляются только если $yandex_nsfiles имет ненулевое значение
                   'yandex_nsfiles' => 7,
                   )
             );
    $backup =
          // Бэкапы
          array(
                // Бэкап баз данных
             $list ? '' :
                array(
                   // Имя хоста
                   'backup_db_host' => 'localhost',
                   // Имя базы данных
                   'backup_db_name' => 'db_mysite1',
                   // Имя пользователя
                   'backup_db_user' => 'mysite1',
                   // Пароль пользователя
                   'backup_db_pass' => 'pass1',
                   // Имя бэкапа
                   'backup_name' => 'www_phpbb',
                   ),
             $list ? '' :
                array(
                   // Имя хоста
                   'backup_db_host' => 'localhost',
                   // Имя базы данных
                   'backup_db_name' => 'db_mysite2',
                   // Имя пользователя
                   'backup_db_user' => 'mysite2',
                   // Пароль пользователя
                   'backup_db_pass' => 'pass2',
                   // Имя бэкапа
                   'backup_name' => 'www_drupal',
                   ),
                // Бэкап файлов
             $list ? '' : array(
                   // Относительный путь к архивируемым файлам с вложенными подкаталогами (если скрипт находится, например, в /html/b2yd то для /html/forum указываем ../forum)
                   // Могут использоваться маски. Может задаваться массив.
                   'backup_dir' => array('../*.*', '../site'),
                   // Пропускаемые файлы и каталоги (массив) без учета $backup_dir
                   //'backup_skip' => array(),
                   // Имя бэкапа
                   'backup_name' => 'www_root_and_site',
                   // Создать списки файлов вместо бэкапа (если задан и нулевой) или обработать очередной фрагмент списка (если задан и ненулевой)
                   //'backup_list' => $list,
                   // Максимальный размер несжатых файлов для архива файлов в одном списке (по умолчанию 100 МБ)
                   //'backup_max' => $max,
                ),
             $list ? '' : array(
                   // Относительный путь к архивируемым файлам с вложенными подкаталогами (если скрипт находится, например, в /html/b2yd то для /html/forum указываем ../forum)
                   // Могут использоваться маски. Может задаваться массив.
                   'backup_dir' => array('../forum'),
                   // Пропускаемые файлы и каталоги (массив) без учета $backup_dir
                   'backup_skip' => array('*/forum/files/*', '*/forum/images/avatars/upload/*', '*/forum/cache/*.php',  '*/forum/store/*.gz'),
                   // Имя бэкапа
                   'backup_name' => 'www_forum',
                   // Создать списки файлов вместо бэкапа (если задан и нулевой) или обработать очередной фрагмент списка (если задан и ненулевой)
                   //'backup_list' => $list,
                   // Максимальный размер несжатых файлов для архива файлов в одном списке (по умолчанию 100 МБ)
                   //'backup_max' => $max,
                ),
                // Бэкап файлов по списку (аватарки форума)
                array(
                   // Относительный путь к архивируемым файлам с вложенными подкаталогами (если скрипт находится, например, в /html/b2yd то для /html/forum указываем ../forum)
                   // Могут использоваться маски. Может задаваться массив.
                   'backup_dir' => '../forum/images/avatars/upload',
                   // Пропускаемые файлы и каталоги (массив) для любого $backup_dir и $bacup_nosub, путь задается без их учета
                   //'backup_skip' => array(),
                   // Имя бэкапа
                   'backup_name' => 'www_forum_images_avatars_upload',
                   // Создать списки файлов вместо бэкапа (если задан и нулевой) или обработать очередной фрагмент списка (если задан и ненулевой)
                   'backup_list' => $list,
                   // Максимальный размер несжатых файлов для архива файлов в одном списке (по умолчанию 100 МБ)
                   'backup_max' => $max,
                   ),
                // Бэкап файлов по списку (аттачи форума)
                array(
                   // Относительный путь к архивируемым файлам с вложенными подкаталогами (если скрипт находится, например, в /html/b2yd то для /html/forum указываем ../forum)
                   // Могут использоваться маски. Может задаваться массив.
                   'backup_dir' => '../forum/files',
                   // Пропускаемые файлы и каталоги (массив) для любого $backup_dir и $bacup_nosub, путь задается без их учета
                   //'backup_skip' => array(),
                   // Имя бэкапа
                   'backup_name' => 'www_forum_files',
                   // Создать списки файлов вместо бэкапа (если задан и нулевой) или обработать очередной фрагмент списка (если задан и ненулевой)
                   'backup_list' => $list,
                   // Максимальный размер несжатых файлов для архива файлов в одном списке (по умолчанию 100 МБ)
                   'backup_max' => $max,
                   ),
             );
    $notice =
          // Уведомления
          array(
                // email
                array (
                   // Если параметры с префиксом email_smtp задан - отправка через указанный smtp сервер.
                   // Иначе (параметры smtp закомментированы или отсутствуют) - отправка с использованием транспорта mail - см. функция PHP mail().
                   // Для masterhost.ru следует использовать mail.
                   // Сервер smtp для отправки почты (без префиксов "http://" и завершающего "/", можно указать два сервера - через ";")
                   'email_smtp_server' => 'smtp.yandex.ru',
                   // Порт сервера smtp (по умолчанию 25)
                   //'email_smtp_port' => 25,
                   // Аутентификация smtp (параметр опущен или 0 - не нужна, иначе - нужна)
                   'email_smtp_auth' => 1,
                   // Шифрование (параметр опущен или пустой - нет, иначе можно задать 'tls' или 'ssl')
                   //'email_smtp_secure' => '',
                   // Логин
                   'email_smtp_login' => 'b2yd_myservice',
                   // Пароль
                   'email_smtp_pass' => 'b2yd_mypass',
                   // E-mail отправителя (если опущен или пустой - '[email protected]')
                   'email_from' => '[email protected]',
                   // Имя отправителя (если опущено или пустое - b2yd)
                   'email_fromname' => 'myname',
                   // Адрес получателей, массив
                   'email_to' => array('[email protected]', '[email protected]'),
                   // Адрес ответа (если опущен или пустой - данные берутся из $email_from)
                   'email_replyto' => '[email protected]',
                   // Адрес копии (если опущен или пустой - нет)
                   //'email_cc' => '[email protected]',
                   // Адрес скрытой копии (если опущен или пустой - нет)
                   //'email_bcc' => '[email protected]',
                   // Уведомлять не только по завершению, но и при старте (параметр опущен или нулевой - нет, иначе - да)
                   // Это нужно для получения информации о запуске, если есть вероятность останова выполнения скрипта сервером или из-за фатальных ошибок
                   'email_onstart' => 1,
                   ),
                // phpbb3
                array (
                   // URL форума phpbb3 (с префиксом "http://" и без завершающего "/")
                   'phpbb3_server' => 'http://mysite.ru/forum',
                   // Логин на форуме (бот-пользователь должен быть заранее создан)
                   'phpbb3_login' => 'b2yd bot',
                   // Пароль
                   'phpbb3_pass' => '123456',
                   // Номер форума (бот-пользователь должен иметь права на размещение сообщений в этом форуме)
                   'phpbb3_forum' => 111,
                   // Номер темы (бот-пользователь должен иметь права на размещение сообщений в этой теме)
                   'phpbb3_topic' => 222,
                   // Тема сообщения (если опущена, используется по умолчанию, обычно <Re: ><тема предыдущего сообщения>)
                   'phpbb3_subject' => 'mysite.ru',
                   // Уведомлять не только по завершению, но и при старте (параметр опущен или нулевой - нет, иначе - да)
                   // Это нужно для получения информации о запуске, если есть вероятность останова выполнения скрипта сервером или из-за фатальных ошибок
                   //'phpbb3_onstart' => 1,
                   ),
             );

    // Работаем
    $b2yd->job(
          // Хранилища
          $storage,
          // Бэкапы
          $backup,
          // Уведомления
          $notice
       );

    ?>

    IX. Типовой пример уведомления (по e-mail или на форуме phpBB3)

    См. примеры в этой теме форума. Текст уведомлений разных типов идентичен. При необходимости получения SMS по выполнению бэкапа можно воспользоваться сервисами mail.ru.

    X. История версий

    v1.0 : 20121216 : первый релиз

    v1.1 : 20121217 : стабильный релиз ( viewtopic.php?f=41&t=56 )

    v1.2 : 20121218 : добавлено:
    • выгрузка на ftp-сервер,
    • отправка на e-mail,
    • путь к корневой папке в файловых архивах и др.
    v1.3 : 20121219 : добавлено:
    • балансировка нагрузки,
    • преодоление проблем с masterhost.ru и др.
    v1.4 : 20121220 : добавлено:
    • уведомление на e-mail,
    • дополнительные исправления внешних библиотек и др.
    v.2.0.0 : 20121221 : преобразовано в class.b2yd

    v.2.0.1 : 20121223 : стабильный релиз

    v.2.0.2 : 20121224 : добавлено:
    • отправка e-mail посредством mail()
    • стабильный релиз
    v.2.0.3 : 20121225 : добавлено:
    • дробление архивов на части (учет ограничения хостинга по размеру файлов)
    • стабильный релиз
    v.2.0.4 : 20121227 : добавлено:
    • уведомление на форумах phpbb3
    • исправление мелких ошибок
    • стабильный релиз
    v.2.0.5 : 20130105 : исправление мелких ошибок

    v.2.0.6 : 20130106 : исправление ошибок с кодировкой mysql: файл дампа принудительно кодируется в $backup_db_charset

    v.2.0.7 : 20130107 : исправление ошибок с дампом mysql (пустая запись INSERT TO table VALUES ;), стабильный релиз

    v.2.0.8 : 20130109 : добавлено:
    • массив логинов Яндекс Диск - хранилища выбираются последовательно для каждого нового бэкапа, что позволяет избавиться от ограничений размера, подключив несколько штук
    • изменения в web_dav_client - Яндекс Диск иногда очень долго отдаёт список файлов каталога
    • стабильный релиз
    v.2.0.9 : 20130112 : добавлено:
    • исправление мелких ошибок
    • sha1 вместо md5 или отключение hash в суффиксе имени файла (см. $add_hash)
    • простое шифрование файла архива по алгоритму aes-256-cbc + salt, совместимое с openssl
v.2.1.0 : 20130114 : рефакторинг

v.2.1.1 : 20130117 : рефакторинг

v.2.1.2 : 20130127 : обновление phpBB.class.php

v.2.1.3 : 20130203 : обновление phpBB.class.php, добавлена возможность пропуска больших файлов, если их размер больше $backup_skip_large байт

XI. Примечания

Техническая поддержка:
  • оказывается на этом форуме в этой теме
  • бесплатная (в разумном объёме)
  • только на русском языке.
Если кто-то хочет переложить организацию выполнения бэкапов своих сайтов на наши плечи, мы готовы это сделать на коммерческой основе, равно как и реализовать специфические дополнения в скрипты по желанию Заказчика.

Перевод комментариев исходных кодов на английский не планируется, ибо используется сервис российского происхождения.

Исходные коды как были и есть OpenSource, так ими и останутся. Просьба упоминать автора при использовании скрипта в своих разработках и по возможности давать ссылку на эту тему форума. Чем больше пользователей, тем больше возможностей довести софт до совершенства. Замечания и пожелания приветствуются.

Успешного использования !

XII. Скачать

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

Скачать с форума:
b2yd_v_2_1_3.zip
Скачать с Яндекс Диска : b2yd_v_2_1_3.zip
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Serg
Администратор
 
Сообщения: 80
Зарегистрирован: Ср янв 14, 2009 14:50
Имя: Сергей Юрьевич

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Serg » Вт дек 18, 2012 12:04

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Выпущен b2yd v.1.2. Добавлено:
  • e-mail разработчика заменен на ,
  • выгрузка на ftp-сервер,
  • отправка на e-mail,
  • путь к корневой папке в файловых архивах
  • и др.
Обсуждение с разработчиком b2yd и связанных вопросов будет вестись только на этом форуме ))
Аватара пользователя
Serg
Администратор
 
Сообщения: 80
Зарегистрирован: Ср янв 14, 2009 14:50
Имя: Сергей Юрьевич

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Serg » Пн дек 24, 2012 9:42

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Выпущен b2yd v.2.0.2 (стабильный релиз). Изменения и дополнения:
  • преобразовано в class.b2yd.php
  • балансировка нагрузки,
  • преодоление проблем с masterhost.ru и др.
  • уведомление на e-mail,
  • дополнительные исправления внешних библиотек и др.
Аватара пользователя
Serg
Администратор
 
Сообщения: 80
Зарегистрирован: Ср янв 14, 2009 14:50
Имя: Сергей Юрьевич

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Serg » Вт дек 25, 2012 14:26

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Выпущен b2yd v.2.0.3 (стабильный релиз). Изменения и дополнения:
  • дробление архивов на части (учет ограничения хостинга по размеру файлов) и др.
Аватара пользователя
Serg
Администратор
 
Сообщения: 80
Зарегистрирован: Ср янв 14, 2009 14:50
Имя: Сергей Юрьевич

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Serg » Вт дек 25, 2012 14:33

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑В настоящее время версия 2.0.2 и 2.0.3 используются
  • на серверах хостинга mtw.ru (два сайта, сервера atlant и senator),
  • на masterhost.ru (три сайта),
  • а также на собственных серверах (через каналы провайдера бывшего rm-telecom, ныне credo-telecom) в количестве от 3 до 10 штук в зависимости от погоды и остатков трафика ))
Кто скачал - просьба сообщать, на площадке какого провайдера удалось запустить бэкапы и, пожалуйста, какие были настройки.
Аватара пользователя
Serg
Администратор
 
Сообщения: 80
Зарегистрирован: Ср янв 14, 2009 14:50
Имя: Сергей Юрьевич

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Serg » Чт дек 27, 2012 10:33

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Выпущен b2yd v.2.0.4 (стабильный релиз). Изменения и дополнения:
  • уведомление на форумах phpbb3
  • исправление мелких ошибок и др.
Уведомления о бэкапах сайтов, форумов и баз данных доменов www.inkommet.ru и laztex.ru автоматически размещаются ботом b2yd bot в этой теме.
Аватара пользователя
Serg
Администратор
 
Сообщения: 80
Зарегистрирован: Ср янв 14, 2009 14:50
Имя: Сергей Юрьевич

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Serg » Сб янв 05, 2013 17:43

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Выпущен b2yd v.2.0.5 (стабильный релиз): исправление мелких ошибок. Добавлены бонусы ))
Аватара пользователя
Serg
Администратор
 
Сообщения: 80
Зарегистрирован: Ср янв 14, 2009 14:50
Имя: Сергей Юрьевич

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Serg » Вс янв 06, 2013 22:31

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Выпущен b2yd v.2.0.7 (стабильный релиз): исправление ошибок с кодировкой mysql, файл дампа принудительно кодируется в соответствии с новым параметром backup_db_charset (по умолчанию - utf8), исправление ошибок при создании дампа mysql (создавались паразитные пустые записи "INSERT TO table VALUES ;", кто успел скачать 2.0.6 - замените, пожалуйста, иначе придётся в дампе удалять вручную вышеуказанные строки)) ).

Спасибо Евгению () за сообщение об ошибке !
Аватара пользователя
Serg
Администратор
 
Сообщения: 80
Зарегистрирован: Ср янв 14, 2009 14:50
Имя: Сергей Юрьевич

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Serg » Ср янв 09, 2013 9:43

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Выпущен b2yd v.2.0.8 (стабильный релиз), изменения:
  • добавлен массив логинов Яндекс Диск - хранилища выбираются последовательно для каждого нового бэкапа, что позволяет избавиться от ограничений размера, подключив несколько штук
  • изменения в web_dav_client - Яндекс Диск иногда очень долго отдаёт список файлов каталога
Аватара пользователя
Serg
Администратор
 
Сообщения: 80
Зарегистрирован: Ср янв 14, 2009 14:50
Имя: Сергей Юрьевич

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Serg » Сб янв 12, 2013 16:20

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Выпущен b2yd v.2.1.0 (стабильный релиз), изменения:
  • рефакторинг, исправление мелких ошибок
  • sha1 вместо md5 или отключение hash в суффиксе имени файла
  • простое шифрование файла архива по алгоритму aes-256-cbc + salt, совместимое с openssl
Аватара пользователя
Serg
Администратор
 
Сообщения: 80
Зарегистрирован: Ср янв 14, 2009 14:50
Имя: Сергей Юрьевич

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Serg » Чт янв 17, 2013 12:37

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Выпущен b2yd v.2.1.1 (стабильный релиз) : рефакторинг.
Аватара пользователя
Serg
Администратор
 
Сообщения: 80
Зарегистрирован: Ср янв 14, 2009 14:50
Имя: Сергей Юрьевич

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Santyago » Ср янв 23, 2013 10:47

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Здравствуйте!
Большое спасибо за Ваш скрипт.
Скрипт настроил под свой сайт, проверил работу через браузер - все отлично. Но вот с кроном у меня проблемы.
Написал в тех поддержку(ihc.ru) на что мне ответили
Код: Выделить всё
---------------
Здравствуйте.

К сожалению я не понимаю как у Вас запускался скрипт, у меня он выдает такие ошибки:
./b2yd.cgi
Can't locate LWP/UserAgent.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at ./b2yd.cgi line 2.
BEGIN failed--compilation aborted at ./b2yd.cgi line 2.

После установки libwww-perl на сервер, скрипт заработал и выводит:
./b2yd.cgi
Content-type: text/html

Error :
<html>
<head><title>An Error Occurred</title></head>
<body>
<h1>An Error Occurred</h1>
<p>400 URL missing</p>
</body>
</html>

Запустить его по Cron можно просто установкой полного пути в задании, так как обработчик задается в самом скрипте.
Команда: /var/www/fftp/data/www/site.ru/cgi-bin/b2yd.cgi
--------------------

Помогите пожалуйста, что нужно поправить?
Santyago
Пользователь
 
Сообщения: 9
Зарегистрирован: Ср янв 23, 2013 10:35

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Serg » Ср янв 23, 2013 11:26

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Santyago, в справке по cron у хостера htc.ru (см. здесь) в примере скрипт php запускается "напрямую". Для начала попробуйте сделать свой тестовый скрипт php и запускайте его с передачей каких-то параметров, пусть скрипт просто выдаст дату, время и полученные параметры. Если получилось - тестовый скрипт заменяем на требуемый.

Что же касается вопроса про ошибку, скрипт b2yd.cgi служит для запуска скрипта php. У некоторых хостеров есть ограничения - php нельзя запускать через cron, поэтому и сделан такой промежуточный скрипт. Ему в качестве параметра передаётся URL скрипта php, который он запускает. Например, строка crontab может выглядеть так:
Код: Выделить всё
30 1 * * * http://mysite.ru/cgi-bin/b2yd.cgi?http://mysite.ru/b2yd/mysite.class.by2d.php?debug=0&log=1
где mysite.ru - URL Вашего сайта, а mysite.class.by2d.php - это скрипт, который бэкапит сайт и форум, он использует class.b2yd.php и др. Причем все файлы лежат в каталоге /b2yd.
Аватара пользователя
Serg
Администратор
 
Сообщения: 80
Зарегистрирован: Ср янв 14, 2009 14:50
Имя: Сергей Юрьевич

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Santyago » Ср янв 23, 2013 12:38

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Serg спасибо большое
Есть два варианта на IHC
- в кроне прописать /usr/bin/php /var/www/fftp/data/www/site.ru/b2yd/my.class.b2yd.php?debug=2&log=1
или
- прописать /usr/bin/GET http://site.ru/b2yd/my.class.b2yd.php?debug=2&log=1
Запустился почему то только второй вариант.

Только вот ошибка - в логах после того как сделал архивацию файлов Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 51 bytes) in /var/www/fftp/data/www/site.ru/b2yd/pclzip.lib.php on line 3324
Попробую еще ночью запустить, у меня ночью таких ошибок не выдавало, все копировалось и письма отправлялись, в логах все было отл.

Еще раз ОГРОМНОЕ СПАСИБО SERG`у за работу!
Santyago
Пользователь
 
Сообщения: 9
Зарегистрирован: Ср янв 23, 2013 10:35

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Serg » Ср янв 23, 2013 12:51

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Пожалуйста !
Santyago писал(а):два варианта на IHC
В первом варианте что-то с путём не так. Второй заработал, и хорошо)
Santyago писал(а):после того как сделал архивацию файлов Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 51 bytes) in /var/www/fftp/data/www/site.ru/b2yd/pclzip.lib.php on line 3324
Видимо, большой архив получается и срабатывает ограничение хостинга на размер памяти, файлов и др. Варианты: a) добавить нужные настройки php в .htaccess, где лежит скрипт class.b2yd.php (примеры были в архиве), но этот вариант часто не проходит b) сделать по примеру examlpe.list.class.b2yd.php: сначала создаётся список, при этом указывается размер файлов для одного архива (например, 40 мегабайт), а потом скрипт запускается ежечасно и формирует очередную порцию для выгрузки.
Аватара пользователя
Serg
Администратор
 
Сообщения: 80
Зарегистрирован: Ср янв 14, 2009 14:50
Имя: Сергей Юрьевич

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Santyago » Пт янв 25, 2013 7:10

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Не могу заставить его работать.
У меня виртуальный сервер, в php.ini я добавил настройки о которых Вы писали (max_execution_time php_value upload_max_filesize php_value post_max_size) Память поставил 128мб
При вызове скрипт создает архив (400мб+) и зависает. Последние строки лога
063441] 2013.01.25/06:34:41 [b2yd] Add dir with subdirs : ..
[063441] 2013.01.25/06:34:41 [b2yd] Backup dirs
Никаких ошибок он не пишет
Пробовал вставлять различные значения в $b2yd->load_max, скрипт также зависат и в последних строках лога
[070552] 2013.01.25/07:07:05 [b2yd] Overload, load size 4198517 bytes, sleep 1 sec, new load size should be 4213
[070552] 2013.01.25/07:07:06 [b2yd] Overload, load size 4198618 bytes, sleep 1 sec, new load size should be 4314
[070552] 2013.01.25/07:07:08 [b2yd] Overload, load size 4196379 bytes, sleep 1 sec, new load size should be 2075
И опять же никаких ошибок
В чем может быть дело?
Santyago
Пользователь
 
Сообщения: 9
Зарегистрирован: Ср янв 23, 2013 10:35

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Santyago » Пт янв 25, 2013 9:26

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Нашел у себя ошибку - я правил не тот файл php.ini их два :-)
После правки, я продвинулся чуть дальше - теперь архивирует файлы и копирует на Ядиск, но затем

Upload archive : fff_files_20130125082536_md5_42980dfc448acc97e7b3bd113fa42ae2.zip to yandex disk
File : /site/fff_files_20130125082536_md5_42980dfc448acc97e7b3bd113fa42ae2.zip uploaded, WebDAV server returns : 201
Stop. Uploaded file : /site/fff_files_20130125082536_md5_42980dfc448acc97e7b3bd113fa42ae2.zip (456 856 629 bytes)
Archive file prefix : fffsql
(и больше ничего)

Т.е. sql базу на диск не заливает...
Santyago
Пользователь
 
Сообщения: 9
Зарегистрирован: Ср янв 23, 2013 10:35

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Serg » Пт янв 25, 2013 10:25

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑У Вас архивный файл получается почти в полгига. Скрипт вырубается по ограничению хостинга на размер файлов (так я полагаю) и никаких сообщений об ошибках Вы не увидите, если хостер так всё настроил. Рекомендую сделать по примеру examlpe.list.class.b2yd.php - как говорил двумя постами выше. Пусть режется на куски по 50-60МБ, у меня тоже так, например, на одной из своих площадок - режу на куски и их бэкаплю каждый час, получается 15 кусков - целый день бэкапится))
P.S. Предварительно надо убедиться, что бэкап для sql работает.
Аватара пользователя
Serg
Администратор
 
Сообщения: 80
Зарегистрирован: Ср янв 14, 2009 14:50
Имя: Сергей Юрьевич

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Santyago » Вс янв 27, 2013 23:03

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑
Serg писал(а):У Вас архивный файл получается почти в полгига. Скрипт вырубается по ограничению хостинга на размер файлов (так я полагаю) и никаких сообщений об ошибках Вы не увидите, если хостер так всё настроил. Рекомендую сделать по примеру examlpe.list.class.b2yd.php - как говорил двумя постами выше. Пусть режется на куски по 50-60МБ, у меня тоже так, например, на одной из своих площадок - режу на куски и их бэкаплю каждый час, получается 15 кусков - целый день бэкапится))
P.S. Предварительно надо убедиться, что бэкап для sql работает.


Пробовал резать на куски, действительно режет, все работает (часа два отправлял, может больше), на яндекс.диск файлы отлично приходят, но как дело доходит до sql скрипт присылает ошибку, вернее не ошибка а вот это
== Stop. Uploaded file : /site/fff_files_20130125110707_md5_00e6c869700349d3e262f1367776d71a.zip (456 922 211 bytes)
2013.01.25/11:11:51 [b2yd] Archive file prefix : fffssql

Что то на этапе с SQL выгрузкой, файлы отправляются нормально как полностью так и по частям.
Я проверил все настройки скрипта касательно SQL (пароли и прочее) - все верно.
Что может быть?
Santyago
Пользователь
 
Сообщения: 9
Зарегистрирован: Ср янв 23, 2013 10:35

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Serg » Пн янв 28, 2013 7:11

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Если архив порционный, такого большого файла быть не должно... Если только у Вас не залит какой-то здоровенный архив или видео, который попадает в бэкап ! Такой файл надо исключить из бэкапа (см. backup_skip) и, если файл очень нужный, бэкапить его вручную. pclzip не умеет нарезать отдельные файлы, к сожалению.

Если так оно и есть, добавлю опцию - какого размера файлы пропускать...

Можно попробовать ещё так:
1) Очистите лог (если ведется)
2) Разрешите ведение лога, если не включен (по умолчанию - в .\work, в каталоге нужны права 777)
3) Найдите в by2d.class.php строчку
Код: Выделить всё
      $this->trace("File info : " . $f . ", add file $f to archive",4);
(это в функции pre_add_callback) и замените её (в строке неинформативная запись, добавим выдачу размера файла) на:
Код: Выделить всё
      $this->trace("Preadd file : $f , size : " . $p_header['size'],4);
При редактировании учтите - кодировка utf8.
4) Запустите Ваш скрипт бэкапа вручную с параметрами ?debug=4&log=1
5) Пришлите мне лог и скрипт (разумеется, вымарав оттуда все пароли-логины и то, что считаете секретным)
6) Пришлите мне результат phpinfo() (для каталога, где выполняется Ваш скрипт)
7) На всякий случай по sql - сообщите, какая кодировка баз mysql, каков общий размер базы и какие параметры у самой большой таблицы (кол-во полей, кол-во записей, общий размер).
Поразбираюсь. Да Вы по логу и сами увидите...
Аватара пользователя
Serg
Администратор
 
Сообщения: 80
Зарегистрирован: Ср янв 14, 2009 14:50
Имя: Сергей Юрьевич

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Santyago » Пн янв 28, 2013 9:26

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑SERG в который раз спасибо Вам за помощь!

Странно, ничего не меняя сегодня ночью запустился скрипт по крону и все файлы и SQL отлично скопировались.

Про разбиение - я ставил цифру в $b2yd->load_max но какую точно сейчас не помню, действительно файл копировался один на 450 мб, но копирование заняло 2-3 часа. Лог был громадный
и состоял из таких строк
Overload, load size 131412 bytes, sleep 1 sec, new load size should be 340
Но потом я эту функцию закоментировал, т.к. он и без этого нормально копируется.

Потестю еще...
Santyago
Пользователь
 
Сообщения: 9
Зарегистрирован: Ср янв 23, 2013 10:35

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Serg » Пн янв 28, 2013 9:44

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Отлично ! Поздравляю !

Вам спасибо за тестирование. Я тоже заинтересован, чтобы бэкапы работали безупречно, а Вы выявили недостаток - включение в архив больших файлов. Теперь надо придумать, что c этим делать))
Аватара пользователя
Serg
Администратор
 
Сообщения: 80
Зарегистрирован: Ср янв 14, 2009 14:50
Имя: Сергей Юрьевич

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Santyago » Чт янв 31, 2013 17:55

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Дело в том что файлы сайта меняются не так часто, а вот бэкап SQL я рад бы делать хоть по два раза в день. Могли бы вы добавить в скрипт такую возможность чтобы запускать этот скрипт с неким параметром и бэкап был бы только для SQL базы?
Santyago
Пользователь
 
Сообщения: 9
Зарегистрирован: Ср янв 23, 2013 10:35

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Serg » Чт янв 31, 2013 21:56

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Так Вы сделайте два скрипта:
  1. бэкап файлов (например, пару раз в неделю, запускается по понедельникам и четвергам в 01:30)
  2. бэкап баз данных (например, каждый день, запускается в 04:30)
Главное, чтобы одновременно не работали)
Аватара пользователя
Serg
Администратор
 
Сообщения: 80
Зарегистрирован: Ср янв 14, 2009 14:50
Имя: Сергей Юрьевич

Re: Архив сайта, форума, баз данных - бэкап на Яндекс Диск

Сообщение Serg » Вс фев 03, 2013 15:58

Изменить размер шрифта ↓ВернутьИзменить размер шрифта ↑Выпущен b2yd v.2.1.3 (стабильный релиз) :
  • рефакторинг
  • обновление phpBB.class.php (v.1.0.6)
  • добавлена возможность пропуска больших файлов, если их размер больше $backup_skip_large байт.
Аватара пользователя
Serg
Администратор
 
Сообщения: 80
Зарегистрирован: Ср янв 14, 2009 14:50
Имя: Сергей Юрьевич

След.

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1