From adc3346f7b981a5a41ccecbbadefb5c6773b527c Mon Sep 17 00:00:00 2001 From: ayntk-ai <122374094+ayntk-ai@users.noreply.github.com> Date: Fri, 9 Aug 2024 23:27:39 +0200 Subject: [PATCH 01/16] cleanup docker improvements --- app/Actions/Server/CleanupDocker.php | 35 ++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/app/Actions/Server/CleanupDocker.php b/app/Actions/Server/CleanupDocker.php index 0009e001d..82515ab6b 100644 --- a/app/Actions/Server/CleanupDocker.php +++ b/app/Actions/Server/CleanupDocker.php @@ -11,15 +11,36 @@ class CleanupDocker public function handle(Server $server, bool $force = true) { - // cleanup docker images, containers, and builder caches + $commonCommands = [ + 'docker container prune -f --filter "label=coolify.managed=true"', + 'docker image prune -f', + 'docker builder prune -f', + 'docker network prune -f', + ]; + + $forceCommands = [ + 'docker container rm $(docker container ls -aq --filter status=exited --filter status=created)', + 'docker image prune -af', + 'docker builder prune -af', + 'docker system prune -af', + 'docker network prune -f', + ]; + + $additionalCommands = [ + 'docker rmi $(docker images -f "dangling=true" -q)', + 'docker network rm $(docker network ls -q -f "unused=true")', + 'docker system prune -f', + ]; + if ($force) { - instant_remote_process(['docker image prune -af'], $server, false); - instant_remote_process(['docker container prune -f --filter "label=coolify.managed=true"'], $server, false); - instant_remote_process(['docker builder prune -af'], $server, false); + $commands = array_merge($forceCommands, $commonCommands, $additionalCommands); + $commands[] = 'docker rm $(docker ps -a -q --filter status=exited --filter status=created)'; } else { - instant_remote_process(['docker image prune -f'], $server, false); - instant_remote_process(['docker container prune -f --filter "label=coolify.managed=true"'], $server, false); - instant_remote_process(['docker builder prune -f'], $server, false); + $commands = array_merge($commonCommands, $additionalCommands); + } + + foreach ($commands as $command) { + instant_remote_process([$command], $server, false); } } } From 27a15138b78a82b89738101f474bc11c328fda32 Mon Sep 17 00:00:00 2001 From: ayntk-ai <122374094+ayntk-ai@users.noreply.github.com> Date: Sat, 10 Aug 2024 00:12:53 +0200 Subject: [PATCH 02/16] Feat UI form --- app/Livewire/Server/Form.php | 6 +- .../views/livewire/server/form.blade.php | 242 ++++++++---------- 2 files changed, 110 insertions(+), 138 deletions(-) diff --git a/app/Livewire/Server/Form.php b/app/Livewire/Server/Form.php index 9934ea345..8d8cf983d 100644 --- a/app/Livewire/Server/Form.php +++ b/app/Livewire/Server/Form.php @@ -37,7 +37,6 @@ class Form extends Component 'server.settings.is_swarm_manager' => 'required|boolean', 'server.settings.is_swarm_worker' => 'required|boolean', 'server.settings.is_build_server' => 'required|boolean', - 'server.settings.is_force_cleanup_enabled' => 'required|boolean', 'server.settings.concurrent_builds' => 'required|integer|min:1', 'server.settings.dynamic_timeout' => 'required|integer|min:1', 'server.settings.is_metrics_enabled' => 'required|boolean', @@ -46,6 +45,9 @@ class Form extends Component 'server.settings.metrics_history_days' => 'required|integer|min:1', 'wildcard_domain' => 'nullable|url', 'server.settings.is_server_api_enabled' => 'required|boolean', + 'server.settings.force_server_cleanup' => 'required|boolean', + 'server.settings.server_cleanup_cron' => 'required_if:server.settings.force_server_cleanup,true', + 'server.settings.server_cleanup_threshold' => 'required|integer|min:1|max:100', ]; protected $validationAttributes = [ @@ -195,4 +197,4 @@ class Form extends Component $this->server->save(); $this->dispatch('success', 'Server updated.'); } -} +} \ No newline at end of file diff --git a/resources/views/livewire/server/form.blade.php b/resources/views/livewire/server/form.blade.php index 3c137df91..17400c603 100644 --- a/resources/views/livewire/server/form.blade.php +++ b/resources/views/livewire/server/form.blade.php @@ -3,73 +3,68 @@

General

@if ($server->id === 0) - - You could lose a lot of functionalities if you change the server details of the server where Coolify - is - running on.
Please think again. -
+ + You could lose a lot of functionalities if you change the server details of the server where Coolify + is + running on.
Please think again. +
@else - Save - @if ($server->isFunctional()) - - Validate & configure - - - - - Revalidate server - - - @endif - @endif -
- @if ($server->isFunctional()) - Server is reachable and validated. - @else - You can't use this server until it is validated. - @endif - @if ((!$server->settings->is_reachable || !$server->settings->is_usable) && $server->id !== 0) + Save + @if ($server->isFunctional()) Validate & configure - + - - Validate Server & Install Docker Engine + + Revalidate server - @if ($server->validation_logs) -

Previous Validation Logs

-
- {!! $server->validation_logs !!} -
@endif + @endif + + @if ($server->isFunctional()) + Server is reachable and validated. + @else + You can't use this server until it is validated. + @endif + @if ((!$server->settings->is_reachable || !$server->settings->is_usable) && $server->id !== 0) + + Validate & configure + + + + + Validate Server & Install Docker Engine + + + @if ($server->validation_logs) +

Previous Validation Logs

+
+ {!! $server->validation_logs !!} +
+ @endif @endif @if ((!$server->settings->is_reachable || !$server->settings->is_usable) && $server->id === 0) - - Validate Server - + + Validate Server + @endif @if ($server->isForceDisabled() && isCloud()) -
The system has disabled the server because you have exceeded the - number of servers for which you have paid.
+
The system has disabled the server because you have exceeded the + number of servers for which you have paid.
@endif
@if (!$server->settings->is_swarm_worker && !$server->settings->is_build_server) - + @endif
- +
@@ -77,106 +72,81 @@
@if ($server->isFunctional()) - @if (!$server->isLocalhost()) - -
-

Cloudflare Tunnels -

- -
- @if ($server->settings->is_cloudflare_tunnel) - - @else - - - - @endif - @if (!$server->isBuildServer()) -

Swarm (experimental)

-
Read the docs here. -
- @if ($server->settings->is_swarm_worker) - - @else - - @endif - - @if ($server->settings->is_swarm_manager) - - @else - - @endif - @endif - @endif + @if (!$server->isLocalhost()) + +
+

Cloudflare Tunnels +

+ +
+ @if ($server->settings->is_cloudflare_tunnel) + @else -
-

Cloudflare Tunnels -

- -
- @if ($server->settings->is_cloudflare_tunnel) - - @else - - - - @endif + + + + @endif + @if (!$server->isBuildServer()) +

Swarm (experimental)

+
Read the docs here. +
+ @if ($server->settings->is_swarm_worker) + + @else + + @endif + + @if ($server->settings->is_swarm_manager) + + @else + + @endif + @endif + @endif + @else +
+

Cloudflare Tunnels +

+ +
+ @if ($server->settings->is_cloudflare_tunnel) + + @else + + + + @endif @endif
@if ($server->isFunctional()) -

Settings

-
-
- @if ($server->settings->is_force_cleanup_enabled) -
- -
- @else - -
- -
- @endif -
-
- - +

Settings

+
+
+
+
+ @if ($server->settings->force_server_cleanup) + + @else + + @endif
-
-

Sentinel

- {{-- @if ($server->isSentinelEnabled()) --}} - {{-- Restart --}} - {{-- @endif --}} +
+ +
-
Metrics are disabled until a few bugs are fixed.
- {{--
+
+
+

Sentinel

+ {{-- @if ($server->isSentinelEnabled()) --}} + {{-- Restart --}} + {{-- @endif --}} +
+
Metrics are disabled until a few bugs are fixed.
+ {{--
@@ -192,4 +162,4 @@
--}} @endif -
+
\ No newline at end of file From b738e5c000083a52a8cd6f84b296443b063373d6 Mon Sep 17 00:00:00 2001 From: ayntk-ai <122374094+ayntk-ai@users.noreply.github.com> Date: Sat, 10 Aug 2024 00:13:17 +0200 Subject: [PATCH 03/16] add DB migration --- ...leanup_fields_to_server_settings_table.php | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 database/migrations/2024_08_09_215659_add_server_cleanup_fields_to_server_settings_table.php diff --git a/database/migrations/2024_08_09_215659_add_server_cleanup_fields_to_server_settings_table.php b/database/migrations/2024_08_09_215659_add_server_cleanup_fields_to_server_settings_table.php new file mode 100644 index 000000000..e4715b228 --- /dev/null +++ b/database/migrations/2024_08_09_215659_add_server_cleanup_fields_to_server_settings_table.php @@ -0,0 +1,44 @@ +boolean('force_server_cleanup')->default(false); + $table->string('server_cleanup_cron')->default('*/10 * * * *'); + $table->integer('server_cleanup_threshold')->default(80); + + // Remove old columns + $table->dropColumn('is_force_cleanup_enabled'); + $table->dropColumn('cleanup_after_percentage'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('server_settings', function (Blueprint $table) { + $table->dropColumn('force_server_cleanup'); + $table->dropColumn('server_cleanup_cron'); + $table->dropColumn('server_cleanup_threshold'); + + // Add back old columns + $table->boolean('is_force_cleanup_enabled')->default(false); + $table->integer('cleanup_after_percentage')->default(80); + }); + } +} \ No newline at end of file From a5db3b85fadd2a38967378b51cf48bbf60afb480 Mon Sep 17 00:00:00 2001 From: ayntk-ai <122374094+ayntk-ai@users.noreply.github.com> Date: Mon, 12 Aug 2024 12:42:15 +0200 Subject: [PATCH 04/16] cron logic --- app/Console/Kernel.php | 24 ++++++++++++++++-------- app/Jobs/DockerCleanupJob.php | 30 ++++++++++++++++++------------ app/Livewire/Server/Form.php | 29 ++++++++++++++++++++++------- 3 files changed, 56 insertions(+), 27 deletions(-) diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index e8f213b16..912b790f0 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -43,10 +43,10 @@ class Kernel extends ConsoleKernel } else { // Instance Jobs $schedule->command('horizon:snapshot')->everyFiveMinutes(); - $schedule->command('cleanup:unreachable-servers')->daily(); + $schedule->command('cleanup:unreachable-servers')->cron($settings->server_cleanup_frequency)->onOneServer(); $schedule->job(new PullCoolifyImageJob)->cron($settings->update_check_frequency)->onOneServer(); $schedule->job(new PullTemplatesFromCDN)->cron($settings->update_check_frequency)->onOneServer(); - $schedule->job(new CleanupInstanceStuffsJob)->everyTwoMinutes()->onOneServer(); + $schedule->job(new CleanupInstanceStuffsJob)->cron($settings->server_cleanup_frequency)->onOneServer(); $this->schedule_updates($schedule); // Server Jobs @@ -56,7 +56,7 @@ class Kernel extends ConsoleKernel $this->check_scheduled_tasks($schedule); $schedule->command('cleanup:database --yes')->daily(); - $schedule->command('uploads:clear')->everyTwoMinutes(); + $schedule->command('uploads:clear')->cron($settings->server_cleanup_frequency)->onOneServer(); } } @@ -66,7 +66,14 @@ class Kernel extends ConsoleKernel $servers = $this->all_servers->where('settings.is_usable', true)->where('settings.is_reachable', true)->where('ip', '!=', '1.2.3.4'); foreach ($servers as $server) { if ($server->isSentinelEnabled()) { - $schedule->job(new PullSentinelImageJob($server))->cron($settings->update_check_frequency)->onOneServer(); + $schedule->job(function () use ($server) { + $sentinel_found = instant_remote_process(['docker inspect coolify-sentinel'], $server, false); + $sentinel_found = json_decode($sentinel_found, true); + $status = data_get($sentinel_found, '0.State.Status', 'exited'); + if ($status !== 'running') { + PullSentinelImageJob::dispatch($server); + } + })->cron($settings->update_check_frequency)->onOneServer(); } $schedule->job(new PullHelperImageJob($server))->cron($settings->update_check_frequency)->onOneServer(); } @@ -87,6 +94,7 @@ class Kernel extends ConsoleKernel private function check_resources($schedule) { + $settings = InstanceSettings::get(); if (isCloud()) { $servers = $this->all_servers->whereNotNull('team.subscription')->where('team.subscription.stripe_trial_already_ended', false)->where('ip', '!=', '1.2.3.4'); $own = Team::find(0)->servers; @@ -96,7 +104,7 @@ class Kernel extends ConsoleKernel } foreach ($servers as $server) { $schedule->job(new ServerCheckJob($server))->everyMinute()->onOneServer(); - $schedule->job(new DockerCleanupJob($server))->everyTenMinutes()->onOneServer(); + $schedule->job(new DockerCleanupJob($server))->cron($settings->server_cleanup_frequency)->onOneServer(); } } @@ -107,7 +115,7 @@ class Kernel extends ConsoleKernel return; } foreach ($scheduled_backups as $scheduled_backup) { - if (! $scheduled_backup->enabled) { + if (!$scheduled_backup->enabled) { continue; } if (is_null(data_get($scheduled_backup, 'database'))) { @@ -139,7 +147,7 @@ class Kernel extends ConsoleKernel $service = $scheduled_task->service; $application = $scheduled_task->application; - if (! $application && ! $service) { + if (!$application && !$service) { ray('application/service attached to scheduled task does not exist'); $scheduled_task->delete(); @@ -166,7 +174,7 @@ class Kernel extends ConsoleKernel protected function commands(): void { - $this->load(__DIR__.'/Commands'); + $this->load(__DIR__ . '/Commands'); require base_path('routes/console.php'); } diff --git a/app/Jobs/DockerCleanupJob.php b/app/Jobs/DockerCleanupJob.php index 5010263ae..6c5e22b0a 100644 --- a/app/Jobs/DockerCleanupJob.php +++ b/app/Jobs/DockerCleanupJob.php @@ -12,6 +12,7 @@ use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\Log; +use Cron\CronExpression; class DockerCleanupJob implements ShouldBeEncrypted, ShouldQueue { @@ -21,39 +22,44 @@ class DockerCleanupJob implements ShouldBeEncrypted, ShouldQueue public int|string|null $usageBefore = null; - public function __construct(public Server $server) {} + public function __construct(public Server $server) + { + } public function handle(): void { try { - if (! $this->server->isFunctional()) { + if (!$this->server->isFunctional()) { return; } - if ($this->server->settings->is_force_cleanup_enabled) { - Log::info('DockerCleanupJob force cleanup on '.$this->server->name); - CleanupDocker::run(server: $this->server, force: true); - + if ($this->server->settings->force_server_cleanup) { + $cronExpression = $this->server->settings->server_cleanup_frequency; + $cron = new CronExpression($cronExpression); + if ($cron->isDue()) { + Log::info('DockerCleanupJob force cleanup on ' . $this->server->name); + CleanupDocker::run(server: $this->server, force: true); + } return; } $this->usageBefore = $this->server->getDiskUsage(); if (str($this->usageBefore)->isEmpty() || $this->usageBefore === null || $this->usageBefore === 0) { - Log::info('DockerCleanupJob force cleanup on '.$this->server->name); + Log::info('DockerCleanupJob force cleanup on ' . $this->server->name); CleanupDocker::run(server: $this->server, force: true); return; } - if ($this->usageBefore >= $this->server->settings->cleanup_after_percentage) { + if ($this->usageBefore >= $this->server->settings->server_cleanup_threshold) { CleanupDocker::run(server: $this->server, force: false); $usageAfter = $this->server->getDiskUsage(); if ($usageAfter < $this->usageBefore) { - $this->server->team?->notify(new DockerCleanup($this->server, 'Saved '.($this->usageBefore - $usageAfter).'% disk space.')); - Log::info('DockerCleanupJob done: Saved '.($this->usageBefore - $usageAfter).'% disk space on '.$this->server->name); + $this->server->team?->notify(new DockerCleanup($this->server, 'Saved ' . ($this->usageBefore - $usageAfter) . '% disk space.')); + Log::info('DockerCleanupJob done: Saved ' . ($this->usageBefore - $usageAfter) . '% disk space on ' . $this->server->name); } else { - Log::info('DockerCleanupJob failed to save disk space on '.$this->server->name); + Log::info('DockerCleanupJob failed to save disk space on ' . $this->server->name); } } else { - Log::info('No need to clean up '.$this->server->name); + Log::info('No need to clean up ' . $this->server->name); } } catch (\Throwable $e) { ray($e->getMessage()); diff --git a/app/Livewire/Server/Form.php b/app/Livewire/Server/Form.php index 8d8cf983d..963df3f4d 100644 --- a/app/Livewire/Server/Form.php +++ b/app/Livewire/Server/Form.php @@ -46,7 +46,7 @@ class Form extends Component 'wildcard_domain' => 'nullable|url', 'server.settings.is_server_api_enabled' => 'required|boolean', 'server.settings.force_server_cleanup' => 'required|boolean', - 'server.settings.server_cleanup_cron' => 'required_if:server.settings.force_server_cleanup,true', + 'server.settings.server_cleanup_frequency' => 'required_if:server.settings.force_server_cleanup,true', 'server.settings.server_cleanup_threshold' => 'required|integer|min:1|max:100', ]; @@ -73,7 +73,19 @@ class Form extends Component public function mount() { $this->wildcard_domain = $this->server->settings->wildcard_domain; - $this->cleanup_after_percentage = $this->server->settings->cleanup_after_percentage; + $this->server->settings->server_cleanup_threshold = $this->server->settings->server_cleanup_threshold; + $this->server->settings->server_cleanup_frequency = $this->server->settings->server_cleanup_frequency; + } + + public function updated($field) + { + if ($field === 'server.settings.server_cleanup_frequency') { + $frequency = $this->server->settings->server_cleanup_frequency; + if (empty($frequency) || !validate_cron_expression($frequency)) { + $this->dispatch('error', 'Invalid Cron / Human expression for Server Cleanup Frequency. Resetting to default 10 minutes.'); + $this->server->settings->server_cleanup_frequency = '*/10 * * * *'; + } + } } public function serverInstalled() @@ -118,7 +130,6 @@ class Form extends Component } if ($this->server->settings->isDirty('is_server_api_enabled') && $this->server->settings->is_server_api_enabled === true) { ray('Starting sentinel'); - } } else { ray('Sentinel is not enabled'); @@ -158,7 +169,7 @@ class Form extends Component $this->server->settings->save(); $this->dispatch('proxyStatusUpdated'); } else { - $this->dispatch('error', 'Server is not reachable.', 'Please validate your configuration and connection.

Check this documentation for further help.

Error: '.$error); + $this->dispatch('error', 'Server is not reachable.', 'Please validate your configuration and connection.

Check this documentation for further help.

Error: ' . $error); return; } @@ -174,7 +185,7 @@ class Form extends Component public function submit() { - if (isCloud() && ! isDev()) { + if (isCloud() && !isDev()) { $this->validate(); $this->validate([ 'server.ip' => 'required', @@ -192,9 +203,13 @@ class Form extends Component } refresh_server_connection($this->server->privateKey); $this->server->settings->wildcard_domain = $this->wildcard_domain; - $this->server->settings->cleanup_after_percentage = $this->cleanup_after_percentage; + if ($this->server->settings->force_server_cleanup) { + $this->server->settings->server_cleanup_frequency = $this->server->settings->server_cleanup_frequency; + } else { + $this->server->settings->server_cleanup_threshold = $this->server->settings->server_cleanup_threshold; + } $this->server->settings->save(); $this->server->save(); $this->dispatch('success', 'Server updated.'); } -} \ No newline at end of file +} From 4eaee6f4740bd2ea0e84c963403b7db565286ef5 Mon Sep 17 00:00:00 2001 From: ayntk-ai <122374094+ayntk-ai@users.noreply.github.com> Date: Mon, 12 Aug 2024 12:42:29 +0200 Subject: [PATCH 05/16] new DB migration --- ...ver_cleanup_fields_to_server_settings_table.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/database/migrations/2024_08_09_215659_add_server_cleanup_fields_to_server_settings_table.php b/database/migrations/2024_08_09_215659_add_server_cleanup_fields_to_server_settings_table.php index e4715b228..b1c1881e9 100644 --- a/database/migrations/2024_08_09_215659_add_server_cleanup_fields_to_server_settings_table.php +++ b/database/migrations/2024_08_09_215659_add_server_cleanup_fields_to_server_settings_table.php @@ -4,7 +4,7 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -class AddServerCleanupEnabledToServerSettingsTable extends Migration +class AddServerCleanupFieldsToServerSettingsTable extends Migration { /** * Run the migrations. @@ -15,12 +15,13 @@ class AddServerCleanupEnabledToServerSettingsTable extends Migration { Schema::table('server_settings', function (Blueprint $table) { $table->boolean('force_server_cleanup')->default(false); - $table->string('server_cleanup_cron')->default('*/10 * * * *'); + $table->string('server_cleanup_frequency')->default('*/10 * * * *'); $table->integer('server_cleanup_threshold')->default(80); + // Remove old columns - $table->dropColumn('is_force_cleanup_enabled'); $table->dropColumn('cleanup_after_percentage'); + $table->dropColumn('is_force_cleanup_enabled'); }); } @@ -33,12 +34,13 @@ class AddServerCleanupEnabledToServerSettingsTable extends Migration { Schema::table('server_settings', function (Blueprint $table) { $table->dropColumn('force_server_cleanup'); - $table->dropColumn('server_cleanup_cron'); + $table->dropColumn('server_cleanup_frequency'); $table->dropColumn('server_cleanup_threshold'); + // Add back old columns - $table->boolean('is_force_cleanup_enabled')->default(false); $table->integer('cleanup_after_percentage')->default(80); + $table->boolean('force_server_cleanup')->default(false); }); } -} \ No newline at end of file +} From b85b5e67bb8d1434c359d8cbfee1e9713cff430e Mon Sep 17 00:00:00 2001 From: ayntk-ai <122374094+ayntk-ai@users.noreply.github.com> Date: Mon, 12 Aug 2024 12:42:38 +0200 Subject: [PATCH 06/16] UI form update --- resources/views/livewire/server/form.blade.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/views/livewire/server/form.blade.php b/resources/views/livewire/server/form.blade.php index 17400c603..5408ab2b4 100644 --- a/resources/views/livewire/server/form.blade.php +++ b/resources/views/livewire/server/form.blade.php @@ -126,12 +126,12 @@
- +
@if ($server->settings->force_server_cleanup) - + @else - + @endif
From 365f957b8a728a5b1c19eed4753d93228364c847 Mon Sep 17 00:00:00 2001 From: ayntk-ai <122374094+ayntk-ai@users.noreply.github.com> Date: Mon, 12 Aug 2024 12:43:06 +0200 Subject: [PATCH 07/16] remove duplicated sentinel pull job --- app/Jobs/ServerCheckJob.php | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/app/Jobs/ServerCheckJob.php b/app/Jobs/ServerCheckJob.php index 1db15cfd4..703b199c5 100644 --- a/app/Jobs/ServerCheckJob.php +++ b/app/Jobs/ServerCheckJob.php @@ -79,7 +79,6 @@ class ServerCheckJob implements ShouldBeEncrypted, ShouldQueue } GetContainersStatus::run($this->server, $this->containers, $containerReplicates); $this->checkLogDrainContainer(); - $this->checkSentinel(); } } catch (\Throwable $e) { @@ -90,21 +89,6 @@ class ServerCheckJob implements ShouldBeEncrypted, ShouldQueue } - private function checkSentinel() - { - if ($this->server->isSentinelEnabled()) { - $sentinelContainerFound = $this->containers->filter(function ($value, $key) { - return data_get($value, 'Name') === '/coolify-sentinel'; - })->first(); - if ($sentinelContainerFound) { - $status = data_get($sentinelContainerFound, 'State.Status'); - if ($status !== 'running') { - PullSentinelImageJob::dispatch($this); - } - } - } - } - private function serverStatus() { ['uptime' => $uptime] = $this->server->validateConnection(); From 53bcf81af50e41fcb4c25a057f331d93d33612d6 Mon Sep 17 00:00:00 2001 From: ayntk-ai <122374094+ayntk-ai@users.noreply.github.com> Date: Wed, 14 Aug 2024 21:52:12 +0200 Subject: [PATCH 08/16] fix get corn job correctly form server settings --- app/Console/Kernel.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 912b790f0..252d23021 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -29,12 +29,13 @@ class Kernel extends ConsoleKernel { $this->all_servers = Server::all(); $settings = InstanceSettings::get(); + $mainServer = Server::find(0); + $serverSettings = $mainServer->settings; if (isDev()) { // Instance Jobs $schedule->command('horizon:snapshot')->everyMinute(); $schedule->job(new CleanupInstanceStuffsJob)->everyMinute()->onOneServer(); - // Server Jobs $this->check_scheduled_backups($schedule); $this->check_resources($schedule); @@ -43,10 +44,10 @@ class Kernel extends ConsoleKernel } else { // Instance Jobs $schedule->command('horizon:snapshot')->everyFiveMinutes(); - $schedule->command('cleanup:unreachable-servers')->cron($settings->server_cleanup_frequency)->onOneServer(); + $schedule->command('cleanup:unreachable-servers')->cron($serverSettings->server_cleanup_frequency)->onOneServer(); $schedule->job(new PullCoolifyImageJob)->cron($settings->update_check_frequency)->onOneServer(); $schedule->job(new PullTemplatesFromCDN)->cron($settings->update_check_frequency)->onOneServer(); - $schedule->job(new CleanupInstanceStuffsJob)->cron($settings->server_cleanup_frequency)->onOneServer(); + $schedule->job(new CleanupInstanceStuffsJob)->cron($serverSettings->server_cleanup_frequency)->onOneServer(); $this->schedule_updates($schedule); // Server Jobs @@ -56,7 +57,7 @@ class Kernel extends ConsoleKernel $this->check_scheduled_tasks($schedule); $schedule->command('cleanup:database --yes')->daily(); - $schedule->command('uploads:clear')->cron($settings->server_cleanup_frequency)->onOneServer(); + $schedule->command('uploads:clear')->cron($serverSettings->server_cleanup_frequency)->onOneServer(); } } @@ -94,7 +95,9 @@ class Kernel extends ConsoleKernel private function check_resources($schedule) { - $settings = InstanceSettings::get(); + $mainServer = Server::find(0); + $serverSettings = $mainServer->settings; + if (isCloud()) { $servers = $this->all_servers->whereNotNull('team.subscription')->where('team.subscription.stripe_trial_already_ended', false)->where('ip', '!=', '1.2.3.4'); $own = Team::find(0)->servers; @@ -104,7 +107,7 @@ class Kernel extends ConsoleKernel } foreach ($servers as $server) { $schedule->job(new ServerCheckJob($server))->everyMinute()->onOneServer(); - $schedule->job(new DockerCleanupJob($server))->cron($settings->server_cleanup_frequency)->onOneServer(); + $schedule->job(new DockerCleanupJob($server))->cron($serverSettings->server_cleanup_frequency)->onOneServer(); } } From 8aa161d530a3a511588055ffd8a0b128be186513 Mon Sep 17 00:00:00 2001 From: ayntk-ai <122374094+ayntk-ai@users.noreply.github.com> Date: Wed, 14 Aug 2024 21:53:03 +0200 Subject: [PATCH 09/16] remove unnecessary cron --- app/Jobs/DockerCleanupJob.php | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/app/Jobs/DockerCleanupJob.php b/app/Jobs/DockerCleanupJob.php index 6c5e22b0a..9736ed026 100644 --- a/app/Jobs/DockerCleanupJob.php +++ b/app/Jobs/DockerCleanupJob.php @@ -12,7 +12,6 @@ use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Facades\Log; -use Cron\CronExpression; class DockerCleanupJob implements ShouldBeEncrypted, ShouldQueue { @@ -22,23 +21,18 @@ class DockerCleanupJob implements ShouldBeEncrypted, ShouldQueue public int|string|null $usageBefore = null; - public function __construct(public Server $server) - { - } + public function __construct(public Server $server) {} public function handle(): void { try { - if (!$this->server->isFunctional()) { + if (! $this->server->isFunctional()) { return; } - if ($this->server->settings->force_server_cleanup) { - $cronExpression = $this->server->settings->server_cleanup_frequency; - $cron = new CronExpression($cronExpression); - if ($cron->isDue()) { - Log::info('DockerCleanupJob force cleanup on ' . $this->server->name); - CleanupDocker::run(server: $this->server, force: true); - } + if ($this->server->settings->is_force_cleanup_enabled) { + Log::info('DockerCleanupJob force cleanup on ' . $this->server->name); + CleanupDocker::run(server: $this->server, force: true); + return; } @@ -49,7 +43,7 @@ class DockerCleanupJob implements ShouldBeEncrypted, ShouldQueue return; } - if ($this->usageBefore >= $this->server->settings->server_cleanup_threshold) { + if ($this->usageBefore >= $this->server->settings->cleanup_after_percentage) { CleanupDocker::run(server: $this->server, force: false); $usageAfter = $this->server->getDiskUsage(); if ($usageAfter < $this->usageBefore) { From a4f80fd260db572d1898318ae25805efbe7b362a Mon Sep 17 00:00:00 2001 From: ayntk-ai <122374094+ayntk-ai@users.noreply.github.com> Date: Wed, 14 Aug 2024 21:54:01 +0200 Subject: [PATCH 10/16] required server settings and make sure cron is a string --- app/Livewire/Server/Form.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Livewire/Server/Form.php b/app/Livewire/Server/Form.php index 963df3f4d..1e959ae0b 100644 --- a/app/Livewire/Server/Form.php +++ b/app/Livewire/Server/Form.php @@ -46,8 +46,8 @@ class Form extends Component 'wildcard_domain' => 'nullable|url', 'server.settings.is_server_api_enabled' => 'required|boolean', 'server.settings.force_server_cleanup' => 'required|boolean', - 'server.settings.server_cleanup_frequency' => 'required_if:server.settings.force_server_cleanup,true', - 'server.settings.server_cleanup_threshold' => 'required|integer|min:1|max:100', + 'server.settings.server_cleanup_frequency' => 'required_if:server.settings.force_server_cleanup,true|string', + 'server.settings.server_cleanup_threshold' => 'required_if:server.settings.force_server_cleanup,false|integer|min:1|max:100', ]; protected $validationAttributes = [ @@ -212,4 +212,4 @@ class Form extends Component $this->server->save(); $this->dispatch('success', 'Server updated.'); } -} +} \ No newline at end of file From f93fe75de9d12e1ef9a3144fd35b51170f66389c Mon Sep 17 00:00:00 2001 From: ayntk-ai <122374094+ayntk-ai@users.noreply.github.com> Date: Wed, 14 Aug 2024 21:54:28 +0200 Subject: [PATCH 11/16] new fields in server setttings --- app/Models/ServerSetting.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/Models/ServerSetting.php b/app/Models/ServerSetting.php index c39982b91..1521fab3f 100644 --- a/app/Models/ServerSetting.php +++ b/app/Models/ServerSetting.php @@ -10,10 +10,10 @@ use OpenApi\Attributes as OA; type: 'object', properties: [ 'id' => ['type' => 'integer'], - 'cleanup_after_percentage' => ['type' => 'integer'], 'concurrent_builds' => ['type' => 'integer'], 'dynamic_timeout' => ['type' => 'integer'], 'force_disabled' => ['type' => 'boolean'], + 'force_server_cleanup' => ['type' => 'boolean'], 'is_build_server' => ['type' => 'boolean'], 'is_cloudflare_tunnel' => ['type' => 'boolean'], 'is_jump_server' => ['type' => 'boolean'], @@ -37,6 +37,8 @@ use OpenApi\Attributes as OA; 'metrics_history_days' => ['type' => 'integer'], 'metrics_refresh_rate_seconds' => ['type' => 'integer'], 'metrics_token' => ['type' => 'string'], + 'server_cleanup_frequency' => ['type' => 'string'], + 'server_cleanup_threshold' => ['type' => 'integer'], 'server_id' => ['type' => 'integer'], 'wildcard_domain' => ['type' => 'string'], 'created_at' => ['type' => 'string'], @@ -47,8 +49,13 @@ class ServerSetting extends Model { protected $guarded = []; + protected $casts = [ + 'force_server_cleanup' => 'boolean', + 'server_cleanup_threshold' => 'integer', + ]; + public function server() { return $this->belongsTo(Server::class); } -} +} \ No newline at end of file From f1f6dea04ff51714f0742c4aa601220d62093142 Mon Sep 17 00:00:00 2001 From: ayntk-ai <122374094+ayntk-ai@users.noreply.github.com> Date: Wed, 14 Aug 2024 21:54:46 +0200 Subject: [PATCH 12/16] updated cron validation for the case of null, return false --- bootstrap/helpers/shared.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php index aae4fafd4..6e0f6dd35 100644 --- a/bootstrap/helpers/shared.php +++ b/bootstrap/helpers/shared.php @@ -355,9 +355,17 @@ function isCloud(): bool function validate_cron_expression($expression_to_validate): bool { + if ($expression_to_validate === null || $expression_to_validate === '') { + return false; + } + $isValid = false; - $expression = new CronExpression($expression_to_validate); - $isValid = $expression->isValid(); + try { + $expression = new CronExpression($expression_to_validate); + $isValid = $expression->isValid(); + } catch (\Exception $e) { + return false; + } if (isset(VALID_CRON_STRINGS[$expression_to_validate])) { $isValid = true; From 4ab13ecf00f000dcc9517f7d278507c5c35db95f Mon Sep 17 00:00:00 2001 From: ayntk-ai <122374094+ayntk-ai@users.noreply.github.com> Date: Sun, 18 Aug 2024 22:08:37 +0200 Subject: [PATCH 13/16] revert wrong branch :) --- bootstrap/helpers/shared.php | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php index 6e0f6dd35..aae4fafd4 100644 --- a/bootstrap/helpers/shared.php +++ b/bootstrap/helpers/shared.php @@ -355,17 +355,9 @@ function isCloud(): bool function validate_cron_expression($expression_to_validate): bool { - if ($expression_to_validate === null || $expression_to_validate === '') { - return false; - } - $isValid = false; - try { - $expression = new CronExpression($expression_to_validate); - $isValid = $expression->isValid(); - } catch (\Exception $e) { - return false; - } + $expression = new CronExpression($expression_to_validate); + $isValid = $expression->isValid(); if (isset(VALID_CRON_STRINGS[$expression_to_validate])) { $isValid = true; From 5d32bd250bc245b597455733425d67003abe24db Mon Sep 17 00:00:00 2001 From: ayntk-ai <122374094+ayntk-ai@users.noreply.github.com> Date: Sun, 18 Aug 2024 22:41:06 +0200 Subject: [PATCH 14/16] Fix cleanup Docker according to feedback --- app/Actions/Server/CleanupDocker.php | 47 ++++++++++++---------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/app/Actions/Server/CleanupDocker.php b/app/Actions/Server/CleanupDocker.php index 82515ab6b..b38e5765b 100644 --- a/app/Actions/Server/CleanupDocker.php +++ b/app/Actions/Server/CleanupDocker.php @@ -11,36 +11,29 @@ class CleanupDocker public function handle(Server $server, bool $force = true) { - $commonCommands = [ - 'docker container prune -f --filter "label=coolify.managed=true"', - 'docker image prune -f', - 'docker builder prune -f', - 'docker network prune -f', - ]; - - $forceCommands = [ - 'docker container rm $(docker container ls -aq --filter status=exited --filter status=created)', - 'docker image prune -af', - 'docker builder prune -af', - 'docker system prune -af', - 'docker network prune -f', - ]; - - $additionalCommands = [ - 'docker rmi $(docker images -f "dangling=true" -q)', - 'docker network rm $(docker network ls -q -f "unused=true")', - 'docker system prune -f', - ]; - - if ($force) { - $commands = array_merge($forceCommands, $commonCommands, $additionalCommands); - $commands[] = 'docker rm $(docker ps -a -q --filter status=exited --filter status=created)'; - } else { - $commands = array_merge($commonCommands, $additionalCommands); - } + $commands = $this->getCommands($force); foreach ($commands as $command) { instant_remote_process([$command], $server, false); } } + + private function getCommands(bool $force): array + { + $commonCommands = [ + 'docker container prune -f --filter "label=coolify.managed=true"', + 'docker image prune -f', + 'docker builder prune -f', + ]; + + if ($force) { + return array_merge([ + 'docker container rm $(docker container ls -aq --filter status=exited --filter "label=coolify.managed=true")', + 'docker image prune -af', + 'docker builder prune -af', + ], $commonCommands); + } + + return $commonCommands; + } } From 012c23586d5f8b4a54be9f442432320739200d62 Mon Sep 17 00:00:00 2001 From: ayntk-ai <122374094+ayntk-ai@users.noreply.github.com> Date: Sun, 18 Aug 2024 23:16:59 +0200 Subject: [PATCH 15/16] rename to docker cleanup and and feedback implementation --- app/Console/Kernel.php | 17 ++++++++--------- app/Jobs/DockerCleanupJob.php | 4 ++-- app/Livewire/Server/Form.php | 18 +++++++++--------- app/Models/ServerSetting.php | 8 ++++---- ...cleanup_fields_to_server_settings_table.php | 12 ++++++------ resources/views/livewire/server/form.blade.php | 9 ++++----- 6 files changed, 33 insertions(+), 35 deletions(-) diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 252d23021..073f5898d 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -29,8 +29,6 @@ class Kernel extends ConsoleKernel { $this->all_servers = Server::all(); $settings = InstanceSettings::get(); - $mainServer = Server::find(0); - $serverSettings = $mainServer->settings; if (isDev()) { // Instance Jobs @@ -44,10 +42,10 @@ class Kernel extends ConsoleKernel } else { // Instance Jobs $schedule->command('horizon:snapshot')->everyFiveMinutes(); - $schedule->command('cleanup:unreachable-servers')->cron($serverSettings->server_cleanup_frequency)->onOneServer(); + $schedule->command('cleanup:unreachable-servers')->daily()->onOneServer(); $schedule->job(new PullCoolifyImageJob)->cron($settings->update_check_frequency)->onOneServer(); $schedule->job(new PullTemplatesFromCDN)->cron($settings->update_check_frequency)->onOneServer(); - $schedule->job(new CleanupInstanceStuffsJob)->cron($serverSettings->server_cleanup_frequency)->onOneServer(); + $schedule->job(new CleanupInstanceStuffsJob)->everyTwoMinutes()->onOneServer(); $this->schedule_updates($schedule); // Server Jobs @@ -57,7 +55,7 @@ class Kernel extends ConsoleKernel $this->check_scheduled_tasks($schedule); $schedule->command('cleanup:database --yes')->daily(); - $schedule->command('uploads:clear')->cron($serverSettings->server_cleanup_frequency)->onOneServer(); + $schedule->command('uploads:clear')->everyTwoMinutes(); } } @@ -95,9 +93,6 @@ class Kernel extends ConsoleKernel private function check_resources($schedule) { - $mainServer = Server::find(0); - $serverSettings = $mainServer->settings; - if (isCloud()) { $servers = $this->all_servers->whereNotNull('team.subscription')->where('team.subscription.stripe_trial_already_ended', false)->where('ip', '!=', '1.2.3.4'); $own = Team::find(0)->servers; @@ -107,7 +102,11 @@ class Kernel extends ConsoleKernel } foreach ($servers as $server) { $schedule->job(new ServerCheckJob($server))->everyMinute()->onOneServer(); - $schedule->job(new DockerCleanupJob($server))->cron($serverSettings->server_cleanup_frequency)->onOneServer(); + //The lines below need to be added as soon as timzone is merged!! + //$serverTimezone = $server->settings->server_timezone; + //$schedule->job(new DockerCleanupJob($server))->cron($server->settings->docker_cleanup_frequency)->timezone($serverTimezone)->onOneServer(); + $schedule->job(new DockerCleanupJob($server))->cron($server->settings->docker_cleanup_frequency)->onOneServer(); + } } diff --git a/app/Jobs/DockerCleanupJob.php b/app/Jobs/DockerCleanupJob.php index 9736ed026..a44d283ce 100644 --- a/app/Jobs/DockerCleanupJob.php +++ b/app/Jobs/DockerCleanupJob.php @@ -29,7 +29,7 @@ class DockerCleanupJob implements ShouldBeEncrypted, ShouldQueue if (! $this->server->isFunctional()) { return; } - if ($this->server->settings->is_force_cleanup_enabled) { + if ($this->server->settings->force_docker_cleanup) { Log::info('DockerCleanupJob force cleanup on ' . $this->server->name); CleanupDocker::run(server: $this->server, force: true); @@ -60,4 +60,4 @@ class DockerCleanupJob implements ShouldBeEncrypted, ShouldQueue throw $e; } } -} +} \ No newline at end of file diff --git a/app/Livewire/Server/Form.php b/app/Livewire/Server/Form.php index 1e959ae0b..2c96a4f16 100644 --- a/app/Livewire/Server/Form.php +++ b/app/Livewire/Server/Form.php @@ -45,9 +45,9 @@ class Form extends Component 'server.settings.metrics_history_days' => 'required|integer|min:1', 'wildcard_domain' => 'nullable|url', 'server.settings.is_server_api_enabled' => 'required|boolean', - 'server.settings.force_server_cleanup' => 'required|boolean', - 'server.settings.server_cleanup_frequency' => 'required_if:server.settings.force_server_cleanup,true|string', - 'server.settings.server_cleanup_threshold' => 'required_if:server.settings.force_server_cleanup,false|integer|min:1|max:100', + 'server.settings.force_docker_cleanup' => 'required|boolean', + 'server.settings.docker_cleanup_frequency' => 'required_if:server.settings.force_docker_cleanup,true|string', + 'server.settings.docker_cleanup_threshold' => 'required_if:server.settings.force_docker_cleanup,false|integer|min:1|max:100', ]; protected $validationAttributes = [ @@ -73,17 +73,17 @@ class Form extends Component public function mount() { $this->wildcard_domain = $this->server->settings->wildcard_domain; - $this->server->settings->server_cleanup_threshold = $this->server->settings->server_cleanup_threshold; - $this->server->settings->server_cleanup_frequency = $this->server->settings->server_cleanup_frequency; + $this->server->settings->docker_cleanup_threshold = $this->server->settings->docker_cleanup_threshold; + $this->server->settings->docker_cleanup_frequency = $this->server->settings->docker_cleanup_frequency; } public function updated($field) { - if ($field === 'server.settings.server_cleanup_frequency') { - $frequency = $this->server->settings->server_cleanup_frequency; + if ($field === 'server.settings.docker_cleanup_frequency') { + $frequency = $this->server->settings->docker_cleanup_frequency; if (empty($frequency) || !validate_cron_expression($frequency)) { - $this->dispatch('error', 'Invalid Cron / Human expression for Server Cleanup Frequency. Resetting to default 10 minutes.'); - $this->server->settings->server_cleanup_frequency = '*/10 * * * *'; + $this->dispatch('error', 'Invalid Cron / Human expression for Docker Cleanup Frequency. Resetting to default 10 minutes.'); + $this->server->settings->docker_cleanup_frequency = '*/10 * * * *'; } } } diff --git a/app/Models/ServerSetting.php b/app/Models/ServerSetting.php index 1521fab3f..6ef7f46ee 100644 --- a/app/Models/ServerSetting.php +++ b/app/Models/ServerSetting.php @@ -37,8 +37,8 @@ use OpenApi\Attributes as OA; 'metrics_history_days' => ['type' => 'integer'], 'metrics_refresh_rate_seconds' => ['type' => 'integer'], 'metrics_token' => ['type' => 'string'], - 'server_cleanup_frequency' => ['type' => 'string'], - 'server_cleanup_threshold' => ['type' => 'integer'], + 'docker_cleanup_frequency' => ['type' => 'string'], + 'docker_cleanup_threshold' => ['type' => 'integer'], 'server_id' => ['type' => 'integer'], 'wildcard_domain' => ['type' => 'string'], 'created_at' => ['type' => 'string'], @@ -50,8 +50,8 @@ class ServerSetting extends Model protected $guarded = []; protected $casts = [ - 'force_server_cleanup' => 'boolean', - 'server_cleanup_threshold' => 'integer', + 'force_docker_cleanup' => 'boolean', + 'docker_cleanup_threshold' => 'integer', ]; public function server() diff --git a/database/migrations/2024_08_09_215659_add_server_cleanup_fields_to_server_settings_table.php b/database/migrations/2024_08_09_215659_add_server_cleanup_fields_to_server_settings_table.php index b1c1881e9..4e1bfb357 100644 --- a/database/migrations/2024_08_09_215659_add_server_cleanup_fields_to_server_settings_table.php +++ b/database/migrations/2024_08_09_215659_add_server_cleanup_fields_to_server_settings_table.php @@ -14,9 +14,9 @@ class AddServerCleanupFieldsToServerSettingsTable extends Migration public function up() { Schema::table('server_settings', function (Blueprint $table) { - $table->boolean('force_server_cleanup')->default(false); - $table->string('server_cleanup_frequency')->default('*/10 * * * *'); - $table->integer('server_cleanup_threshold')->default(80); + $table->boolean('force_docker_cleanup')->default(false); + $table->string('docker_cleanup_frequency')->default('*/10 * * * *'); + $table->integer('docker_cleanup_threshold')->default(80); // Remove old columns @@ -33,9 +33,9 @@ class AddServerCleanupFieldsToServerSettingsTable extends Migration public function down() { Schema::table('server_settings', function (Blueprint $table) { - $table->dropColumn('force_server_cleanup'); - $table->dropColumn('server_cleanup_frequency'); - $table->dropColumn('server_cleanup_threshold'); + $table->dropColumn('force_docker_cleanup'); + $table->dropColumn('docker_cleanup_frequency'); + $table->dropColumn('docker_cleanup_threshold'); // Add back old columns diff --git a/resources/views/livewire/server/form.blade.php b/resources/views/livewire/server/form.blade.php index 5408ab2b4..ee8855321 100644 --- a/resources/views/livewire/server/form.blade.php +++ b/resources/views/livewire/server/form.blade.php @@ -126,12 +126,11 @@
- -
- @if ($server->settings->force_server_cleanup) - +
+ @if ($server->settings->force_docker_cleanup) + @else - + @endif
From 0337c4e79d628d3a56ccd7ac030190d082ec1d81 Mon Sep 17 00:00:00 2001 From: ayntk-ai <122374094+ayntk-ai@users.noreply.github.com> Date: Sun, 18 Aug 2024 23:27:24 +0200 Subject: [PATCH 16/16] Fix submit method naming --- app/Livewire/Server/Form.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Livewire/Server/Form.php b/app/Livewire/Server/Form.php index 2c96a4f16..7c176c952 100644 --- a/app/Livewire/Server/Form.php +++ b/app/Livewire/Server/Form.php @@ -203,10 +203,10 @@ class Form extends Component } refresh_server_connection($this->server->privateKey); $this->server->settings->wildcard_domain = $this->wildcard_domain; - if ($this->server->settings->force_server_cleanup) { - $this->server->settings->server_cleanup_frequency = $this->server->settings->server_cleanup_frequency; + if ($this->server->settings->force_docker_cleanup) { + $this->server->settings->docker_cleanup_frequency = $this->server->settings->docker_cleanup_frequency; } else { - $this->server->settings->server_cleanup_threshold = $this->server->settings->server_cleanup_threshold; + $this->server->settings->docker_cleanup_threshold = $this->server->settings->docker_cleanup_threshold; } $this->server->settings->save(); $this->server->save();