Skip to content

Instantly share code, notes, and snippets.

@dnikonov
Last active March 27, 2024 10:10
Show Gist options
  • Save dnikonov/9a364bd13d39ae71f7b3da708f35c166 to your computer and use it in GitHub Desktop.
Save dnikonov/9a364bd13d39ae71f7b3da708f35c166 to your computer and use it in GitHub Desktop.
<?
global $_SERVER;
$_SERVER["DOCUMENT_ROOT"] = realpath(dirname(__FILE__)."/..");
// cron
// echo "/opt/php83/bin/php -f ".$_SERVER["DOCUMENT_ROOT"]."/local/backup_yandex_disk.php demo";
// echo "/opt/php83/bin/php -f ".$_SERVER["DOCUMENT_ROOT"]."/local/backup_yandex_disk.php clear";
// echo "/opt/php83/bin/php -f ".$_SERVER["DOCUMENT_ROOT"]."/local/backup_yandex_disk.php";
// exit;
// почта для уведомлений
define("EMAIL", "[email protected]");
// как получить токен указано в статье - https://habr.com/ru/articles/749156/
define("TOKEN", "");
// домен
define("DOMEN", idn_to_utf8(basename($_SERVER["DOCUMENT_ROOT"])));
// путь к папке с бэкапом на сервере
define("PATH", $_SERVER["DOCUMENT_ROOT"]."/bitrix/backup");
// путь на Ядиске
define("PATH_YA", "/backup/".DOMEN);
// имя папки на Ядиске
define("DIR", DOMEN."_".date("Ymd"));
// маска имен файлов в битриксе - он обрезает домен до 20 символов и убирает кириллические домены
define("FILES_BITRIX", (mb_strlen(preg_replace("/[^a-z]/iu", "", DOMEN)) ? mb_substr(DOMEN, 0, 20)."_" : "").date("Ymd"));
// количество хранимых бэкапов
define("COUNT", 10);
// обращение к апи
function getUrl($url, $options=[]) {
$ch = curl_init($url);
if (in_array("PUT", $options)) {
curl_setopt($ch, CURLOPT_PUT, true);
}
if (in_array("UPLOAD", $options)) {
curl_setopt($ch, CURLOPT_UPLOAD, true);
}
if (in_array("DELETE", $options)) {
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
}
if (array_key_exists("INFILESIZE", $options)) {
curl_setopt($ch, CURLOPT_INFILESIZE, $options["INFILESIZE"]);
}
if (array_key_exists("INFILE", $options)) {
curl_setopt($ch, CURLOPT_INFILE, $options["INFILE"]);
}
if (in_array("AUTH", $options)) {
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization: OAuth ".TOKEN));
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$res = @json_decode($res, true);
$result = ["http_code" => $http_code, "res" => $res];
return $result;
}
// если команда на создание тестовых папок
if (!empty($argv[1]) && $argv[1] == "demo") {
echo "<pre>";
print_r("Добавление тестовых директорий");
echo "</pre>";
// тестовые директории
$dirs = [];
for ($i=1; $i <= 10; $i++) {
$dirs[] = DOMEN.date("Ym").str_pad($i, 2, "0", STR_PAD_LEFT);
}
// создаем тестовые директории
foreach ($dirs as $key => $value) {
// создаем директорию
$url = "https://cloud-api.yandex.net/v1/disk/resources/?path=".urlencode(PATH_YA."/".$value);
$request = getUrl($url, ["AUTH", "PUT"]);
if (in_array($request["http_code"], [201, 202, 204])) {
echo "<pre>";
echo "Успешно создано - ".PATH_YA."/".$value;
echo "</pre>";
}
}
exit;
}
// если команда на удаление всех бэкапов
if (!empty($argv[1]) && $argv[1] == "clear") {
echo "<pre>";
print_r("Удаление всех бэкапов");
echo "</pre>";
// получаем список с диска
$url = "https://cloud-api.yandex.net/v1/disk/resources?path=".urlencode(PATH_YA)."&fields=_embedded.items.name,_embedded.items.type&limit=100";
$request = getUrl($url, ["AUTH"]);
echo "<pre>";
print_r($request["res"]);
echo "</pre>";
// если есть файлы/папки на диске
if (!empty($request["res"]["_embedded"]["items"])) {
// полная очистка папки
foreach ($request["res"]["_embedded"]["items"] as $key => $value) {
$url = "https://cloud-api.yandex.net/v1/disk/resources?path=".urlencode(PATH_YA."/".$value["name"])."&permanently=true";
$request = getUrl($url, ["AUTH", "DELETE"]);
if (in_array($request["http_code"], [201, 202, 204])) {
echo "<pre>";
echo "Успешно удалено - ".PATH_YA."/".$value["name"];
echo "</pre>";
}
}
}
exit;
}
// результат
$result = [0,0];
// переносим бэкап
foreach (glob(PATH."/".FILES_BITRIX."_*") as $file) {
// если первый проход
if (array_sum($result) == 0) {
// удаляем старые бэкапы
echo "<pre>";
print_r("Удаление старых бэкапов");
echo "</pre>";
// получаем список папок с диска
$url = "https://cloud-api.yandex.net/v1/disk/resources?path=".urlencode(PATH_YA)."&fields=_embedded.items.name,_embedded.items.type&limit=100";
$request = getUrl($url, ["AUTH"]);
echo "<pre>";
print_r($request["res"]);
echo "</pre>";
// удаляем старые бэкапы
if (!empty($request["res"]["_embedded"]["items"]) && count($request["res"]["_embedded"]["items"]) > (COUNT - 1)) {
$old = array_slice($request["res"]["_embedded"]["items"], 0, count($request["res"]["_embedded"]["items"]) - (COUNT - 1));
foreach ($old as $key => $value) {
// удаляем папку
$url = "https://cloud-api.yandex.net/v1/disk/resources?path=".urlencode(PATH_YA."/".$value["name"])."&permanently=true";
$request = getUrl($url, ["AUTH", "DELETE"]);
if (in_array($request["http_code"], [201, 202, 204])) {
echo "<pre>";
echo "Успешно удалено - ".PATH_YA."/".$value["name"];
echo "</pre>";
}
}
}
echo "<pre>";
print_r("Создание директории на Ядиске");
echo "</pre>";
// создаем директорию
$url = "https://cloud-api.yandex.net/v1/disk/resources/?path=".urlencode(PATH_YA."/".DIR);
$request = getUrl($url, ["AUTH", "PUT"]);
if (in_array($request["http_code"], [201, 202, 204])) {
echo "<pre>";
echo "Успешно создано - ".PATH_YA."/".DIR;
echo "</pre>";
}
}
// запрашиваем url для загрузки
$url = "https://cloud-api.yandex.net/v1/disk/resources/upload?path=".urlencode(PATH_YA."/".DIR."/".basename($file));
$request = getUrl($url, ["AUTH"]);
// если ошибки нет, то отправляем файл на полученный URL
if (empty($request["res"]["error"])) {
$fp = fopen($file, "r");
$url = $request["res"]["href"];
$request = getUrl($url, ["PUT", "UPLOAD", "INFILESIZE" => filesize($file), "INFILE" => $fp]);
if (in_array($request["http_code"], [201])) {
echo "File ".basename($file)." uploaded<br>";
$result[0]++;
} else {
$result[1]++;
echo "File ".basename($file)." error - ".$http_code."<br>";
}
fclose($fp);
}
}
// если бэкап не был отправлен
if (array_sum($result) == 0) {
mail(EMAIL, DOMEN." backup yandex", "Отсутствует резервная копия сайта.");
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment