Резервные копии БД – жизненно важны. Её данные понадобятся, как только сервер внезапно умрет или же с ним произойдёт любая другая неприятность с утратой данных.
Публикуем алгоритм настройки резервной копии с помощью 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: api, drive, google, lavarel, резервное копирование