LARAVEL BACKUP

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
                  ],
              ],
      
          ],
      
      ];