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

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

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




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}/
  • Le gestionnaire de fichier Nextcloud étant hébergé sur un serveur aux côtés d’autres outils Nextcloud, Il faut y accéder sur le prefix 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();
  • 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.



> 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 !

v1.5.4

Icône XIcône BlueskyIcône Github