How to Backup Laravel application with Database

In today’s article, we will know about a very interesting and very useful package, which is known as Laravel Backup. using this package we easily backup our MySQL database with a complete Laravel application with all the files and folders It will be saved as a ZIP file.

You can change the format using the config file. If something wrong with our application we can use this Backup.

First, what we’re doing here, This is the example :

backup laravel application with database

laravel zip backup using package

create database backup in laravel

Backup Laravel application with Database using – Spatie Laravel Backup

This Laravel package creates a backup of your application, The backup is a zip file that contains all files in the directories you specify along with a dump of your database, The backup can be stored on any of the filesystems you have configured, The package can also notify you via Mail, Slack, or any notification provider when something goes wrong with your backups.

Requirements Of Spatie Laravel Backup Package

This backup package requires PHP 8.0, with the ZIP module and Laravel 8.0 or higher. It’s not compatible with Windows servers, If you are using an older version of Laravel, take a look at one of the previous versions of this package, Once installed, making a backup of your files and databases is very easy. Just run this artisan command:

php artisan backup:run
  • The package needs free disk space where it can create backups, Ensure that you have at least as much free space as the total size of the files you want to backup.
  • mysqldump is installed on your system if you want to backup MySQL databases.
  • pg_dump is installed on your system if you want to backup PostgreSQL databases.
  • mongodump is installed on your system if you want to backup Mongo databases.

Laravel Backup Documentation: Laravel-backup.

So, let’s see how to use it to follow some basic instructions:

Installation and setup

You can install this package via composer using:

composer require spatie/laravel-backup

The package will automatically register its service provider.

To publish the config file to config/backup.php run:

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

Configure your Email and other communication channels:

config\backup.php

<?php
return [
    'backup' => [
        /*
         * The name of this application. You can use this name to monitor
         * the backups.
         */
        'name' => env('APP_NAME', 'laravel-backup'),
        'source' => [
            'files' => [
                /*
                 * The list of directories and files that will be included in the backup.
                 */
                'include' => [
                    base_path(),
                ],
                /*
                 * These directories and files will be excluded from the backup.
                 *
                 * Directories used by the backup process will automatically be excluded.
                 */
                'exclude' => [
                    base_path('vendor'),
                    base_path('node_modules'),
                ],
                /*
                 * Determines if symlinks should be followed.
                 */
                'follow_links' => false,
                /*
                 * Determines if it should avoid unreadable folders.
                x */
                'ignore_unreadable_directories' => false,
                /*
                 * This path is used to make directories in resulting zip-file relative
                 * Set to `null` to include complete absolute path
                 * Example: base_path()
                 */
                'relative_path' =>  base_path(),
            ],
            /*
             * The names of the connections to the databases that should be backed up
             * MySQL, PostgreSQL, SQLite and Mongo databases are supported.
             *
             * The content of the database dump may be customized for each connection
             * by adding a 'dump' key to the connection settings in config/database.php.
             * E.g.
             * 'mysql' => [
             *       ...
             *      'dump' => [
             *           'excludeTables' => [
             *                'table_to_exclude_from_backup',
             *                'another_table_to_exclude'
             *            ]
             *       ],
             * ],
             *
             * If you are using only InnoDB tables on a MySQL server, you can
             * also supply the useSingleTransaction option to avoid table locking.
             *
             * E.g.
             * 'mysql' => [
             *       ...
             *      'dump' => [
             *           'useSingleTransaction' => true,
             *       ],
             * ],
             *
             * For a complete list of available customization options, see https://github.com/spatie/db-dumper
             */
            'databases' => [
                'mysql',
            ],
        ],
        /*
         * The database dump can be compressed to decrease diskspace usage.
         *
         * Out of the box Laravel-backup supplies
         * Spatie\DbDumper\Compressors\GzipCompressor::class.
         *
         * You can also create custom compressor. More info on that here:
         * https://github.com/spatie/db-dumper#using-compression
         *
         * If you do not want any compressor at all, set it to null.
         */
        'database_dump_compressor' => null,
        /*
         * The file extension used for the database dump files.
         *
         * If not specified, the file extension will be .archive for MongoDB and .sql for all other databases
         * The file extension should be specified without a leading .
         */
        'database_dump_file_extension' => '',
        'destination' => [
            /*
             * The filename prefix used for the backup zip file.
             */
            'filename_prefix' => '',
            /*
             * The disk names on which the backups will be stored.
             */
            'disks' => [
                'local',
            ],
        ],
        /*
         * The directory where the temporary files will be stored.
         */
        'temporary_directory' => storage_path('app/backup-temp'),
        /*
         * The password to be used for archive encryption.
         * Set to `null` to disable encryption.
         */
        'password' => env('BACKUP_ARCHIVE_PASSWORD'),
        /*
         * The encryption algorithm to be used for archive encryption.
         * You can set it to `null` or `false` to disable encryption.
         *
         * When set to 'default', we'll use ZipArchive::EM_AES_256 if it is
         * available on your system.
         */
        'encryption' => 'default',
    ],
    /*
     * You can get notified when specific events occur. Out of the box you can use 'mail' and 'slack'.
     * For Slack you need to install laravel/slack-notification-channel.
     *
     * You can also use your own notification classes, just make sure the class is named after one of
     * the `Spatie\Backup\Events` classes.
     */
    'notifications' => [
        'notifications' => [
            \Spatie\Backup\Notifications\Notifications\BackupHasFailedNotification::class => ['slack'],
            \Spatie\Backup\Notifications\Notifications\UnhealthyBackupWasFoundNotification::class => ['slack'],
            \Spatie\Backup\Notifications\Notifications\CleanupHasFailedNotification::class => ['slack'],
            \Spatie\Backup\Notifications\Notifications\BackupWasSuccessfulNotification::class => ['slack'],
            \Spatie\Backup\Notifications\Notifications\HealthyBackupWasFoundNotification::class => ['slack'],
            \Spatie\Backup\Notifications\Notifications\CleanupWasSuccessfulNotification::class => ['slack'],  
        ],
        /*
         * Here you can specify the notifiable to which the notifications should be sent. The default
         * notifiable will use the variables specified in this config file.
         */
        'notifiable' => \Spatie\Backup\Notifications\Notifiable::class,
        'mail' => [
            'to' => '',
            'from' => [
                'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
                'name' => env('MAIL_FROM_NAME', 'Example'),
            ],
        ],
        'slack' => [
            'webhook_url' => env('LOG_SLACK_WEBHOOK_URL',''),
            /*
             * If this is set to null the default channel of the webhook will be used.
             */
            'channel' => null,
            'username' => null,
            'icon' => null,
        ],
        'discord' => [
            'webhook_url' => '',
            'username' => null,
            'avatar_url' => null,
        ],
    ],
    /*
     * Here you can specify which backups should be monitored.
     * If a backup does not meet the specified requirements the
     * UnHealthyBackupWasFound event will be fired.
     */
    'monitor_backups' => [
        [
            'name' => env('APP_NAME', 'laravel-backup'),
            'disks' => ['local'],
            'health_checks' => [
                \Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumAgeInDays::class => 1,
                \Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumStorageInMegabytes::class => 5000,
            ],
        ],
        /*
        [
            'name' => 'name of the second app',
            'disks' => ['local', 's3'],
            'health_checks' => [
                \Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumAgeInDays::class => 1,
                \Spatie\Backup\Tasks\Monitor\HealthChecks\MaximumStorageInMegabytes::class => 5000,
            ],
        ],
        */
    ],
    'cleanup' => [
        /*
         * The strategy that will be used to cleanup old backups. The default strategy
         * will keep all backups for a certain amount of days. After that period only
         * a daily backup will be kept. After that period only weekly backups will
         * be kept and so on.
         *
         * No matter how you configure it the default strategy will never
         * delete the newest backup.
         */
        'strategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class,
        'default_strategy' => [
            /*
             * The number of days for which backups must be kept.
             */
            'keep_all_backups_for_days' => 7,
            /*
             * The number of days for which daily backups must be kept.
             */
            'keep_daily_backups_for_days' => 16,
            /*
             * The number of weeks for which one weekly backup must be kept.
             */
            'keep_weekly_backups_for_weeks' => 8,
            /*
             * The number of months for which one monthly backup must be kept.
             */
            'keep_monthly_backups_for_months' => 4,
            /*
             * The number of years for which one yearly backup must be kept.
             */
            'keep_yearly_backups_for_years' => 2,
            /*
             * After cleaning up the backups remove the oldest backup until
             * this amount of megabytes has been reached.
             */
            'delete_oldest_backups_when_using_more_megabytes_than' => 5000,
        ],
    ],
];

