Blog / Générer une sauvegarde d’un projet Laravel sur Dropbox
5 min - 30 Oct 2024
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 Capsules, X 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' ]
],
...
]
];
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 :
Create app
Scoped access
App folder
Capsules Codes Article
Submit
B. Autoriser l’accès :
Capsules Codes Article
en modifiant <YOUR_APP_KEY>
de l’url.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 :
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();
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 !