Blog / Générer une sauvegarde d’un projet Laravel sur Nextcloud
4 min - 29 Jul 2025
TL;DR: Comment créer rapidement une sauvegarde de son projet Laravel et la stocker sur Nextcloud.
Vous trouverez un projet Laravel d’exemple sur ce Github Repository. Découvrez-en plus sur Capsules, X ou Bluesky.
Il y a plusieurs mois de cela, un article du même acabit avait été rédigé, mais cette fois-là, il s’agissait d’une sauvegarde automatique sur la plateforme Dropbox.
Cependant, il y a plusieurs semaines, à la recherche d’une alternative plus adéquate du système de stockage de fichier personnel, une solution s’est présentée : Nextcloud.
Nextcloud est un logiciel libre de site d'hébergement de fichiers et une plateforme de travail collaboratif. Accessible dès le départ via WebDAV, via n'importe quel navigateur web ou via des clients spécialisés, il présente une architecture ouverte qui favorise l’extension de ses fonctionnalités.
Autrement dit, Nextcloud peut être un excellente candidat pour conserver ces sauvegardes. Cet article assume que le lecteur a accès a un instance de Nextcloud sur un serveur dédié.
Avant de transférer les sauvegardes sur Nextcloud. 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
use Illuminate\Support\Str;
return [
'backup' => [
'name' => 'capsules',
'source' => [
'files' => [
'include' => [ base_path( 'public' ), base_path( 'storage' ) ],
'exclude' => [],
'relative_path' => base_path(),
],
'databases' => [ 'sqlite' ]
],
'destination' => [
'filename_prefix' => 'backup-',
'disks' => [ 'local' ]
],
'temporary_directory' => storage_path( 'app' )
]
];
Pour lancer la sauvegarde :
php artisan backup:run
Starting backup...
Dumping database /nextcloud/database/database.sqlite...
Determining files to backup...
Zipping 37 files and directories...
Created zip containing 37 files and directories. Size is 32.11 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
.
storage
> app
> private
> capsules
- backup-2025-07-25-14-15-41.zip
- backup-2025-07-25-14-15-51.zip
...
La procédure de sauvegarde étant opérationnelle. Il faut maintenant l’associer à son compte Nextcloud. Nextcloud utilisant l’extension de protocol WebDAV, un package de la PHP League est nécessaire : flysystem-webdav
. Comme son nom l’indique, il s’agit de l’adaptateur Flysystem pour le protocol WebDAV :
composer require league/flysystem-webdav
Une nouvelle configuration doit être ajoutée au fichier de configuration filesystems
.
config/filesystems.php
<?php
return [
'disks' => [
'nextcloud' => [
'driver' => 'nextcloud',
'url' => env( 'NEXTCLOUD_URL' ),
'prefix' => env( 'NEXTCLOUD_PREFIX' ),
'username' => env( 'NEXTCLOUD_USERNAME' ),
'password' => env( 'NEXTCLOUD_PASSWORD' ),
'auth' => 1
],
...
]
];
Il faut aussi associer Laravel Backup
au nouveau disque nextcloud
. Profitant de cette occasion pour modifier certaines valeurs additionnelles.
config/backup.php
<?php
return [
'backup' => [
...
'name' => env( 'NEXTCLOUD_APP_NAME', '' ),
...
'destination' => [
...
'filename_prefix' => Str::replace( '.', '-', env( 'NEXTCLOUD_APP_NAME' ) ) . '-',
'disks' => [ 'nextcloud' ]
],
...
]
];
Et injecter les variables d’environnement au fichier .env.example
et .env
.
.env.example
NEXTCLOUD_URL=
NEXTCLOUD_USERNAME=
NEXTCLOUD_PASSWORD=
NEXTCLOUD_APP_NAME=Article
NEXTCLOUD_PREFIX=/cloud/remote.php/dav/files/${NEXTCLOUD_USERNAME}/
cloud
. En temps normal, l’accès se fait via remote.php/dav/files/${NEXTCLOUD_USERNAME}
.Pour s’assurer que les informations d’identification soient corrects et que Nextcloud est accessible, deux lignes de codes peuvent être tapées dans Laravel tinker via php artisan tinker
:
> $config = Config::get("filesystems.disks.nextcloud");
= [
"driver" => "nextcloud",
"url" => "<https://capsules.codes>",
"prefix" => "/cloud/remote.php/dav/files/username@capsules.codes/Applications/",
"username" => "username@capsules.codes",
"password" => "password",
"auth" => 1,
]
> Process::run('curl -s -o /dev/null -w "%{http_code}" -u ' . $config["username"] . ':' . $config["password"] . ' -X PROPFIND "' . $config["url"] . $config["prefix"] . '" -H "Depth: 1"');
= Illuminate\Process\ProcessResult {#5355
output: "207",
errorOutput: "",
exitCode: 0,
successful: true,
}
La dernière étape sera de créer le fournisseur de service qui établira la connection vers le service dropbox : NextcloudServiceProvider
.
app\Providers\NextcloudServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Storage;
use Illuminate\Contracts\Foundation\Application;
use Sabre\DAV\Client;
use League\Flysystem\WebDAV\WebDAVAdapter;
use Illuminate\Filesystem\FilesystemAdapter;
use League\Flysystem\Filesystem;
class NextcloudServiceProvider extends ServiceProvider
{
public function boot(): void
{
Storage::extend( 'nextcloud', function( Application $app, array $config )
{
$client = new Client( [ 'baseUri' => $config[ 'url' ], 'userName' => $config[ 'username' ], 'password' => $config[ 'password' ], 'authType' => $config[ 'auth' ] ] );
$adapter = new WebDAVAdapter( $client, $config[ 'prefix' ] );
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\AppServiceProvider::class,
App\Providers\NextcloudServiceProvider::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.> php artisan backup:run
Starting backup...
Dumping database /capsulescodes/database/database.sqlite...
Determining files to backup...
Zipping 27 files and directories...
Created zip containing 27 files and directories. Size is 23.99 KB
Copying zip to disk named nextcloud...
Successfully copied zip to disk named nextcloud.
Backup completed!
> php artisan backup:clean
Starting cleanup...
Cleaning backups of Article on disk nextcloud...
Used storage after cleanup: 23.99 KB.
Cleanup completed!
Ravi d’avoir pu aider !