DEV Community

Gonzalo López
Gonzalo López

Posted on Originally published at blogprog.gonzalolopez.es

Laravel Backup: cómo hacer copIAs de seguridad

Laravel Backup: cómo hacer copIAs de seguridad

Laravel Backup es un paquete creado por Spatie, es uno de los equipos que más paquetes libera para Laravel) que sirve para hacer backups completos de una aplicación Laravel de forma muy sencilla. Características principales Crea un archivo .zip que incluye: Todos los archivos de las carpetas que tú configures (por ejemplo: storage/app, public, etc.). Una copia de la base de datos soporta MySQL, PostgreSQL, SQLite, MongoDB... Se pueden guardar ese zip automáticamente en cualquier disco configurado en Laravel: Local S3 (AWS) Google Cloud Storage Dropbox FTP etc. Comandos Artisan muy simples:bash php artisan backup:run Puedes programarlo fácilmente en el scheduler de Laravel para que se ejecute diariamente / semanalmente. Notificaciones (Slack, Discord, mail…) si falla el backup. Limpieza automática de backups antiguos. Instalación Para instalarlo hay que ejecutar el comando: composer require spatie/laravel-backup Publica el archivo de configuración. php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider" --tag=backup-config Esto crea "config/backup.php" donde se puede personalizar casi todo. Abrir "config/backup.php" y editar las partes clave: return [ 'backup' => [ // Nombre del backup (aparece en el .zip) 'name' => env('APP_NAME', 'mi-proyecto'), 'source' => [ 'files' => [ 'include' => [ base_path(), // todo el proyecto (cuidado con node_modules/vendor si es grande) // O más selectivo y recomendado: // storage_path('app'), public_path(), base_path('resources/views'), // etc. ], 'exclude' => [ base_path('vendor'), base_path('node_modules'), base_path('.git'), storage_path('logs'), // ... ], ], 'databases' => [ 'mysql',// nombre de la conexión en config/database.php // 'pgsql', etc. si tienes varias ], ], 'destination' => [ 'disks' => [ 'local',// por defecto guarda en storage/app/backup-temp/ // 's3',// descomenta si usas AWS S3 ], ], // Cuántos backups mantener (limpieza automática) 'cleanup' => [ 'strategy' => \Spatie\Backup\Tasks\Cleanup\Strategies\DefaultStrategy::class, 'default' => [ 'keep_all_backups_for_days' => 7, 'keep_daily_backups_for_days' => 30, 'keep_monthly_backups_for_months' => 12, 'keep_weekly_backups_for_weeks' => 52, 'delete_oldest_backups_when_using_more_than_mb' => 5000, // ~5GB ], ], ], // Notificaciones (opcional pero muy útil) 'notifications' => [ 'notifiable' => \Spatie\Backup\Notifications\Notifiable::class, 'channels' => [ 'mail' => ['admin@tuempresa.com'], // 'slack' => 'https://hooks.slack.com/...', ], ], ]; Ejemplos Hacer un backup completo ahora mismo (archivos + DB): php artisan backup:run Solo la base de datos: php artisan backup:run --only-db Solo archivos: php artisan backup:run --only-files Guardar solo en un disco específico (ej: S3): php artisan backup:run --only-to-disk=s3 Limpiar backups antiguos manualmente: php artisan backup:clean Listar backups existentes: php artisan backup:list Programar backups automáticos: Editar el fichero "app/Console/Kernel.php" y añadir en el método "schedule()": use Illuminate\Support\Facades\Schedule; protected function schedule(Schedule $schedule): void { // Backup completo cada día a las 2:00 AM $schedule->command('backup:run') ->dailyAt('02:00') ->timezone('America/Mexico_City') // o tu zona ->onOneServer()// evita duplicados en clúster ->emailOnFailure('soporte@tuempresa.com'); // Opcional: solo DB cada 6 horas (más frecuente y liviano) $schedule->command('backup:run --only-db') ->everySixHours() ->onOneServer(); } No hay que olvidar tener el cron del scheduler de Laravel corriendo:* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1 Ejemplo con S3 Configura el disco en "config/filesystems.php": 's3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 'bucket' => env('AWS_BUCKET'), 'url' => env('AWS_URL'), 'endpoint' => env('AWS_ENDPOINT'), 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), 'throw' => false, ], En .env: AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=... AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET=backups-mi-proyecto Añadir 's3' al array de disks en "config/backup.php": //Solo se muestra la parte que interesa editar del fichero config/backup.php return [ 'backup' => [ // Nombre del backup (aparece en el .zip) 'name' => env('APP_NAME', 'mi-proyecto'), 'destination' => [ 'disks' => [ 'local',// por defecto guarda en storage/app/backup-temp/ 's3',// descomenta si usas AWS S3 ], ], ], ];

Top comments (0)