Пример того, как можно сделать ротацию резервных копий на bash (sh) и php.
Php скрипт для ротации бэкапов
27.03.2022
Для начала скрипт который будет делать zip файлов и mysql dump базы:
InPath=/var/www/SITE.ru/ OutPath=/backup/`date +%Y-%m-%d`/ mkdir $OutPath #rm -rf $OutPath/* zip -r $OutPath/files $InPath mysqldump -uUSER -hlocalhost -p'PASSWORD' DB_NAME > $OutPath/DB_NAME .sql php backup_rotator.php
- этот sh скрипт ставим на Cron.
И сам backup_rotator.php, он удаляет устаревшие копии:
<?php function delTree($dir) { $files = array_diff(scandir($dir), array('.','..')); foreach ($files as $file) { (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file"); } return rmdir($dir); } function dir_size($dir) { $totalsize=0; if ($dirstream = @opendir($dir)) { while (false !== ($filename = readdir($dirstream))) { if ($filename!="." && $filename!=".."){ if (is_file($dir."/".$filename)) $totalsize+=filesize($dir."/".$filename); if (is_dir($dir."/".$filename)) $totalsize+=dir_size($dir."/".$filename); } } } closedir($dirstream); return $totalsize; } function get_dir_list($dir) { $aRet = []; if ($dirstream = @opendir($dir)) { while (false !== ($filename = readdir($dirstream))) { if ($filename!="." && $filename!=".."){ $sTMP = $dir.$filename; if (is_dir($sTMP)) $aRet[] = $sTMP; } } } closedir($dirstream); sort($aRet); return $aRet; } $sWorkPath = '/backup/'; $sToday = date('Y-m-d'); // Проверяем, что последний бэкап прошел (архив больше гигабайта). $iSize = dir_size($sWorkPath.$sToday); //$iSize = number_format($iSize / 1073741824, 2); // GB //$iSize = number_format($iSize / 1024, 0); // MB if ($iSize > 1073741824){ $aDirList = get_dir_list($sWorkPath); // Проверяем, что бэкап не единственный if(count($aDirList) > 1) { // Удалеям самый первый бэкап // echo $aDirList[0] ."\n"; delTree($aDirList[0]); } } else { // Отправляем сообщение об ошибке mail('EMAIL', 'Backup Error', 'Backup Error'); }