spatie/laravel-backup
Create a zip backup of your Laravel app's files and database, store it on any configured filesystem or multiple at once, monitor backup health, get notified when problems arise, and automatically clean up old backups. Run php artisan backup:run.
Build vs. buy on a non-differentiating capability. Backup is table stakes, not a competitive advantage. This package compresses what would be a multi-sprint build (zip archive assembly, DB dumping per driver, retention, notifications, health checks) into roughly a day of configuration. Approving it is a "buy" decision with zero licensing cost and no vendor lock-in — MIT, self-hosted, plain Laravel filesystem abstraction.
Whether we can commit to a disaster-recovery promise. This is the package's real strategic value: it turns an implicit "the DB provider backs things up" assumption into an explicit, auditable, application-level control. That directly supports sales conversations around SOC 2 / ISO 27001 readiness, enterprise security questionnaires, and any customer asking "what happens to our data if your app corrupts it?"
Roadmap prioritization for reliability work. The included monitor (php artisan backup:monitor), multi-channel notifications (including a generic webhook channel added in v10), and log_channel config mean "we don't know if backups are actually running" becomes a solved problem rather than an open epic. It lets us schedule reliability work without funding a reliability team.
Feature-level decisions it unblocks or constrains:
continue_on_failure and per-destination writes let us promise "backed up to S3 and off-site" as a plan-tier or compliance feature rather than a single point of failure.backup:clean with configurable cleanup strategies makes storage cost a tunable, which matters at scale and on per-tenant plans.wnx/laravel-backup-restore). A backup feature whose restore path is unowned is an incident waiting to happen; budget restoration as a distinct workstream, not a checkbox.Use cases worth writing down: pre-deploy/pre-migration snapshots, tenant-level exports and GDPR data portability requests, staging refreshes (with PII masking), and "customer deleted their data" recovery.
Adopt when:
Look elsewhere when:
verify_backup compares archive file counts against the manifest to catch truncation) but restoration is not.Maturity signal: ~6k stars, documented, versioned changelog, active releases, and a maintainer (Spatie) with a long track record. The changelog reads like a healthy project — v10 shipped verification, resilient multi-destination, webhook notifications, and --config runtime overrides. That's a package still investing, not coasting.
To executives — one paragraph: We have a gap in our data-protection story that customers and auditors will find: no application-level backup of our database and file storage, and no evidence that any backup would work. This package closes it at effectively zero license cost, in days rather than a quarter, and gives us scheduled backups to multiple locations, encryption at rest, automatic retention cleanup, and alerting when a backup fails. It's the cheapest credible way to answer the security questionnaire question we currently answer with a shrug. The residual work is ours: key management and a restore drill.
To engineering — the substance:
It's spatie/laravel-backup, MIT, battle-tested, ~6k stars, actively maintained, and it fits our existing stack — Laravel filesystem disks for destinations, Laravel's scheduler for cadence, Laravel notifications for alerting. Integration is config plus three scheduled commands (backup:run, backup:clean, backup:monitor). It handles the tedious parts we'd otherwise hand-roll and get subtly wrong: per-driver database dumps, zip assembly, retention strategies, health checks, and failure reporting. v10 made archives encrypted as they're built rather than rewritten, so we don't pay double I/O on large backups, and it added continue_on_failure so one dead destination doesn't void the whole run.
What we're explicitly signing up for:
storage/framework is excluded by default, which is right).The ask: approve the dependency and roughly one sprint of integration, configuration, notification wiring, and the first restore drill. Success criteria: a scheduled backup lands in two separate destinations, an intentional failure triggers an alert within one cycle, and a documented restore completes from the newest archive inside the window we've promised customers.
How can I help you explore Laravel packages today?