Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Backup Server Laravel Package

spatie/laravel-backup-server

Receive, store, and manage encrypted backups from multiple Laravel apps on a dedicated backup server. Built on top of spatie/laravel-backup, it centralizes backup uploads, retention, and monitoring for safer off-site storage.

View on GitHub
Deep Wiki
Context7

title: Installation & setup weight: 3

You can install this package via composer using:

composer require spatie/laravel-backup-server

Migrate the database

You need to publish and run the migrations to create the tables used by this package:

php artisan vendor:publish --provider="Spatie\BackupServer\BackupServerServiceProvider" --tag="backup-server-migrations"
php artisan migrate

Publish the config file

You must publish the config file with this command:

php artisan vendor:publish --provider="Spatie\BackupServer\BackupServerServiceProvider" --tag="backup-server-config"

This is the default content of the config file that will be published at config/backup-server.php:

return [
    /*
     * This is the date format that will be used when displaying time related information on backups.
     */
    'date_format' => 'Y-m-d H:i',
    
    'notifications' => [

        /*
         * Backup Server sends out notifications on several events. Out of the box, mails and Slack messages
         * can be sent.
         */
        'notifications' => [
            \Spatie\BackupServer\Notifications\Notifications\BackupCompletedNotification::class => ['mail'],
            \Spatie\BackupServer\Notifications\Notifications\BackupFailedNotification::class => ['mail'],

            \Spatie\BackupServer\Notifications\Notifications\CleanupForSourceCompletedNotification::class => ['mail'],
            \Spatie\BackupServer\Notifications\Notifications\CleanupForSourceFailedNotification::class => ['mail'],
            \Spatie\BackupServer\Notifications\Notifications\CleanupForDestinationCompletedNotification::class => ['mail'],
            \Spatie\BackupServer\Notifications\Notifications\CleanupForDestinationFailedNotification::class => ['mail'],

            \Spatie\BackupServer\Notifications\Notifications\HealthySourceFoundNotification::class => ['mail'],
            \Spatie\BackupServer\Notifications\Notifications\UnhealthySourceFoundNotification::class => ['mail'],
            \Spatie\BackupServer\Notifications\Notifications\HealthyDestinationFoundNotification::class => ['mail'],
            \Spatie\BackupServer\Notifications\Notifications\UnhealthyDestinationFoundNotification::class => ['mail'],
        ],

        /*
         * 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\BackupServer\Notifications\Notifiable::class,

        'mail' => [
            'to' => 'your@example.com',

            'from' => [
                'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
                'name' => env('MAIL_FROM_NAME', 'Example'),
            ],
        ],

        'slack' => [
            'webhook_url' => '',

            /*
             * If this is set to null the default channel of the web hook will be used.
             */
            'channel' => null,

            'username' => null,

            'icon' => null,

        ],
    ],

    'monitor' => [
        /*
         * These checks will be used to determine whether a source is health. The given value will be used
         * when there is no value for the check specified on either the destination or the source.
         */
        'source_health_checks' => [
            \Spatie\BackupServer\Tasks\Monitor\HealthChecks\Source\MaximumStorageInMB::class => 5000,
            \Spatie\BackupServer\Tasks\Monitor\HealthChecks\Source\MaximumAgeInDays::class => 1,
        ],

        /*
         * These checks will be used to determine whether a destination is healthy. The given value will be used
         * when there is no value for the check specified on either the destination or the source.
         */
        'destination_health_checks' => [
            \Spatie\BackupServer\Tasks\Monitor\HealthChecks\Destination\DestinationReachable::class,
            \Spatie\BackupServer\Tasks\Monitor\HealthChecks\Destination\MaximumDiskCapacityUsageInPercentage::class => 90,
            \Spatie\BackupServer\Tasks\Monitor\HealthChecks\Destination\MaximumStorageInMB::class => 0,
            \Spatie\BackupServer\Tasks\Monitor\HealthChecks\Destination\MaximumInodeUsageInPercentage::class => 90,
        ],
    ],

    /*
     * This class is responsible for deciding when sources should be backed up. An valid backup scheduler
     * is any class that implements `Spatie\BackupServer\Tasks\Backup\Support\BackupScheduler\BackupScheduler`.
     */
    'scheduler' => \Spatie\BackupServer\Tasks\Backup\Support\BackupScheduler\DefaultBackupScheduler::class,
];

Schedule the commands

You must schedule these commands in app\Console\Kernel.php:

// in app\Console\Kernel.php

protected function schedule(Schedule $schedule)
{
    $schedule->command('backup-server:dispatch-backups')->everyMinute();
    $schedule->command('backup-server:cleanup')->daily();
    $schedule->command('backup-server:monitor')->daily();
}

Configure the queues

Backup Server uses queued jobs to perform various tasks. We recommend setting up the queues. Any driver will do, just don't use the sync driver.

When you use horizon we recommend adding a separate queue connection so the retry_after can be set to a high value.

// in config/queue.php

'connections' => [
    'backup-server-redis' => [
        'driver' => 'redis',
        'connection' => 'default',
        'queue' => env('REDIS_QUEUE', 'default'),
        'retry_after' => \Carbon\CarbonInterval::day(1)->totalSeconds,
        'block_for' => null,
    ],

In the backup server configuration you must set the queue_connection to backup-server-redis.

// in config/backup-server.php

'queue_connection' => 'backup-server-redis',

In the Horizon config you can add extra configuration for backup server.

// in config/horizon.php

'environments' => [
    'production' => [
        // ..

        'backup-server' => [
            'connection' => 'backup-server-redis',
            'queue' => ['backup-server', 'backup-server-backup', 'backup-server-cleanup'],
            'balance' => 'auto',
            'processes' => 3,
            'tries' => 1,
            'timeout' => \Carbon\CarbonInterval::day()->totalSeconds,
        ],
    ],

    'local' => [
        // ...

        'backup-server' => [
            'connection' => 'backup-server-redis',
            'queue' => ['backup-server', 'backup-server-backup', 'backup-server-cleanup'],
            'balance' => 'auto',
            'processes' => 3,
            'tries' => 1,
            'timeout' => \Carbon\CarbonInterval::day()->totalSeconds,
        ],
    ],
],

Setting up block storage

Backup Server can copy the contents of several servers onto block storage. Make sure that the system where you run Backup Server on has plenty of block storage available.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
davejamesmiller/laravel-breadcrumbs
artisanry/parsedown
christhompsontldr/phpsdk
enqueue/dsn
bunny/bunny
enqueue/test
enqueue/null
enqueue/amqp-tools
milesj/emojibase
bower-asset/punycode
bower-asset/inputmask
bower-asset/jquery
bower-asset/yii2-pjax
laravel/nova
spatie/laravel-mailcoach
spatie/laravel-superseeder
laravel/liferaft
nst/json-test-suite
danielmiessler/sec-lists
jackalope/jackalope-transport