Backup database / Бэкап базы данных без плагинов на cPanel

Вступление

Появилась необходимость обычного бэкапа в zip, tar, gzip ну или в любом другом варианте сжатия. Никаких очисток, оптимизаций, перестроек, файловых бэкапов и улучшений мне не нужно было.
Нужен "чисты архив Базы Данных" 1-2 раза в сутки с удаленным дублированием в облако или сервер.
Плагины UpdraftPlus и WP Database Backup: первый не смог помочь из-за большого размера wp_postmeta, постоянно висел в ошибке, у второго сразу появлялась ошибка из-за недостатка времени и памяти. Колдовство с увеличением не помогло, а разбираться с логами и настройками уже надоело, так как 4 разных хостинга, с разными Версиями PHP, WordPress,Темами, Плагинами, Самописными скриптами и панелями управления.

Вариант Решения №1

Авторизация cPanel, + полный бэкап файлов через переменные из урл + cron и т.д. , знаний мало, и я не осилил.

Вариант Решения №2

То что нужно - Вариант максимально примитивный, не требует сверх знаний, думаю по инструкции справится и ребенок.
Решение максимально примитивно и в него не включено

  • отслеживание количества бэкапов
  • выставление количества бэкапов
  • перезапись старых бэкапов новыми на текущем хостинге
  • перезапись старых бэкапов новыми на облаке
  • я не нашел примера подключения к google диск

1 Создание Бэкапа базы данных

(если вы Горец и уверены в хостинге, тогда можно сразу остановится на этом пункте)
Необходимо отправится в крон задания cPanel и создать там правило выполнения полного бэкапа по нужному расписанию (У меня 2 раза в день 00.00 и 12.00), а также выбрать метод сжатия или без него.

создаем папку под бэкапы - я создал в корне

заходим в крон

создаем команду - 1 время, 2 команда и 3 подтверждение. Команда создается в одну строку.

вот пример готовой команды с замазанными моими данными

// если мы хотим в базу в чистом варианте
/usr/bin/mysqldump -u "DB_user" -p'DB_password' DB_name > /home/cPanel_user_ID/backups/databace__$(date +\%Y-\%m-\%d-\%H\%M\%S).sql

// если мы хотим в базу в сжатом варианте
/usr/bin/mysqldump -u "DB_user" -p'DB_password' DB_name | gzip /home/cPanel_user_ID/backups/databace__$(date +\%Y-\%m-\%d-\%H\%M\%S).sql.gz

// заменяем под себя переменные
DB_user - логин пользователя базы данных
DB_password - пароль пользователя базы данных. !Важно, на форумах пишут что между не должно быть пробелов-p'
DB_name - имя базы данных
cPanel_user_ID - можно посмотреть в главном меню или взять из url /home/тут ваш айди/
backups - папка где хранить бэкапы (я создал в корне)

2 Ключи к облаку - облако Яндекс диск.

Тут немного по сложнее. Я подключил яндекс диск. Пользовался этой инструкцией , но в итоге немного отошел от неё , вот порядок действий.
создание ключей для подключения к Яндекс диску* (далее ЯД) заполняем 4 пункта как на скрине
https://oauth.yandex.ru/client/new

Callback URI #1: - далее этот URL нам понадобится
https://oauth.yandex.ru/verification_code

В итоге "Сохраняем изменения" и нас перекидывает в новое поле

предыдушую вкладку оставляем открытой, открываем новую и формируем url для получения OAuth токен
https://oauth.yandex.ru/authorize?response_type=token&client_id=идентификатор приложения

идентификатор приложения - это строка ID из предыдущего скриншота. После того как я подставил ID и перешел по url, выскочило меню.

нажимаем разрешить и получаем OAuth токен

3 Формируем скрипт отправки Бэкапов и его запуск через крон

создал файл на хостинге в папке "/home/cPanel_user_ID/backups/" и назвал backup.php - простыми словами скрипт положил в папку для бэкапов.

добавил крон запуска своего скрипта 2 раза в сутки

php /home/cPanel_user_ID/backups/backup.php

в итоге получил

наполняем скрипт по описанию - места которые нужно проконтролировать или поправить под себя обозначил [*]

