Возможности:
- архивирование каталогов (tar);
- создание дампов БД MySQL (mysqldump);
- запись созданных архивов на локальный диск;
- копирование архивов в облако (Яндекс.Диск);
- получение сведений о занятом и доступном месте на Яндекс.Диск;
- ротация экземпляров резервных копий и на локальном диске и в облаке (хранятся N последних копий, остальные удаляются);
- автоматическое создание необходимых каталогов;
- логирование выполняемых действий.
Архивы сохраняются на локальный диск и загружаются в облако (на Яндекс.Диск средствами REST API и OAuth-авторизации). Предусмотрена ротация архивных копий (хранится не более заданного числа архивов, остальные удаляются). На каждый ежедневный архив создается собственный каталог с именем вида "год-месяц-день", в который помещаются файлы с архивами БД и каталогов.
Для использования облачного хранилища Яндекс.Диск предварительно необходимо авторизоваться на Яндексе и создать приложение здесь (указать название приложения, дать все права в разделе Яндекс.Диск REST API, в Callback URL подставить URL для разработки). В свойствах созданного приложения будут приведены ID и пароль приложения. OAuth-токен можно получить вручную согласно этой инструкции. Либо, оставив поле token в $yandexDiskConfig сценария пустым, указать в этом свои логин и пароль для доступа к сервисам Яндекса, тогда токен будет запрашиваться у Яндекса при каждом запуске сценария. Рекомендую запросить токен таким образом однократно, а в дальнейшем полученный токен указывать непосредственно в $yandexDiskConfig), не дергая Яндекс лишними запросами.
Если имеется несколько учеток к Яндекс.Диск, то достаточно создать только одно приложение и указывать его ID и пароль при получении токена для другой учетки. Таким образом можно копировать архивы (или еще чего) на разные Яндекс.Диски.
Набор параметров:
- numberOfCloudBackups - количество хранимых бэкапов в облаке
- numberOfLocalBackups- количество хранимых бэкапов локально
- cloudBackupFolder- каталог для бэкапов в облаке (например, /backups)
- localBackupFolder- количество хранимых бэкапов в облаке (в днях)
- numberOfCloudBackups - локальный каталог для бэкапов (например, /home/skysilver/backups)
- shellScript - путь к вспомогательному shell-скрипту
- логин и пароль пользователя MySQL
- имена архвивируемых БД
- архивируемые каталоги (путь)
- реквизиты доступа к Яндекс.Диск
- app_id - идентификатор приложения
- app_secret - секретный ключ (пароль) приложения
- token - OAuth-токен
- login - логин пользователя
- password - пароль пользователя
1. Т.к. процесс архивирования и копирования в облако занимает приличное время, и чтобы основной цикл не ожидал завершения работы сценария, то запускать его нужно в фоне примерно так (для метода onNewMinute):
Код: Выделить всё
if(timeIs('06:05')) {
$command = "php -q ./objects/index.php script:backupServer";
shell_exec("nohup $command > /dev/null & echo $!");
}
Код: Выделить всё
www-data ALL=(root) NOPASSWD: /var/www/lib/backup.sh
4. Все параметры, требуемые в сценарии, у меня хранятся в свойствах объектов и в явном виде в коде сценария не указываются.
5. В коде сценария используется две функции - arraySort(&$data, $sortpath) и removeDirectory($dir), которые помещены в файл my.class.php вместе с другими пользовательскими функциями.
6. Класс для работы с Яндекс.Диск через REST API размещается в файле yandex_disk.class.php (в данном классе также есть много интересных функций по работе с облачным хранилищем Яндекса).
7. Файлы my.class.php, yandex_disk.class.php и backup.sh положить в /var/www/lib/.
8. Старался максимально комментировать код сценария, чтобы возникало меньше вопросов.

Обновление от 2.06.2015 г.
Порядок установки:
- 0. Убедиться, что в ОС есть пакеты tar, gzip и mysqldump. Предполагается, что Яндекс.Диск уже имеется, и логин-пароль к нему соответсвенно тоже.
1. Скачать и распаковать прикрепленный к посту архив. В нем лежит 4 файла: my.class.php, yandex_disk.class.php, backup.sh и backupServer.php.
2. Файлы my.class.php, yandex_disk.class.php положить в каталог lib и дать им права доступа и назначить владельца такие же, как и у других файлов в этом каталоге. Убедиться, что в содержимое файлов не добавились символы ^M в конце строк (такое бывает, если использовать для редактирования виндовый блокнот и т.п.).
3. Файл backup.sh также положить в каталог lib и дать ему права доступа и назначить владельца такие же, как и у других файлов в этом каталоге.
Убедиться, что в содержимое файла не добавились символы ^M в конце строк. Затем дать пользователю www-data полномочия запускать этот shell-скрипт от имени root. Для этого в файле /etc/sudoers добавить строкуФайл /etc/sudoers лучше редактировать с помощью команды visudo.Код: Выделить всё
www-data ALL=(root) NOPASSWD: /var/www/lib/backup.sh
4. Создать свое приложение на Яндексе. Получить OAuth-токен авторизации на Яндекс.Диске, ID и пароль созданного приложения. (см. п. "Описание").
5. Создать сценарий backupServer и вставить в него код из файла backupServer.php. Отредактировать код сценария под себя согласно комментариям в нем. Необходимо указать значения всех параметров, описанных в пункте "Набор параметров" этого поста. Значения параметров можно либо вписать прямо в код сценария, либо получать через getGlobal у свойств заранее созданного объекта.
6. По окончанию редактирирования сценария backupServer попробовать его запустить на выполенение и посмотреть результат. Если все ОК, то можно в метод onNewMinute добавить код на выполнение этого сценария в определенное время (см. п. "Замечания по применению"). Если что-то пошло не так, то наблюдать за логами Apache, DebMes на появление каких-либо ошибок.
7. В XRay убедиться, что данные имеются события о процессе резервного копирования.
Прикрепил файлами, иначе длинная портянка получается.

