Fix: Mailbox Stats über Dovecot mit config/mailpool.php

main v1.0.22
boban 2025-10-24 01:38:03 +02:00
parent 3396aab47f
commit c1ecc90ec3
2 changed files with 24 additions and 29 deletions

8
config/backup.php Normal file
View File

@ -0,0 +1,8 @@
<?php
return [
'default_cron' => '0 3 * * *',
'local_path' => '/var/backups/mailwolt',
'compression' => 'zstd',
'retention' => '7',
];

View File

@ -9,63 +9,50 @@ use App\Models\BackupPolicy;
class SystemBackupSeeder extends Seeder 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 public function run(): void
{ {
// --- Basiskonfiguration aus .env (kannst du im Installer befüllen) // Defaults kommen jetzt aus config/backup.php
$enabled = (bool) env('BACKUP_ENABLED', false); $enabled = false; // UI schaltet das später; Standard: aus
$interval = (string) env('BACKUP_INTERVAL', 'daily'); $cron = (string) config('backup.default_cron', '0 3 * * *');
$cron = (string) (env('BACKUP_DEFAULT_CRON') ?: $this->intervalToCron($interval)); $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 // Falls du optional per ENV überschreiben willst (nicht nötig, aber möglich):
$targetPath = (string) env('BACKUP_DIR', '/var/backups/mailwolt'); $cron = env('BACKUP_DEFAULT_CRON', $cron);
$retentionCount = (int) env('BACKUP_RETENTION_COUNT', 7); $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'); $s3Bucket = env('BACKUP_S3_BUCKET');
$s3Region = env('BACKUP_S3_REGION'); $s3Region = env('BACKUP_S3_REGION');
$s3Endpoint = env('BACKUP_S3_ENDPOINT'); $s3Endpoint = env('BACKUP_S3_ENDPOINT');
$s3Key = env('BACKUP_S3_KEY'); $s3Key = env('BACKUP_S3_KEY');
$s3Secret = env('BACKUP_S3_SECRET'); $s3Secret = env('BACKUP_S3_SECRET');
// Bestehende „Standard“-Policy aktualisieren oder anlegen
$policy = BackupPolicy::query()->firstOrCreate( $policy = BackupPolicy::query()->firstOrCreate(
['name' => 'Standard'], ['name' => 'Standard'],
['enabled' => false] // wird unten überschrieben; sorgt nur für Existenz ['enabled' => false]
); );
$payload = [ $payload = [
'enabled' => $enabled, 'enabled' => $enabled,
'schedule_cron' => $cron, 'schedule_cron' => $cron,
'target_type' => $targetType, // 'local' oder 's3' 'target_type' => $targetType, // 'local' | 's3'
'target_path' => $targetPath, // bei local: Verzeichnis 'target_path' => $targetPath, // bei local: Verzeichnis
'retention_count' => $retentionCount, 'retention_count' => $retentionCount,
]; ];
// S3-Felder nur setzen, wenn Ziel = s3 if ($targetType === 's3') {
if (Str::lower($targetType) === 's3') {
$payload = array_merge($payload, [ $payload = array_merge($payload, [
's3_bucket' => $s3Bucket, 's3_bucket' => $s3Bucket,
's3_region' => $s3Region, 's3_region' => $s3Region,
's3_endpoint' => $s3Endpoint, 's3_endpoint' => $s3Endpoint,
// Schlüssel nur speichern, wenn vorhanden verschlüsselt
's3_key_enc' => $s3Key ? Crypt::encryptString($s3Key) : $policy->s3_key_enc, 's3_key_enc' => $s3Key ? Crypt::encryptString($s3Key) : $policy->s3_key_enc,
's3_secret_enc' => $s3Secret ? Crypt::encryptString($s3Secret) : $policy->s3_secret_enc, 's3_secret_enc' => $s3Secret ? Crypt::encryptString($s3Secret) : $policy->s3_secret_enc,
]); ]);
} else { } else {
// lokales Ziel: S3-Felder leeren
$payload = array_merge($payload, [ $payload = array_merge($payload, [
's3_bucket' => null, 's3_bucket' => null,
's3_region' => null, 's3_region' => null,