Files
Mark Gregory 44684c93e5 Enterprise Services administration dashboard
* Database health checks
* Cache health checks
* Storage write and disk-space checks
* Failed queue job monitoring
* Production environment diagnostics
* Persisted health-check history
* Queue retry controls
* Scheduler execution controls
* Cache and optimisation clearing
* Backup creation and retention
* Backup deletion
* SQLite database backup support
* Backup manifests and module metadata
* Artisan health and backup commands
* Administration navigation
* Enterprise permissions
* Module registration and tests
2026-07-24 12:14:58 +01:00

25 lines
3.5 KiB
PHP

<x-layouts.app :title="__('Enterprise Services')">
<div class="space-y-8">
<div><h1 class="text-2xl font-semibold">{{ __('Enterprise Services') }}</h1><p class="text-sm text-zinc-500">{{ __('Health, queues, scheduler, cache, backups and production diagnostics.') }}</p></div>
@if(session('status'))<flux:callout variant="success">{{ session('status') }}</flux:callout>@endif
@if($errors->any())<flux:callout variant="danger">{{ $errors->first() }}</flux:callout>@endif
<div class="grid gap-4 md:grid-cols-2 xl:grid-cols-4">
<flux:card><div class="text-sm text-zinc-500">{{ __('Overall health') }}</div><div class="mt-2 text-xl font-semibold capitalize">{{ $health['status'] }}</div></flux:card>
<flux:card><div class="text-sm text-zinc-500">{{ __('Queue') }}</div><div class="mt-2 text-xl font-semibold">{{ $queueConnection }}</div><div class="text-sm text-zinc-500">{{ $failedJobs }} {{ __('failed') }}</div></flux:card>
<flux:card><div class="text-sm text-zinc-500">{{ __('Cache') }}</div><div class="mt-2 text-xl font-semibold">{{ $cacheStore }}</div></flux:card>
<flux:card><div class="text-sm text-zinc-500">{{ __('Runtime') }}</div><div class="mt-2 text-sm">PHP {{ $phpVersion }}</div><div class="text-sm">Laravel {{ $laravelVersion }}</div></flux:card>
</div>
<flux:card>
<div class="flex flex-wrap items-center justify-between gap-3"><h2 class="text-lg font-semibold">{{ __('Health checks') }}</h2><form method="POST" action="{{ route('administration.enterprise.health.run') }}">@csrf<flux:button type="submit" variant="primary">{{ __('Run checks') }}</flux:button></form></div>
<div class="mt-4 divide-y">@foreach($health['checks'] as $check)<div class="grid gap-2 py-3 md:grid-cols-[1fr_auto_2fr]"><strong>{{ $check['name'] }}</strong><span class="capitalize">{{ $check['status'] }}</span><span class="text-zinc-500">{{ $check['message'] }}</span></div>@endforeach</div>
</flux:card>
<div class="grid gap-6 xl:grid-cols-2">
<flux:card><h2 class="text-lg font-semibold">{{ __('Operations') }}</h2><div class="mt-4 flex flex-wrap gap-3"><form method="POST" action="{{ route('administration.enterprise.cache.clear') }}">@csrf<flux:button type="submit">{{ __('Clear cache') }}</flux:button></form><form method="POST" action="{{ route('administration.enterprise.scheduler.run') }}">@csrf<flux:button type="submit">{{ __('Run scheduler') }}</flux:button></form><form method="POST" action="{{ route('administration.enterprise.queue.retry') }}">@csrf<flux:button type="submit">{{ __('Retry failed jobs') }}</flux:button></form></div></flux:card>
<flux:card><div class="flex items-center justify-between"><h2 class="text-lg font-semibold">{{ __('Backups') }}</h2><form method="POST" action="{{ route('administration.enterprise.backups.store') }}">@csrf<flux:button type="submit" variant="primary">{{ __('Create backup') }}</flux:button></form></div>@forelse($backups as $backup)<div class="flex items-center justify-between border-b py-3"><div><div>{{ $backup->path }}</div><div class="text-sm text-zinc-500">{{ number_format($backup->size / 1024 / 1024, 2) }} MB · {{ $backup->created_at->diffForHumans() }}</div></div><form method="POST" action="{{ route('administration.enterprise.backups.destroy', $backup) }}">@csrf @method('DELETE')<flux:button size="sm" variant="danger">{{ __('Delete') }}</flux:button></form></div>@empty<p class="py-4 text-zinc-500">{{ __('No backups created.') }}</p>@endforelse</flux:card>
</div>
</div>
</x-layouts.app>