admin widget zu dokploy geswitched

This commit is contained in:
Codex Agent
2025-11-18 16:45:56 +01:00
parent 6720ad84cf
commit 125c624588
22 changed files with 693 additions and 512 deletions

View File

@@ -1,127 +0,0 @@
<?php
namespace App\Filament\SuperAdmin\Pages;
use App\Models\CoolifyActionLog;
use App\Services\Coolify\CoolifyClient;
use BackedEnum;
use Filament\Notifications\Notification;
use Filament\Pages\Page;
use Illuminate\Support\Arr;
class CoolifyDeployments extends Page
{
protected static string|BackedEnum|null $navigationIcon = 'heroicon-o-wrench-screwdriver';
protected static ?string $navigationLabel = 'Infrastructure';
protected static ?string $title = 'Infrastructure Controls';
protected string $view = 'filament.super-admin.pages.coolify-deployments';
public array $services = [];
public array $recentLogs = [];
public ?string $coolifyWebUrl = null;
public function mount(CoolifyClient $client): void
{
$this->coolifyWebUrl = config('coolify.web_url');
$this->refreshServices($client);
$this->refreshLogs();
}
public function restart(string $serviceId): void
{
$this->performAction($serviceId, 'restart');
}
public function redeploy(string $serviceId): void
{
$this->performAction($serviceId, 'redeploy');
}
protected function performAction(string $serviceId, string $action): void
{
$client = app(CoolifyClient::class);
if (! $this->isKnownService($serviceId)) {
Notification::make()
->danger()
->title('Unknown service')
->body("The service ID {$serviceId} is not configured.")
->send();
return;
}
try {
$action === 'restart'
? $client->restartService($serviceId, auth()->user())
: $client->redeployService($serviceId, auth()->user());
Notification::make()
->success()
->title(ucfirst($action).' requested')
->body("Coolify accepted the {$action} action for {$serviceId}.")
->send();
} catch (\Throwable $exception) {
Notification::make()
->danger()
->title('Coolify request failed')
->body($exception->getMessage())
->send();
}
$this->refreshServices($client);
$this->refreshLogs();
}
protected function refreshServices(CoolifyClient $client): void
{
$serviceMap = config('coolify.services', []);
$results = [];
foreach ($serviceMap as $label => $id) {
try {
$status = $client->serviceStatus($id);
$results[] = [
'label' => ucfirst($label),
'service_id' => $id,
'status' => Arr::get($status, 'data.status', 'unknown'),
];
} catch (\Throwable $e) {
$results[] = [
'label' => ucfirst($label),
'service_id' => $id,
'status' => 'error',
];
}
}
$this->services = $results;
}
protected function refreshLogs(): void
{
$this->recentLogs = CoolifyActionLog::query()
->with('user')
->latest()
->limit(5)
->get()
->map(fn ($log) => [
'created_at' => $log->created_at->diffForHumans(),
'user' => $log->user?->name ?? 'System',
'service_id' => $log->service_id,
'action' => $log->action,
'status_code' => $log->status_code,
])
->toArray();
}
protected function isKnownService(string $serviceId): bool
{
return in_array($serviceId, array_values(config('coolify.services', [])), true);
}
}

View File

@@ -0,0 +1,129 @@
<?php
namespace App\Filament\SuperAdmin\Pages;
use App\Models\InfrastructureActionLog;
use App\Services\Dokploy\DokployClient;
use BackedEnum;
use Filament\Notifications\Notification;
use Filament\Pages\Page;
use Illuminate\Support\Arr;
class DokployDeployments extends Page
{
protected static string|BackedEnum|null $navigationIcon = 'heroicon-o-wrench-screwdriver';
protected static ?string $navigationLabel = 'Infrastructure';
protected static ?string $title = 'Infrastructure Controls';
protected string $view = 'filament.super-admin.pages.dokploy-deployments';
public array $applications = [];
public array $recentLogs = [];
public ?string $dokployWebUrl = null;
public function mount(DokployClient $client): void
{
$this->dokployWebUrl = config('dokploy.web_url');
$this->refreshApplications($client);
$this->refreshLogs();
}
public function reload(string $applicationId): void
{
$this->performAction($applicationId, 'reload');
}
public function redeploy(string $applicationId): void
{
$this->performAction($applicationId, 'redeploy');
}
protected function performAction(string $applicationId, string $action): void
{
$client = app(DokployClient::class);
if (! $this->isKnownApplication($applicationId)) {
Notification::make()
->danger()
->title('Unknown service')
->body("The application ID {$applicationId} is not configured.")
->send();
return;
}
try {
$action === 'reload'
? $client->reloadApplication($applicationId, auth()->user())
: $client->redeployApplication($applicationId, auth()->user());
Notification::make()
->success()
->title(ucfirst($action).' requested')
->body("Dokploy accepted the {$action} action for {$applicationId}.")
->send();
} catch (\Throwable $exception) {
Notification::make()
->danger()
->title('Dokploy request failed')
->body($exception->getMessage())
->send();
}
$this->refreshApplications($client);
$this->refreshLogs();
}
protected function refreshApplications(DokployClient $client): void
{
$applicationMap = config('dokploy.applications', []);
$results = [];
foreach ($applicationMap as $label => $id) {
try {
$status = $client->applicationStatus($id);
$application = Arr::get($status, 'application', []);
$results[] = [
'label' => ucfirst($label),
'application_id' => $id,
'status' => Arr::get($application, 'applicationStatus', 'unknown'),
];
} catch (\Throwable $e) {
$results[] = [
'label' => ucfirst($label),
'application_id' => $id,
'status' => 'error',
];
}
}
$this->applications = $results;
}
protected function refreshLogs(): void
{
$this->recentLogs = InfrastructureActionLog::query()
->with('user')
->latest()
->limit(5)
->get()
->map(fn ($log) => [
'created_at' => $log->created_at->diffForHumans(),
'user' => $log->user?->name ?? 'System',
'service_id' => $log->service_id,
'action' => $log->action,
'status_code' => $log->status_code,
])
->toArray();
}
protected function isKnownApplication(string $applicationId): bool
{
return in_array($applicationId, array_values(config('dokploy.applications', [])), true);
}
}