06:12:21 TRACE [script.backupServer]: Архивов меньше (или равно) требуемого количества. Ничего не удаляем.
06:12:21 TRACE [script.backupServer]: Найдено 6 каталогов на Яндекс.Диске.
06:12:21 TRACE [script.backupServer]: Архивов меньше (или равно) требуемого количества. Ничего не удаляем.
06:12:21 TRACE [script.backupServer]: Найдено 6 каталогов на локальном диске.
06:12:21 TRACE [script.backupServer]: Этап 3. Ротация бэкапов на локальном диске и в облаке.
06:12:19 TRACE [script.backupServer]: Загрузка на Яндекс.Диск: mysql_db_myfin2_2015-03-11_06-05.sql.gz [3502 Байт]
06:12:17 TRACE [script.backupServer]: Загрузка на Яндекс.Диск: mysql_db_myfin1_2015-03-11_06-05.sql.gz [122958 Байт]
06:12:11 TRACE [script.backupServer]: Загрузка на Яндекс.Диск: mysql_db_ihome_2015-03-11_06-05.sql.gz [6117289 Байт]
06:10:13 TRACE [script.backupServer]: Загрузка на Яндекс.Диск: files_www_2015-03-11_06-05.tar.gz [246780921 Байт]
06:10:05 TRACE [script.backupServer]: Загрузка на Яндекс.Диск: files_mysql_2015-03-11_06-05.tar.gz [12461525 Байт]
06:09:55 TRACE [script.backupServer]: Загрузка на Яндекс.Диск: files_logs_2015-03-11_06-05.tar.gz [18591556 Байт]
06:09:53 TRACE [script.backupServer]: Загрузка на Яндекс.Диск: files_etc_2015-03-11_06-05.tar.gz [663266 Байт]
06:09:53 TRACE [script.backupServer]: Каталог для ежедневного бэкапа успешно создан.
06:09:52 TRACE [script.backupServer]: Создаем каталог для ежедневного бэкапа /backups/2015-03-11 на Яндекс.Диске.
06:09:52 TRACE [script.backupServer]: Общий каталог для бэкапов уже создан на Яндекс.Диске.
06:09:52 TRACE [script.backupServer]: Свободно: 7.38 ГБ.
06:09:52 TRACE [script.backupServer]: Занято данными: 2.62 ГБ.
06:09:52 TRACE [script.backupServer]: Всего места на Яндекс.Диске: 10 ГБ.
06:09:51 TRACE [script.backupServer]: Этап 2. Копирование локального бэкапа в облако.
06:09:51 TRACE [script.backupServer]: Резервная копия каталога www успешно создана на локальном диске.
06:06:04 TRACE [script.backupServer]: Резервная копия каталога logs успешно создана на локальном диске.
06:05:44 TRACE [script.backupServer]: Резервная копия каталога mysql успешно создана на локальном диске.
06:05:19 TRACE [script.backupServer]: Резервная копия каталога etc успешно создана на локальном диске.
06:05:18 TRACE [script.backupServer]: Резервная копия БД db_ihome успешно создана на локальном диске.
06:05:10 TRACE [script.backupServer]: Резервная копия БД db_myfin2 успешно создана на локальном диске.
06:05:10 TRACE [script.backupServer]: Резервная копия БД db_myfin1 успешно создана на локальном диске.
06:05:10 TRACE [script.backupServer]: Каталог для ежедневного бэкапа успешно создан.
06:05:10 TRACE [script.backupServer]: Создаем каталог для ежедневного бэкапа /home/skysilver/backups/2015-03-11 на локальном диске.
06:05:10 TRACE [script.backupServer]: Общий каталог для бэкапов уже создан на локальном диске.
06:05:10 TRACE [script.backupServer]: Этап 1. Архивация БД и каталогов сервера на локальный диск.
06:05:10 TRACE [script.backupServer]: Начало резервного копирования данных на сервере.