Backups
BackupManager creates database dumps (mysqldump) and uploads archives (tar.gz). Backups can be stored locally or on S3, and optionally encrypted with Laravel's Crypt. Restore uses prepareBackupForRestore to download/decrypt before applying.
Flow
flowchart LR
subgraph create [Create]
DB[backupDatabase]
UP[backupUploads]
DB --> process
UP --> process
process[processBackup]
process --> store[(local or S3)]
end
subgraph restore [Restore]
get[prepareBackupForRestore]
get --> mysql[mysql restore]
get --> tar[tar extract]
end
Types
- Database —
mysqldumptostorage/app/backups/{slug}/db_{timestamp}_{token}.sql. ThenprocessBackup(): optional encrypt, optional upload to S3 (pathbackups/{slug}/db/...). - Uploads —
tar -czfof{site_root}/wp-content/uploads. Same processing: encrypt, S3.
Key file
app/Services/Backups/BackupManager.php
backupDatabase(Site),backupUploads(Site)— Create backup, optionally verifyrestoreDatabase(Site, Backup),restoreUploads(Site, Backup)— Restore from Backup modelprocessBackup()— Encrypt if enabled, upload to S3 ifstorage_disk === 's3'prepareBackupForRestore(Backup)— Download from S3 if needed, decrypt if needed, return local pathverifyBackup(Backup)— Check file exists and decrypt works; setsverifiedon Backup
Scheduling
In routes/console.php:
wphoster:run-backups db— daily at 02:00wphoster:run-backups uploads— daily at 03:00wphoster:purge-expired-backups— daily at 04:00
Config
| Key | Purpose |
|---|---|
wphoster.backups.retention_days | How long to keep backups (default 14) |
wphoster.backups.storage_disk | local or s3 |
wphoster.backups.encrypt | Encrypt backup content with Laravel Crypt |
wphoster.backups.verify_after_backup | Run verify after each backup |
Restore snippet
// Database: prepare path (download/decrypt), then mysql
$restorePath = $this->prepareBackupForRestore($backup);
$this->runner->run(['bash', '-c', "mysql ... < " . escapeshellarg($restorePath)], null, ['MYSQL_PWD' => $password]);
// Uploads: tar -xzf into wp-content/uploads
$this->runner->run(['tar', '-xzf', $restorePath, '-C', $uploadsPath]);