Laravel záloha na Google Drive

Každá webová aplikace by se měla zálohovat. V tomto článku si přehledně ukážeme, jak soubory z Laravel aplikace zálohujeme na Google Drive včetně výpisu databáze. Článek je psaný pro aktuálně nejnovější verzi Laravel 8.

Pomocí skvělého balíčku spatie/laravel-backup je integrace zálohování Laravel aplikace na Google Drive velmi jednoduchá, stačí postupovat podle následujícího návodu.

Google Developer Console

Krok 1: Vytvoření projektu

Jako první navštivte Google Developer Console a vytvořte nový projekt: enter image description here

enter image description here

enter image description here Název projektu jsem dal laravelblog, zvolit ale můžete cokoliv jiného.

Krok 2: Povolení Google Drive API

V tomto kroku navštivte Library a ve vyhledavači vyhledejte "Google Drive API". Poté knihovnu povolte: enter image description here

enter image description here

enter image description here

Krok 3: OAuth

Nyní navštivte OAuth consent screen a jako typ uživatele zvolte "External". OAuth vytvořte kliknutím na Create: enter image description here

Poté je potřeba vyplnit údaje jako App name, User support email a Email address. Jako název aplikace si můžete zvolit co chcete, v support emailu budete mít prakticky na výběr pouze aktuální google email pod kterým jste přihlášeni a nakonec developer email adresa může být opět jakákoliv: enter image description here enter image description here

Po vytvoření opět klikněte na OAuth consent screen, kde zjistíte, že Publishing status je nastaven na testování. Klikněte na Publish app a volbu potvrďte: enter image description here

Krok 4: Vytvoření credentials

Navštivte sekci Credentials, klikněte na tlačítko Create Credentials a vyberte OAuth client ID: enter image description here

Poté vyberte typ aplikace a její název. Do URI pole přidejte tuto adresu: https://developers.google.com/oauthplayground. Ta slouží pro interní přesměrování a fungování přístupu do Google Drive. enter image description here

Po vytvoření OAuth vyskočí modal s vaším Client ID a Client secret. Tyto údaje budeme ještě potřebovat, proto si tyto údaje někam bokem uložte.

OAuth Playground

Krok 1: Autorizování do Google Drive

Jděte na stránku https://developers.google.com/oauthplayground a v pravém rohu klikněte na ikonu nastavení. Zaškrtněte Use your own OAuth credentials a vložte vaše vygenerované Client ID a Client secret. enter image description here

Poté na levé straně vyhledejte Drive API v3, rozbalte jej a zaškrtněte všechny jeho položky. Poté klikněte na tlačítko Authorize APIs: enter image description here

Poté opět na levé straně přejděte (pokud se již tak nestalo) do sekce Step 2 Exchange authorization code for tokens, zaškrtněte Auto-refresh the token before it expires a klikněte na tlačítko Exchange authorization code for tokens: enter image description here

Poté vás to přesune do kroku Step 3, nicméně si rozbalte opět Step 2 (viz obrázek nahoře) a najdete zde již vygenerovaný Refresh token. Ten budeme také potřebovat, takže si ho někam uložte. enter image description here

Adresář pro zálohu v Google Drive

Tento krok je nepovinný. Pokud nenastavíme žádné ID adresáře, kam chceme zálohu uložit, pak se záloha automaticky vytvoří v kořenovém adresáři Google Drive.

Pokud bychom ale chtěli zálohu ukládat například do naší nově vytvořené složky backup, tak ID adresáře získáme z URL adresy: enter image description here

Laravel projekt

Vytvoříme si nový Laravel projekt:

composer create-project --prefer-dist laravel/laravel blog

A podle potřeby si nastavíme databázové připojení. Pro jednoduchost nebudeme databázi v našem příkladu používat.

Krok 1: Instalace spatie/laravel-backup

Jak jsem psal v úvodu, pro zálohování budeme používat balíček spatie/laravel-backup. Pomocí composeru si ho tedy nainstalujeme:

composer require spatie/laravel-backup

Balíček automaticky zaregistruje jeho service providera. Dále potřebujeme vygenerovat konfigurační soubor config/backup.php:

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

V něm uděláme následující úpravy (ostatní necháme jak je):

'backup' => [
	'name' => '',
	'source' => [
		'databases' => [],
	],
	'destination' => [
		'disks' => [
            'google',
        ],
	],
	'monitor_backups' => [
		[
			'disks' => [
            	'google',
            	'local'
            ],
		]
	],
];

Název aplikace necháme prázdný, jinak nám to bude vyhazovat chybu. Více informací k tomu můžete najít v tomto videu , kde to detailněji popisuje. Dále v databases zakomentujeme nebo odstraníme mysql, protože v našem případě nepotřebujeme zálohovat i databázi. V opačném případě tuto sekci nechte tak jak je. Protože budeme používat Google Drive, tak změníme i hodnotu v destination. Jako poslední změnu provedeme v sekci monitor_backups, kde do disks přidáme google. Celou dokumentaci s možným nastavením najdete v dokumentaci balíčku.

Krok 2: Nastavení Google Drive jako filesystem

V tomto kroku si nainstalujeme nao-pon/flysystem-google-drive, který bude sloužit jako filesystem adaptér pro Google Drive. Opět ho nainstalujeme pomocí composeru a následně si vytvoříme nový service provider pro jeho nastavení:

composer require nao-pon/flysystem-google-drive:~1.1
php artisan make:provider GoogleDriveServiceProvider

Díky tomu se nám vytvořil soubor app/Providers/GoogleDriveServiceProvider.php, kde do metody boot() vložíme toto:

    \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);
    });

Poté si náš nově vytvořený service provider zaregistrujeme v config/app.php:

'providers' => [
    // ...
    App\Providers\GoogleDriveServiceProvider::class,
];

A nakonec si přidáme náš google disk do config/filesystem.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'),
        ],
        // ...
    ],
];

Krok 3: env nastavení a spuštění zálohy

V posledním kroku nastavíme v .env souboru Client ID, Client secret, Refresh token a případně ID adresáře, kam chceme, aby se záloha vytvořila:

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

A na závěr si spustíme artisan příkaz, kterým vytvoříme zálohu:

php artisan backup:run

Starting backup...
Determining files to backup...
Zipping 201 files and directories...
Created zip containing 201 files and directories. Size is 149.42 KB
Copying zip to disk named google...
Successfully copied zip to disk named google.
Sending notification failed
Backup completed!

enter image description here