2023-07-07 13:50:36 +00:00
< ? php
namespace App\Jobs ;
2024-01-12 07:45:24 +00:00
use App\Actions\Server\CleanupDocker ;
2025-01-15 19:31:44 +00:00
use App\Events\DockerCleanupDone ;
use App\Models\DockerCleanupExecution ;
2023-07-07 13:50:36 +00:00
use App\Models\Server ;
2024-12-10 15:13:18 +00:00
use App\Notifications\Server\DockerCleanupFailed ;
use App\Notifications\Server\DockerCleanupSuccess ;
2025-01-16 14:12:57 +00:00
use Carbon\Carbon ;
2023-07-07 13:50:36 +00:00
use Illuminate\Bus\Queueable ;
2023-09-14 08:12:44 +00:00
use Illuminate\Contracts\Queue\ShouldBeEncrypted ;
2023-07-07 13:50:36 +00:00
use Illuminate\Contracts\Queue\ShouldQueue ;
use Illuminate\Foundation\Bus\Dispatchable ;
use Illuminate\Queue\InteractsWithQueue ;
2024-11-07 08:16:58 +00:00
use Illuminate\Queue\Middleware\WithoutOverlapping ;
2023-07-07 13:50:36 +00:00
use Illuminate\Queue\SerializesModels ;
2024-06-10 20:43:34 +00:00
class DockerCleanupJob implements ShouldBeEncrypted , ShouldQueue
2023-07-07 13:50:36 +00:00
{
use Dispatchable , InteractsWithQueue , Queueable , SerializesModels ;
2023-08-08 09:51:36 +00:00
2024-08-26 10:23:03 +00:00
public $timeout = 600 ;
2024-06-10 20:43:34 +00:00
2024-08-26 10:23:03 +00:00
public $tries = 1 ;
2024-08-21 08:50:05 +00:00
public ? string $usageBefore = null ;
2023-09-01 08:11:00 +00:00
2025-01-15 19:31:44 +00:00
public ? DockerCleanupExecution $execution_log = null ;
2024-11-07 08:16:58 +00:00
public function middleware () : array
{
2025-07-01 08:50:27 +00:00
return [( new WithoutOverlapping ( 'docker-cleanup-' . $this -> server -> uuid )) -> expireAfter ( 600 ) -> dontRelease ()];
2024-11-07 08:16:58 +00:00
}
2025-08-04 19:15:56 +00:00
public function __construct (
public Server $server ,
public bool $manualCleanup = false ,
public bool $deleteUnusedVolumes = false ,
public bool $deleteUnusedNetworks = false
) {}
2024-06-10 20:43:34 +00:00
2023-07-07 13:50:36 +00:00
public function handle () : void
{
try {
2024-08-14 19:53:03 +00:00
if ( ! $this -> server -> isFunctional ()) {
2023-09-29 12:26:42 +00:00
return ;
}
2024-08-14 19:53:03 +00:00
2025-01-15 19:31:44 +00:00
$this -> execution_log = DockerCleanupExecution :: create ([
'server_id' => $this -> server -> id ,
]);
2024-12-10 15:13:18 +00:00
$this -> usageBefore = $this -> server -> getDiskUsage ();
2024-09-22 18:02:51 +00:00
if ( $this -> manualCleanup || $this -> server -> settings -> force_docker_cleanup ) {
2025-08-04 19:15:56 +00:00
$cleanup_log = CleanupDocker :: run (
server : $this -> server ,
deleteUnusedVolumes : $this -> deleteUnusedVolumes ,
deleteUnusedNetworks : $this -> deleteUnusedNetworks
);
2024-12-10 15:13:18 +00:00
$usageAfter = $this -> server -> getDiskUsage ();
2025-01-15 19:31:44 +00:00
$message = ( $this -> manualCleanup ? 'Manual' : 'Forced' ) . ' Docker cleanup job executed successfully. Disk usage before: ' . $this -> usageBefore . '%, Disk usage after: ' . $usageAfter . '%.' ;
$this -> execution_log -> update ([
'status' => 'success' ,
'message' => $message ,
'cleanup_log' => $cleanup_log ,
]);
$this -> server -> team ? -> notify ( new DockerCleanupSuccess ( $this -> server , $message ));
event ( new DockerCleanupDone ( $this -> execution_log ));
2024-09-27 14:43:07 +00:00
2024-07-18 12:38:56 +00:00
return ;
}
2024-07-18 12:43:21 +00:00
2024-08-07 08:54:22 +00:00
if ( str ( $this -> usageBefore ) -> isEmpty () || $this -> usageBefore === null || $this -> usageBefore === 0 ) {
2025-08-04 19:15:56 +00:00
$cleanup_log = CleanupDocker :: run (
server : $this -> server ,
deleteUnusedVolumes : $this -> deleteUnusedVolumes ,
deleteUnusedNetworks : $this -> deleteUnusedNetworks
);
2025-01-15 19:31:44 +00:00
$message = 'Docker cleanup job executed successfully, but no disk usage could be determined.' ;
$this -> execution_log -> update ([
'status' => 'success' ,
'message' => $message ,
'cleanup_log' => $cleanup_log ,
]);
$this -> server -> team ? -> notify ( new DockerCleanupSuccess ( $this -> server , $message ));
event ( new DockerCleanupDone ( $this -> execution_log ));
2026-02-28 15:23:58 +00:00
return ;
2024-08-05 11:45:53 +00:00
}
2024-12-10 15:13:18 +00:00
2024-08-26 10:23:03 +00:00
if ( $this -> usageBefore >= $this -> server -> settings -> docker_cleanup_threshold ) {
2025-08-04 19:15:56 +00:00
$cleanup_log = CleanupDocker :: run (
server : $this -> server ,
deleteUnusedVolumes : $this -> deleteUnusedVolumes ,
deleteUnusedNetworks : $this -> deleteUnusedNetworks
);
2023-11-16 10:53:37 +00:00
$usageAfter = $this -> server -> getDiskUsage ();
2024-12-10 15:13:18 +00:00
$diskSaved = $this -> usageBefore - $usageAfter ;
if ( $diskSaved > 0 ) {
2025-01-15 19:31:44 +00:00
$message = 'Saved ' . $diskSaved . '% disk space. Disk usage before: ' . $this -> usageBefore . '%, Disk usage after: ' . $usageAfter . '%.' ;
2023-08-29 08:00:29 +00:00
} else {
2025-01-15 19:31:44 +00:00
$message = 'Docker cleanup job executed successfully, but no disk space was saved. Disk usage before: ' . $this -> usageBefore . '%, Disk usage after: ' . $usageAfter . '%.' ;
2023-07-07 13:50:36 +00:00
}
2025-01-15 19:31:44 +00:00
$this -> execution_log -> update ([
'status' => 'success' ,
'message' => $message ,
'cleanup_log' => $cleanup_log ,
]);
$this -> server -> team ? -> notify ( new DockerCleanupSuccess ( $this -> server , $message ));
event ( new DockerCleanupDone ( $this -> execution_log ));
2023-09-29 12:26:42 +00:00
} else {
2025-01-15 19:31:44 +00:00
$message = 'No cleanup needed for ' . $this -> server -> name ;
$this -> execution_log -> update ([
'status' => 'success' ,
'message' => $message ,
]);
$this -> server -> team ? -> notify ( new DockerCleanupSuccess ( $this -> server , $message ));
event ( new DockerCleanupDone ( $this -> execution_log ));
2023-07-07 13:50:36 +00:00
}
2025-01-07 14:31:43 +00:00
} catch ( \Throwable $e ) {
2025-01-15 19:31:44 +00:00
if ( $this -> execution_log ) {
$this -> execution_log -> update ([
'status' => 'failed' ,
'message' => $e -> getMessage (),
]);
event ( new DockerCleanupDone ( $this -> execution_log ));
}
2024-12-10 15:13:18 +00:00
$this -> server -> team ? -> notify ( new DockerCleanupFailed ( $this -> server , 'Docker cleanup job failed with the following error: ' . $e -> getMessage ()));
2023-08-24 19:09:58 +00:00
throw $e ;
2025-01-16 14:12:57 +00:00
} finally {
if ( $this -> execution_log ) {
$this -> execution_log -> update ([
'finished_at' => Carbon :: now () -> toImmutable (),
]);
}
2023-07-07 13:50:36 +00:00
}
}
2024-08-26 10:23:03 +00:00
}