Создание резервной базы данных Laravel на Google Drive

google_drive

Резервные копии БД – жизненно важны. Её данные понадобятся, как только сервер внезапно умрет или же с ним произойдёт любая другая неприятность с утратой данных. 

Публикуем алгоритм настройки резервной копии с помощью Google Drive, резервного пакета Spatie, Googles Flysystem и Laravel. Способ является годным и для других фрейморков, CMS.

Подготовка к Google API

Требования:

Установка Laravel

Хранилище Google Drive

Установлено приложение Mysql dump

Базовые знания о PHP и настройке пакетов в Laravel

Монтаж

Всё стартует с установки резервного пакета Spatie:

$ composer require spatie/laravel-backup

Если нет автоматического обновления или установлена более старая версия Laravel, необходимо зарегистрироваться у поставщика услуг самостоятельно в config/app.php:

'providers' => [
     ...
     Spatie\Backup\BackupServiceProvider::class
]

Публикация файла конфигурации:

$ php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"

Планировщик в ядре:

// Backups (to Google Drive)
$schedule->command('backup:clean')->dailyAt('01:30');
$schedule->command('backup:run --only-db')->dailyAt('01:35');

В открытом app/backup.php и нужно изменить драйвер для использования google’s driver:

'disks' => [
    'google',                
    'local',             
],

Затем очередь за адаптером Flysystem для Google Drive:

$ composer require nao-pon/flysystem-google-drive:~1.1

Создание нового поставщика услуг, который предоставляет драйвер файловой системы:

$ php artisan make:provider GoogleDriveServiceProvider

Затем внутри boot()метода добавляется драйвер google для файловой системы:

\Storage::extend('google', function ($app, $config) {
    $client = new \Google_Client();
    $client->setClientId($config['clientId']);
    $client->setClientSecret($config['clientSecret']);
    $client->refreshToken($config['refreshToken']);
    $service = new \Google_Service_Drive($client);
    $adapter = new \Hypweb\Flysystem\GoogleDrive\GoogleDriveAdapter($service, $config['folderId']);
    return new \League\Flysystem\Filesystem($adapter);
});

Теперь нужно зарегистрировать в GoogleDriveServiceProvider поставщика через config/app.php файл.

Добавляется диск хранения в config/filesystems.php

return [
  
    // ...
    
    'disks' => [
        
        // ...
        
        'google' => [
            'driver' => 'google',
            'clientId' => env('GOOGLE_DRIVE_CLIENT_ID'),
            'clientSecret' => env('GOOGLE_DRIVE_CLIENT_SECRET'),
            'refreshToken' => env('GOOGLE_DRIVE_REFRESH_TOKEN'),
            'folderId' => env('GOOGLE_DRIVE_FOLDER_ID'),
        ],
        
        // ...
        
    ],
    
    // ...
];

Обновлённый  .env файл:

GOOGLE_DRIVE_CLIENT_ID=xxx.apps.googleusercontent.com
GOOGLE_DRIVE_CLIENT_SECRET=xxx
GOOGLE_DRIVE_REFRESH_TOKEN=xxx
GOOGLE_DRIVE_FOLDER_ID=null

Формирование учетных данных в Google

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

Вперёд, в консоль Google: https://console.developers.google.com/

Сначала нужно получить ID клиента и секретный код клиента.

Для начала работы с сервисом необходимо создать новый проект:

После ввода названия требуется несколько секунд для генерации проекта на сервере.

Убедитесь, что проект выбран в верхней части.

Затем перейдя в библиотеку и следует выбрать «Драйвер API» в разделе «API Google Apps»:

А затем включить API Диска Google.

Далее, в «Учетные данные» и на вкладку «Окно запроса доступа OAuth». Заполнить «Имя продукта, показанное пользователям» и сохранить его. Там множество дополнительных полей, но их можно оставить пустыми, потому что к проблеме резервного копирования они не имеют никакого отношения.

Затем возврат в учетные данные и жамк на кнопку «Создать учетные данные», при этом нужно выбирать «Идентификатор клиента OAuth».

Выбрать «Веб-приложение» и задать ему имя.

Введите «Разрешенные URI перенаправления», желательно на тестовый URL и URL продукта ( https://site.ru ), хотя можно позже создать ключ продукта.

Нужно временно добавить адрес в https://developers.google.com/oauthplayground , потому что это нужно будет использовать на следующем шаге.

Нажать «Создать» и не упустить из внимания правильный идентификатор клиента и секретный код клиента.

Возврат на страницу https://developers.google.com/oauthplayground .

Здесь можно убедитесь, что  нужный URL  добавлен в Авторизованные URI перенаправления на предыдущем шаге.

В правом верхнем углу - значок настроек, где необходимо установить флажок «Использовать собственные учетные данные OAuth» и вставите идентификатор клиента и секретный код клиента.

На шаге 1 слева: перейти к «Drive API v3», развернуть его и активировать инструменты.

Ну а затем, - нажать «Авторизовать API» и разрешить доступ к учетной записи при появлении запроса.

На шаге 2, - установить флажок «Автоматическое обновление токена до истечения срока его действия» и нажать «Код авторизации Exchange для токенов».

На шаге 3, снова нажать как на шаге 2, и должен появиться токен обновления.

Этот токен обновления нужно добавить в файл .env в: GOOGLE_DRIVE_REFRESH_TOKEN

Получение идентификатора папки в Google Drive

Если необходимо хранить файлы в корневом каталоге Google Drive, то идентификатор папки может быть null. Просто в Google Drive нужно создать соответствующую папку.

Из-за того, что Google Drive позволяет дублировать имена, то он идентифицирует каждый файл и папку с уникальным идентификатором. Если открыть папку, то идентификатор папки виден в URL-адресе.

Этот идентификатор можно добавить в  .ENV-файл в переменной GOOGLE_DRIVE_FOLDER_ID . Как уже говорилось, если не вводить идентификатор, то всё будет размещаться в корне.

Проверка настройки

Теперь стоит проверить, действительно ли всё работает, как положено. Запустите эту команду, чтобы убедиться, что всё сработало:

backup:run --only-db

Если всё правильно настроено, то должно сработать автоматическое резервное копирование на Google Диск в сочетании с резервным пакетом из Spatie и драйвером Flysystem от Google. Это будет выглядеть так:

Разрешение возможных ошибок

В случае с ошибкой «Файл не найден», - возможно установлено имя в пустую строку внутри файла конфигурации резервной копии.

'name' => env('GOOGLE_DRIVE_FOLDER_ID', ''),

Tags: , , , ,

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*