diff --git a/config/backup.php b/config/backup.php new file mode 100644 index 0000000..add6945 --- /dev/null +++ b/config/backup.php @@ -0,0 +1,8 @@ + '0 3 * * *', + 'local_path' => '/var/backups/mailwolt', + 'compression' => 'zstd', + 'retention' => '7', +]; diff --git a/database/seeders/SystemBackupSeeder.php b/database/seeders/SystemBackupSeeder.php index d5e9a30..ccbcc57 100644 --- a/database/seeders/SystemBackupSeeder.php +++ b/database/seeders/SystemBackupSeeder.php @@ -9,63 +9,50 @@ use App\Models\BackupPolicy; class SystemBackupSeeder extends Seeder { - /** - * Mappe einfache Intervalle auf Cron (Fallback, falls kein explizites Cron gesetzt ist) - */ - protected function intervalToCron(string $interval): string - { - return match (Str::lower($interval)) { - 'daily' => '0 3 * * *', // täglich 03:00 - 'weekly' => '0 3 * * 0', // sonntags 03:00 - 'monthly' => '0 3 1 * *', // am 1. 03:00 - default => '0 3 * * *', - }; - } - public function run(): void { - // --- Basiskonfiguration aus .env (kannst du im Installer befüllen) - $enabled = (bool) env('BACKUP_ENABLED', false); - $interval = (string) env('BACKUP_INTERVAL', 'daily'); - $cron = (string) (env('BACKUP_DEFAULT_CRON') ?: $this->intervalToCron($interval)); + // Defaults kommen jetzt aus config/backup.php + $enabled = false; // UI schaltet das später; Standard: aus + $cron = (string) config('backup.default_cron', '0 3 * * *'); + $targetType = 'local'; + $targetPath = (string) config('backup.local_path', '/var/backups/mailwolt'); + $retentionCount = (int) config('backup.retention', 7); - $targetType = (string) env('BACKUP_TARGET_TYPE', 'local'); // local|s3 - $targetPath = (string) env('BACKUP_DIR', '/var/backups/mailwolt'); - $retentionCount = (int) env('BACKUP_RETENTION_COUNT', 7); + // Falls du optional per ENV überschreiben willst (nicht nötig, aber möglich): + $cron = env('BACKUP_DEFAULT_CRON', $cron); + $targetPath = env('BACKUP_DIR', $targetPath); + $retentionCount = (int) env('BACKUP_RETENTION_COUNT', $retentionCount); + $targetType = Str::lower(env('BACKUP_TARGET_TYPE', $targetType)) === 's3' ? 's3' : 'local'; - // --- optionale S3/MinIO-Angaben + // optionale S3/MinIO-Parameter (nur wenn target_type = s3) $s3Bucket = env('BACKUP_S3_BUCKET'); $s3Region = env('BACKUP_S3_REGION'); $s3Endpoint = env('BACKUP_S3_ENDPOINT'); $s3Key = env('BACKUP_S3_KEY'); $s3Secret = env('BACKUP_S3_SECRET'); - // Bestehende „Standard“-Policy aktualisieren oder anlegen $policy = BackupPolicy::query()->firstOrCreate( ['name' => 'Standard'], - ['enabled' => false] // wird unten überschrieben; sorgt nur für Existenz + ['enabled' => false] ); $payload = [ 'enabled' => $enabled, 'schedule_cron' => $cron, - 'target_type' => $targetType, // 'local' oder 's3' - 'target_path' => $targetPath, // bei local: Verzeichnis + 'target_type' => $targetType, // 'local' | 's3' + 'target_path' => $targetPath, // bei local: Verzeichnis 'retention_count' => $retentionCount, ]; - // S3-Felder nur setzen, wenn Ziel = s3 - if (Str::lower($targetType) === 's3') { + if ($targetType === 's3') { $payload = array_merge($payload, [ 's3_bucket' => $s3Bucket, 's3_region' => $s3Region, 's3_endpoint' => $s3Endpoint, - // Schlüssel nur speichern, wenn vorhanden – verschlüsselt 's3_key_enc' => $s3Key ? Crypt::encryptString($s3Key) : $policy->s3_key_enc, 's3_secret_enc' => $s3Secret ? Crypt::encryptString($s3Secret) : $policy->s3_secret_enc, ]); } else { - // lokales Ziel: S3-Felder leeren $payload = array_merge($payload, [ 's3_bucket' => null, 's3_region' => null,