Configuring the backup disk

By default, the backup will be saved into the public/laravel-backup/ directory of your laravel application. This folder most probably is configured to be public. We recommend that you create a disk named backups (you can use any name you prefer) in filesystems.php and specify that name in the disk key of the backup.php config file.

Set the application name from the .env file, this package will store your backup using your application name on the folder.

.env

APP_NAME=8bityard
APP_ENV=local
APP_KEY=base64:NcPMVYO3hmgBWLuMftgLgpD5e08L2t5BcHsdJsudMI=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel8
DB_USERNAME=root
DB_PASSWORD=

That’s it now, create your Backup using the given below command.

php artisan backup:run

Note: Sometimes you get ‘mysqldump’ is not recognized as an internal or external command error, this is a common error.
To solve this error please update your system environment variable path: Link.

'mysqldump' is not recognized as an internal or external command

Follow this article: FIX: MySQL is not recognized as an internal or external command, operable program, or batch file.

generate backup using package in laravel

Backup Storage Folder (storage\app\yourbackupfoldername)

backup store in storage folder laravel

backup store in folder laravel

Backup With ZIP File

backup with zip file

Extract Backup

extract backup

successfully extract backup

Database Backup

database dump sql

MySQL database backup laravel

The package can also clean up old backups, monitor the health of the backups, and show an overview of all backups.

Clean up your backups by running:

Over time the number of backups and the storage required to store them will grow. At some point, you will want to clean up old backups.

Check your backups by running:

php artisan backup:list
php artisan backup:clean

Monitor your backups by running:

php artisan backup:monitor

Automatically run Backup using Scheduler

We don’t want to run these backup commands manually, we need to add this to the Scheduler, and register it on the kernel.php file, you can customize it at your own convenience.

The commands can be scheduled in Laravel’s console kernel, just like any other command.

app\Console\Kernel.php

protected function schedule(Schedule $schedule)
{
   $schedule->command('backup:clean')->daily()->at('01:00');
   $schedule->command('backup:run')->daily()->at('01:30');
}

If you don’t know how the scheduler works,

Follow this article: How to set up Task Scheduling with Cron job in Laravel.

In this article, we learned “how to backup laravel 8 app with a database connection”, I hope this article will help you with your Laravel application Projects.

Read also : What are stubs in Laravel?

Hi, My name is Gaurav Pandey. I'm a Laravel developer, owner of 8Bityard. I live in Uttarakhand - India and I love to write tutorials and tips that can help other developers. I am a big fan of PHP, Javascript, JQuery, Laravel, WordPress. connect@8bityard.com

Scroll to Top