fix(docker): volumes get delete when stopping a service if Delete Unused Volumes is activated (#6317)
This commit is contained in:
parent
10823666b2
commit
2a526c54d5
14 changed files with 49 additions and 32 deletions
|
|
@ -49,7 +49,7 @@ public function handle(Application $application, bool $previewDeployments = fals
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($dockerCleanup) {
|
if ($dockerCleanup) {
|
||||||
CleanupDocker::dispatch($server, true);
|
CleanupDocker::dispatch($server, false, false);
|
||||||
}
|
}
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
return $e->getMessage();
|
return $e->getMessage();
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ public function handle(StandaloneRedis|StandalonePostgresql|StandaloneMongodb|St
|
||||||
$this->stopContainer($database, $database->uuid, 30);
|
$this->stopContainer($database, $database->uuid, 30);
|
||||||
|
|
||||||
if ($dockerCleanup) {
|
if ($dockerCleanup) {
|
||||||
CleanupDocker::dispatch($server, true);
|
CleanupDocker::dispatch($server, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($database->is_public) {
|
if ($database->is_public) {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ class CleanupDocker
|
||||||
|
|
||||||
public string $jobQueue = 'high';
|
public string $jobQueue = 'high';
|
||||||
|
|
||||||
public function handle(Server $server)
|
public function handle(Server $server, bool $deleteUnusedVolumes = false, bool $deleteUnusedNetworks = false)
|
||||||
{
|
{
|
||||||
$settings = instanceSettings();
|
$settings = instanceSettings();
|
||||||
$realtimeImage = config('constants.coolify.realtime_image');
|
$realtimeImage = config('constants.coolify.realtime_image');
|
||||||
|
|
@ -36,11 +36,11 @@ public function handle(Server $server)
|
||||||
"docker images --filter before=$realtimeImageWithoutPrefixVersion --filter reference=$realtimeImageWithoutPrefix | grep $realtimeImageWithoutPrefix | awk '{print $3}' | xargs -r docker rmi -f",
|
"docker images --filter before=$realtimeImageWithoutPrefixVersion --filter reference=$realtimeImageWithoutPrefix | grep $realtimeImageWithoutPrefix | awk '{print $3}' | xargs -r docker rmi -f",
|
||||||
];
|
];
|
||||||
|
|
||||||
if ($server->settings->delete_unused_volumes) {
|
if ($deleteUnusedVolumes) {
|
||||||
$commands[] = 'docker volume prune -af';
|
$commands[] = 'docker volume prune -af';
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($server->settings->delete_unused_networks) {
|
if ($deleteUnusedNetworks) {
|
||||||
$commands[] = 'docker network prune -f';
|
$commands[] = 'docker network prune -f';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ public function handle($manual_update = false)
|
||||||
if (! $this->server) {
|
if (! $this->server) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
CleanupDocker::dispatch($this->server);
|
CleanupDocker::dispatch($this->server, false, false);
|
||||||
$this->latestVersion = get_latest_version_of_coolify();
|
$this->latestVersion = get_latest_version_of_coolify();
|
||||||
$this->currentVersion = config('constants.coolify.version');
|
$this->currentVersion = config('constants.coolify.version');
|
||||||
if (! $manual_update) {
|
if (! $manual_update) {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ class DeleteService
|
||||||
{
|
{
|
||||||
use AsAction;
|
use AsAction;
|
||||||
|
|
||||||
public function handle(Service $service, bool $deleteConfigurations, bool $deleteVolumes, bool $dockerCleanup, bool $deleteConnectedNetworks)
|
public function handle(Service $service, bool $deleteVolumes, bool $deleteConnectedNetworks, bool $deleteConfigurations, bool $dockerCleanup)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$server = data_get($service, 'server');
|
$server = data_get($service, 'server');
|
||||||
|
|
@ -71,7 +71,7 @@ public function handle(Service $service, bool $deleteConfigurations, bool $delet
|
||||||
$service->forceDelete();
|
$service->forceDelete();
|
||||||
|
|
||||||
if ($dockerCleanup) {
|
if ($dockerCleanup) {
|
||||||
CleanupDocker::dispatch($server, true);
|
CleanupDocker::dispatch($server, false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ public function handle(Service $service, bool $isDeleteOperation = false, bool $
|
||||||
$service->deleteConnectedNetworks();
|
$service->deleteConnectedNetworks();
|
||||||
}
|
}
|
||||||
if ($dockerCleanup) {
|
if ($dockerCleanup) {
|
||||||
CleanupDocker::dispatch($server, true);
|
CleanupDocker::dispatch($server, false, false);
|
||||||
}
|
}
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
return $e->getMessage();
|
return $e->getMessage();
|
||||||
|
|
|
||||||
|
|
@ -1699,10 +1699,10 @@ public function delete_by_uuid(Request $request)
|
||||||
|
|
||||||
DeleteResourceJob::dispatch(
|
DeleteResourceJob::dispatch(
|
||||||
resource: $application,
|
resource: $application,
|
||||||
deleteConfigurations: $request->query->get('delete_configurations', true),
|
|
||||||
deleteVolumes: $request->query->get('delete_volumes', true),
|
deleteVolumes: $request->query->get('delete_volumes', true),
|
||||||
dockerCleanup: $request->query->get('docker_cleanup', true),
|
deleteConnectedNetworks: $request->query->get('delete_connected_networks', true),
|
||||||
deleteConnectedNetworks: $request->query->get('delete_connected_networks', true)
|
deleteConfigurations: $request->query->get('delete_configurations', true),
|
||||||
|
dockerCleanup: $request->query->get('docker_cleanup', true)
|
||||||
);
|
);
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
|
|
|
||||||
|
|
@ -1608,10 +1608,10 @@ public function delete_by_uuid(Request $request)
|
||||||
|
|
||||||
DeleteResourceJob::dispatch(
|
DeleteResourceJob::dispatch(
|
||||||
resource: $database,
|
resource: $database,
|
||||||
deleteConfigurations: $request->query->get('delete_configurations', true),
|
|
||||||
deleteVolumes: $request->query->get('delete_volumes', true),
|
deleteVolumes: $request->query->get('delete_volumes', true),
|
||||||
dockerCleanup: $request->query->get('docker_cleanup', true),
|
deleteConnectedNetworks: $request->query->get('delete_connected_networks', true),
|
||||||
deleteConnectedNetworks: $request->query->get('delete_connected_networks', true)
|
deleteConfigurations: $request->query->get('delete_configurations', true),
|
||||||
|
dockerCleanup: $request->query->get('docker_cleanup', true)
|
||||||
);
|
);
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
|
|
|
||||||
|
|
@ -510,10 +510,10 @@ public function delete_by_uuid(Request $request)
|
||||||
|
|
||||||
DeleteResourceJob::dispatch(
|
DeleteResourceJob::dispatch(
|
||||||
resource: $service,
|
resource: $service,
|
||||||
deleteConfigurations: $request->query->get('delete_configurations', true),
|
|
||||||
deleteVolumes: $request->query->get('delete_volumes', true),
|
deleteVolumes: $request->query->get('delete_volumes', true),
|
||||||
dockerCleanup: $request->query->get('docker_cleanup', true),
|
deleteConnectedNetworks: $request->query->get('delete_connected_networks', true),
|
||||||
deleteConnectedNetworks: $request->query->get('delete_connected_networks', true)
|
deleteConfigurations: $request->query->get('delete_configurations', true),
|
||||||
|
dockerCleanup: $request->query->get('docker_cleanup', true)
|
||||||
);
|
);
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
|
|
|
||||||
|
|
@ -32,10 +32,10 @@ class DeleteResourceJob implements ShouldBeEncrypted, ShouldQueue
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
public Application|ApplicationPreview|Service|StandalonePostgresql|StandaloneRedis|StandaloneMongodb|StandaloneMysql|StandaloneMariadb|StandaloneKeydb|StandaloneDragonfly|StandaloneClickhouse $resource,
|
public Application|ApplicationPreview|Service|StandalonePostgresql|StandaloneRedis|StandaloneMongodb|StandaloneMysql|StandaloneMariadb|StandaloneKeydb|StandaloneDragonfly|StandaloneClickhouse $resource,
|
||||||
public bool $deleteConfigurations = true,
|
|
||||||
public bool $deleteVolumes = true,
|
public bool $deleteVolumes = true,
|
||||||
public bool $dockerCleanup = true,
|
public bool $deleteConnectedNetworks = true,
|
||||||
public bool $deleteConnectedNetworks = true
|
public bool $deleteConfigurations = true,
|
||||||
|
public bool $dockerCleanup = true
|
||||||
) {
|
) {
|
||||||
$this->onQueue('high');
|
$this->onQueue('high');
|
||||||
}
|
}
|
||||||
|
|
@ -66,7 +66,7 @@ public function handle()
|
||||||
break;
|
break;
|
||||||
case 'service':
|
case 'service':
|
||||||
StopService::run($this->resource, true);
|
StopService::run($this->resource, true);
|
||||||
DeleteService::run($this->resource, $this->deleteConfigurations, $this->deleteVolumes, $this->dockerCleanup, $this->deleteConnectedNetworks);
|
DeleteService::run($this->resource, $this->deleteVolumes, $this->deleteConnectedNetworks, $this->deleteConfigurations, $this->dockerCleanup);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -106,7 +106,7 @@ public function handle()
|
||||||
if ($this->dockerCleanup) {
|
if ($this->dockerCleanup) {
|
||||||
$server = data_get($this->resource, 'server') ?? data_get($this->resource, 'destination.server');
|
$server = data_get($this->resource, 'server') ?? data_get($this->resource, 'destination.server');
|
||||||
if ($server) {
|
if ($server) {
|
||||||
CleanupDocker::dispatch($server, true);
|
CleanupDocker::dispatch($server, false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Artisan::queue('cleanup:stucked-resources');
|
Artisan::queue('cleanup:stucked-resources');
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,12 @@ public function middleware(): array
|
||||||
return [(new WithoutOverlapping('docker-cleanup-'.$this->server->uuid))->expireAfter(600)->dontRelease()];
|
return [(new WithoutOverlapping('docker-cleanup-'.$this->server->uuid))->expireAfter(600)->dontRelease()];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function __construct(public Server $server, public bool $manualCleanup = false) {}
|
public function __construct(
|
||||||
|
public Server $server,
|
||||||
|
public bool $manualCleanup = false,
|
||||||
|
public bool $deleteUnusedVolumes = false,
|
||||||
|
public bool $deleteUnusedNetworks = false
|
||||||
|
) {}
|
||||||
|
|
||||||
public function handle(): void
|
public function handle(): void
|
||||||
{
|
{
|
||||||
|
|
@ -50,7 +55,11 @@ public function handle(): void
|
||||||
$this->usageBefore = $this->server->getDiskUsage();
|
$this->usageBefore = $this->server->getDiskUsage();
|
||||||
|
|
||||||
if ($this->manualCleanup || $this->server->settings->force_docker_cleanup) {
|
if ($this->manualCleanup || $this->server->settings->force_docker_cleanup) {
|
||||||
$cleanup_log = CleanupDocker::run(server: $this->server);
|
$cleanup_log = CleanupDocker::run(
|
||||||
|
server: $this->server,
|
||||||
|
deleteUnusedVolumes: $this->deleteUnusedVolumes,
|
||||||
|
deleteUnusedNetworks: $this->deleteUnusedNetworks
|
||||||
|
);
|
||||||
$usageAfter = $this->server->getDiskUsage();
|
$usageAfter = $this->server->getDiskUsage();
|
||||||
$message = ($this->manualCleanup ? 'Manual' : 'Forced').' Docker cleanup job executed successfully. Disk usage before: '.$this->usageBefore.'%, Disk usage after: '.$usageAfter.'%.';
|
$message = ($this->manualCleanup ? 'Manual' : 'Forced').' Docker cleanup job executed successfully. Disk usage before: '.$this->usageBefore.'%, Disk usage after: '.$usageAfter.'%.';
|
||||||
|
|
||||||
|
|
@ -67,7 +76,11 @@ public function handle(): void
|
||||||
}
|
}
|
||||||
|
|
||||||
if (str($this->usageBefore)->isEmpty() || $this->usageBefore === null || $this->usageBefore === 0) {
|
if (str($this->usageBefore)->isEmpty() || $this->usageBefore === null || $this->usageBefore === 0) {
|
||||||
$cleanup_log = CleanupDocker::run(server: $this->server);
|
$cleanup_log = CleanupDocker::run(
|
||||||
|
server: $this->server,
|
||||||
|
deleteUnusedVolumes: $this->deleteUnusedVolumes,
|
||||||
|
deleteUnusedNetworks: $this->deleteUnusedNetworks
|
||||||
|
);
|
||||||
$message = 'Docker cleanup job executed successfully, but no disk usage could be determined.';
|
$message = 'Docker cleanup job executed successfully, but no disk usage could be determined.';
|
||||||
|
|
||||||
$this->execution_log->update([
|
$this->execution_log->update([
|
||||||
|
|
@ -81,7 +94,11 @@ public function handle(): void
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->usageBefore >= $this->server->settings->docker_cleanup_threshold) {
|
if ($this->usageBefore >= $this->server->settings->docker_cleanup_threshold) {
|
||||||
$cleanup_log = CleanupDocker::run(server: $this->server);
|
$cleanup_log = CleanupDocker::run(
|
||||||
|
server: $this->server,
|
||||||
|
deleteUnusedVolumes: $this->deleteUnusedVolumes,
|
||||||
|
deleteUnusedNetworks: $this->deleteUnusedNetworks
|
||||||
|
);
|
||||||
$usageAfter = $this->server->getDiskUsage();
|
$usageAfter = $this->server->getDiskUsage();
|
||||||
$diskSaved = $this->usageBefore - $usageAfter;
|
$diskSaved = $this->usageBefore - $usageAfter;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -133,7 +133,7 @@ private function processServer(Server $server): void
|
||||||
$dockerCleanupFrequency = VALID_CRON_STRINGS[$dockerCleanupFrequency];
|
$dockerCleanupFrequency = VALID_CRON_STRINGS[$dockerCleanupFrequency];
|
||||||
}
|
}
|
||||||
if ($this->shouldRunNow($dockerCleanupFrequency, $serverTimezone)) {
|
if ($this->shouldRunNow($dockerCleanupFrequency, $serverTimezone)) {
|
||||||
DockerCleanupJob::dispatch($server);
|
DockerCleanupJob::dispatch($server, false, $server->settings->delete_unused_volumes, $server->settings->delete_unused_networks);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dispatch ServerPatchCheckJob if due (weekly)
|
// Dispatch ServerPatchCheckJob if due (weekly)
|
||||||
|
|
|
||||||
|
|
@ -99,10 +99,10 @@ public function delete($password)
|
||||||
$this->resource->delete();
|
$this->resource->delete();
|
||||||
DeleteResourceJob::dispatch(
|
DeleteResourceJob::dispatch(
|
||||||
$this->resource,
|
$this->resource,
|
||||||
$this->delete_configurations,
|
|
||||||
$this->delete_volumes,
|
$this->delete_volumes,
|
||||||
$this->docker_cleanup,
|
$this->delete_connected_networks,
|
||||||
$this->delete_connected_networks
|
$this->delete_configurations,
|
||||||
|
$this->docker_cleanup
|
||||||
);
|
);
|
||||||
|
|
||||||
return redirect()->route('project.resource.index', [
|
return redirect()->route('project.resource.index', [
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ public function instantSave()
|
||||||
public function manualCleanup()
|
public function manualCleanup()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
DockerCleanupJob::dispatch($this->server, true);
|
DockerCleanupJob::dispatch($this->server, true, $this->deleteUnusedVolumes, $this->deleteUnusedNetworks);
|
||||||
$this->dispatch('success', 'Manual cleanup job started. Depending on the amount of data, this might take a while.');
|
$this->dispatch('success', 'Manual cleanup job started. Depending on the amount of data, this might take a while.');
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue