Blog / Générer une sauvegarde d’un projet Laravel sur Dropbox

Image used for article Générer une sauvegarde d’un projet Laravel sur Dropbox

Générer une sauvegarde d’un projet Laravel sur Dropbox




TL;DR: Comment créer rapidement une sauvegarde de son projet Laravel et la stocker sur Dropbox en utilisant les packages Spatie Laravel-backup and Flysystem-dropbox.




Vous trouverez un projet Laravel d’exemple sur ce Github Repository. Découvrez-en plus sur CapsulesX ou Bluesky.




Dans la gestion d’un projet web, effectuer des sauvegardes régulières est crucial pour éviter les pertes de données définitives. Différents types de donnée nécessitent une sauvegardés, comme les bases de données, les fichiers générés par les utilisateurs et ceux directement liés au projet web en lui-même.




Les fichiers de projet sont souvent déjà gérés par un système de contrôle de version tel que Github ou Gitlab. Il n’est cependant pas du tout recommandé d’y stocker de données utilisateur. Dropbox peut être un excellente candidat pour conserver ces données.




Avant de transférer les sauvegardes sur Dropbox. Il serait utile de d’abord les générer. Le package laravel-backup de Spatie simplifie grandement cette tâche. La commande suivante permet de l’installer :


composer require spatie/laravel-backup




Il suffit ensuite de créer le fichier de configuration backup pour configurer rapidement la sauvegarde du projet :



config/backup.php


<?php

return [

    'backup' => [

        'name' => 'capsules',

        'source' => [

            'files' => [

                'include' => [ base_path() ],

                'exclude' => [ base_path( 'vendor' ), base_path( 'node_modules' ) ],

                'relative_path' => null
            ],

            'databases' => [ 'sqlite' ]
        ],

        'database_dump_filename_base' => 'database',

        'database_dump_file_extension' => '',

        'destination' => [

            'compression_method' => ZipArchive::CM_DEFAULT,

            'compression_level' => 9,

            'filename_prefix' => "backup-",

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

        'temporary_directory' => '',

        'password' => null,

        'encryption' => 'default',

        'tries' => 1,

        'retry_delay' => 0,
    ]
];




Pour lancer la sauvegarde :


php artisan backup:run
Starting backup...
Dumping database /dropbox/database/database.sqlite...
Determining files to backup...
Zipping 110 files and directories...
Created zip containing 110 files and directories. Size is 112.76 KB
Copying zip to disk named local...
Successfully copied zip to disk named local.
Backup completed!




La commande php artisan backup:run crée une sauvegarde compressée contenant ce qui est indiqué dans la clef include tout en excluant les elements de la clé exclude. En ajoutant les databases et en stockant le tout dans le dossier indiqué à la clé name en nommant le fichier via le préfixe filename_prefix suivi de la date de sauvegarde au format YYYY-MM-DD-HH-mm-ss. Et cela, à l’emplacement disque décrit à la clé disks, ici local qui redirige vers storage/app/private.



Les éléments de configuration additionnels, qui ne sont pas cités ici, sont néanmoins indispensable au bon fonctionnement du package.


storage
	> app
		> private 
			> capsules
				- backup-2024-10-29-08-30-00.zip
				- backup-2024-10-28-08-30-00.zip
				...	




La procédure de sauvegarde étant opérationnelle. Il faut maintenant l’associer à son compte Dropbox. Et c’est encore vers Spatie qu’il faut se tourner : flysystem-dropbox . Comme son nom l’indique, il s’agit de l’adaptateur Flysystem pour l’API Dropbox V2 :


composer require spatie/flysystem-dropbox




Une nouvelle configuration doit être ajoutée au fichier de configuration filesystems.



config/filesystems.php


<?php

return [

    'disks' => [

        ...

	    'dropbox' => [
			  
            'driver' => 'dropbox',
            'token_url' => env( 'DROPBOX_TOKEN_URL' ),
            'refresh_token' => env( 'DROPBOX_REFRESH_TOKEN' )
            
        ]
    ]
];     




Il faut aussi associer Laravel Backup au nouveau disque dropbox. Profitant de cette occasion pour modifier certaines valeurs additionnelles.


<?php

return [

    'backup' => [

		...

        'name' => '',

		...

        'destination' => [

			...

            'filename_prefix' => Illuminate\Support\Str::replace( '.', '-', env( 'DROPBOX_APP_NAME' ) ) . '-',

            'disks' => [ 'dropbox' ]
        ],

		...
    ]
];
  • La clé name reste vide pour éviter un double emploi de nom avec l’application Dropbox, et le filename_prefix utilise la variable d’environnement DROPBOX_APP_NAME au lieu de backup-.




Il faut maintenant configurer la partie Dropbox. Les étapes suivantes détaillent la configuration de Dropbox. Attention, la complexité de certaines étapes a parfois été exagérée.




A. Créer une Application Dropbox :


  1. Aller sur : https://www.dropbox.com/developers/apps
  2. Cliquer sur Create app
  3. Choisir une API : Scoped access
  4. Choisir le type d’accès désiré : App folder
  5. Nommer l’app : Capsules Codes Article
  6. Aller dans l’onglet Permissions et cocher les cases : [ files.metadata.write, files.metadata.read, files.content.write, files.content.read ]
  7. Cliquer sur Submit




B. Autoriser l’accès :


  1. Autoriser l’accès à l’app Capsules Codes Article en modifiant <YOUR_APP_KEY> de l’url.
  2. Continuer et Autoriser


https://www.dropbox.com/oauth2/authorize?client_id=<YOUR_APP_KEY>&response_type=code&token_access_type=offline




C. Générer le token indispensable :


  1. Accéder au refresh_token en modifiant <ACCESS_CODE> avec le code d’accès précédemment généré ainsi que le <APP_KEY> et le <APP_SECRET> disponible dans les paramètres de l’app nouvellement créée :


curl https://api.dropbox.com/oauth2/token -d code=<ACCESS_CODE> -d grant_type=authorization_code -u <APP_KEY>:<APP_SECRET>




Une réponse au format suivant s’affichera et un dossier apparaîtra dans l’interface Dropbox :


{"access_token": "sl.B48oJpRyl-FP61gr56g1GUa4G26L3TAQasMbiRRyuAGHpUQXz0hyeA4OrO8Zes6clhQxhA8dyFurNcx4_gwPXJb_K3ZZOfdzBIVwHieInx-EEFNgIc6ZOR3VMRjoOQ-Ske_QjGMePmzS", "token_type": "bearer", "expires_in": 14399, "refresh_token": "PKnAG5FX-ngAAAAAAAAAAVaXknd9i45Xk6t4-FrmXGjR4jWEljmBALOF3Xexp4AY", "scope": "account_info.read files.content.read files.content.write files.metadata.read files.metadata.write", "uid": "682879329", "account_id": "dbid:AADQ-j2-ihak-i0IwMiVS8F5-KhkcyTHyg8"}




Le refresh_token est à intégrer aux variables d’environnement de l’application. En plus de l’ app_key ainsi que de l’ app_secret, situé dans les paramètres de l’application Dropbox nouvellement créée. Ceux-ci peuvent alors être ajoutés au fichier .env :



.env.example


DROPBOX_APP_NAME="Capsules Codes Article"
DROPBOX_APP_KEY=
DROPBOX_APP_SECRET=
DROPBOX_REFRESH_TOKEN=
DROPBOX_TOKEN_URL=https://${DROPBOX_APP_KEY}:${DROPBOX_APP_SECRET}@api.dropbox.com/oauth2/token




La dernière étape sera de créer le fournisseur de service qui établira la connection vers le service dropbox : DropboxServiceProvider.



app\Providers\DropboxServiceProvider.php


<?php

namespace App\Providers;

use Illuminate\Contracts\Foundation\Application;
use Illuminate\Filesystem\FilesystemAdapter;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\ServiceProvider;
use League\Flysystem\Filesystem;
use Spatie\Dropbox\Client as DropboxClient;
use Spatie\FlysystemDropbox\DropboxAdapter;
use GuzzleHttp\Client;

class DropboxServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        Storage::extend( 'dropbox', function( Application $app, array $config )
        {
            $resource = ( new Client() )->post( $config[ 'token_url' ] , [ 'form_params' => [ 'grant_type' => 'refresh_token', 'refresh_token' => $config[ 'refresh_token' ] ] ]);

            $accessToken = json_decode( $resource->getBody(), true )[ 'access_token' ];

            $adapter = new DropboxAdapter( new DropboxClient( $accessToken ) );

            return new FilesystemAdapter( new Filesystem( $adapter, $config ), $adapter, $config );
        });
    }
}




Ne pas oublier de l’ajouter aux fournisseurs providers.php.



bootstrap/providers.php


<?php

return [ App\Providers\DropboxServiceProvider::class ];




Il ne manque plus que les commandes de planification de sauvegarde journalière dans le fichier console.php



routes/console.php


<?php

use Illuminate\Support\Facades\Schedule;

Schedule::command( 'backup:run' )->daily();
Schedule::command( 'backup:clean' )->daily();
  • Ce code permet de lancer les différentes commandes un fois par jour via la méthode daily si tant est qu’un Scheduler ait été configuré pour l’application. Sans cette commande journalière, le refresh_token périmera.




> php artisan backup:run

Starting backup...
Dumping database /dropbox/database/database.sqlite...
Determining files to backup...
Zipping 35 files and directories...
Created zip containing 35 files and directories. Size is 36.74 KB
Copying zip to disk named dropbox...
Successfully copied zip to disk named dropbox.
Backup completed!







> php artisan backup:clean

Starting cleanup...
Cleaning backups of  on disk dropbox...
Used storage after cleanup: 36.74 KB.
Cleanup completed!




Ravi d’avoir pu aider !

v1.4.0

Icône XIcône Github