<?php ini_set('max_execution_time', 360);

//  получаем файлы  [*]
$dir    = '/home/cPanel_user_ID/backups';

// сканирование и сортировка по убыванию смотреть scandir()
$files2 = scandir($dir, 1);

// получаем последний созданный файли
$last_byname = $files2[0];

// получаем и определяем расширение  [*]
// у меня 2 бэкапа в sql и gzip и по єтому ниже идет выборка только gzip
// $ext = substr(strrchr($last_byname, '.'), 1);
// if ($ext == "sql"){
//  $last_byname = $files2[1];
// }

// Корректировка url файла  (*)
$backup_file_gz = '/home/cPanel_user_ID/backups/' . $last_byname;
$file = $backup_file_gz;

// https://oauth.yandex.ru/
// https://oauth.yandex.ru/authorize?response_type=token&client_id=идентификатор%20приложения

// ключ доступа подставляем имено ваш персональный  [*]
$token = '';

// Папка на Яндекс Диске, где будем хранить бэкапы (уже должна быть создана). [*]
$path = '/back_up/';

// Запрашиваем URL для загрузки. Я добавил параметр перезаписи '&overwrite=true'  [*]
$ch = curl_init('https://cloud-api.yandex.net/v1/disk/resources/upload?path=' . urlencode($path . basename($file)).'&overwrite=true');
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);
curl_close($ch);

$res = json_decode($res, true);
if (empty($res['error'])) {
	// Если ошибки нет, то отправляем файл на полученный URL.
	$fp = fopen($file, 'r');

	$ch = curl_init($res['href']);
	curl_setopt($ch, CURLOPT_PUT, true);
	curl_setopt($ch, CURLOPT_UPLOAD, true);
	curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file));
	curl_setopt($ch, CURLOPT_INFILE, $fp);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	curl_setopt($ch, CURLOPT_HEADER, false);
	curl_exec($ch);
	$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
	curl_close($ch);

	if ($http_code == 201) {
	//  echo 'Файл успешно загружен.';
	} else {
	//  echo $http_code ;
	}
}
if ($res['error'] == "UnauthorizedError"){
	// Отправка отчета на почту
		$to = "simple@yandex.com"; //  [*]
		$subject  = "Backup Error";
		$message  = "<b>Проблемы с backup:</b> ". $res['message'];
		$message .= "<br/><b>Тип ошибки:</b> ". $res['error'];
		$message .= "<br/><br/><b>Не вышло получить бэкап!" ;

		$headers  = "MIME-Version: 1.0\r\n"."Content-type: text/html; charset=utf-8 \r\n";
		$headers .= "From: Backup Admin <admin@simple.com>\r\n";  //  [*]
		mail ($to, $subject, $message, $headers);
} else {
	// Отправка отчета на почту
	  $to = "simple@yandex.com"; //  [*]
	  $subject  = "Backup";
	  $message  = "<b>Отправлен бэкап файл:</b> " . $last_byname;
	  $message .= "\n<br/><br/><b>Код ответа Яндекс Диска:</b> " .  $http_code;
	  $message .= "\n<br/><br/>Инфо:\n<br/>";
	  $message .= "201 – файл был загружен без ошибок.\n<br/>
				   202 – файл принят сервером, но еще не обработан.\n<br/>
				   412 – при дозагрузке файла был передан неверный диапазон в заголовке Content-Range.\n<br/>
				   413 – размер файла превышает 10 ГБ.\n<br/>
				   500, 503 – ошибка сервера, попробуйте повторить загрузку.\n<br/>
				   507 – для загрузки файла не хватает места на Диске пользователя";

	  $headers  = "MIME-Version: 1.0\r\n"."Content-type: text/html; charset=utf-8 \r\n";
	  $headers .= "From: Backup Admin <admin@simple.com>\r\n";  //  [*]
	  mail ($to, $subject, $message, $headers);
}

Итог у меня на яндекс диске

4 Отправка на другой сервер

писать не стал, не пользуюсь пока что. Но все работает на 2-3х командах

ftp_connect();
ftp_login();
ftp_put();