'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)); $targetType = (string) env('BACKUP_TARGET_TYPE', 'local'); // local|s3 $targetPath = (string) env('BACKUP_DIR', '/var/backups/mailwolt'); $retentionCount = (int) env('BACKUP_RETENTION_COUNT', 7); // --- optionale S3/MinIO-Angaben $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 ); $payload = [ 'enabled' => $enabled, 'schedule_cron' => $cron, 'target_type' => $targetType, // 'local' oder 's3' 'target_path' => $targetPath, // bei local: Verzeichnis 'retention_count' => $retentionCount, ]; // S3-Felder nur setzen, wenn Ziel = s3 if (Str::lower($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, 's3_endpoint' => null, 's3_key_enc' => null, 's3_secret_enc' => null, ]); } $policy->fill($payload)->save(); } }