cron logic

This commit is contained in:
ayntk-ai
2024-08-12 12:42:15 +02:00
parent b738e5c000
commit a5db3b85fa
3 changed files with 56 additions and 27 deletions

View File

@@ -43,10 +43,10 @@ class Kernel extends ConsoleKernel
} else { } else {
// Instance Jobs // Instance Jobs
$schedule->command('horizon:snapshot')->everyFiveMinutes(); $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 PullCoolifyImageJob)->cron($settings->update_check_frequency)->onOneServer();
$schedule->job(new PullTemplatesFromCDN)->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); $this->schedule_updates($schedule);
// Server Jobs // Server Jobs
@@ -56,7 +56,7 @@ class Kernel extends ConsoleKernel
$this->check_scheduled_tasks($schedule); $this->check_scheduled_tasks($schedule);
$schedule->command('cleanup:database --yes')->daily(); $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'); $servers = $this->all_servers->where('settings.is_usable', true)->where('settings.is_reachable', true)->where('ip', '!=', '1.2.3.4');
foreach ($servers as $server) { foreach ($servers as $server) {
if ($server->isSentinelEnabled()) { 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(); $schedule->job(new PullHelperImageJob($server))->cron($settings->update_check_frequency)->onOneServer();
} }
@@ -87,6 +94,7 @@ class Kernel extends ConsoleKernel
private function check_resources($schedule) private function check_resources($schedule)
{ {
$settings = InstanceSettings::get();
if (isCloud()) { if (isCloud()) {
$servers = $this->all_servers->whereNotNull('team.subscription')->where('team.subscription.stripe_trial_already_ended', false)->where('ip', '!=', '1.2.3.4'); $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; $own = Team::find(0)->servers;
@@ -96,7 +104,7 @@ class Kernel extends ConsoleKernel
} }
foreach ($servers as $server) { foreach ($servers as $server) {
$schedule->job(new ServerCheckJob($server))->everyMinute()->onOneServer(); $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();
} }
} }

View File

@@ -12,6 +12,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Cron\CronExpression;
class DockerCleanupJob implements ShouldBeEncrypted, ShouldQueue class DockerCleanupJob implements ShouldBeEncrypted, ShouldQueue
{ {
@@ -21,7 +22,9 @@ class DockerCleanupJob implements ShouldBeEncrypted, ShouldQueue
public int|string|null $usageBefore = null; public int|string|null $usageBefore = null;
public function __construct(public Server $server) {} public function __construct(public Server $server)
{
}
public function handle(): void public function handle(): void
{ {
@@ -29,10 +32,13 @@ class DockerCleanupJob implements ShouldBeEncrypted, ShouldQueue
if (!$this->server->isFunctional()) { if (!$this->server->isFunctional()) {
return; return;
} }
if ($this->server->settings->is_force_cleanup_enabled) { 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); Log::info('DockerCleanupJob force cleanup on ' . $this->server->name);
CleanupDocker::run(server: $this->server, force: true); CleanupDocker::run(server: $this->server, force: true);
}
return; return;
} }
@@ -43,7 +49,7 @@ class DockerCleanupJob implements ShouldBeEncrypted, ShouldQueue
return; 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); CleanupDocker::run(server: $this->server, force: false);
$usageAfter = $this->server->getDiskUsage(); $usageAfter = $this->server->getDiskUsage();
if ($usageAfter < $this->usageBefore) { if ($usageAfter < $this->usageBefore) {

View File

@@ -46,7 +46,7 @@ class Form extends Component
'wildcard_domain' => 'nullable|url', 'wildcard_domain' => 'nullable|url',
'server.settings.is_server_api_enabled' => 'required|boolean', 'server.settings.is_server_api_enabled' => 'required|boolean',
'server.settings.force_server_cleanup' => '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', 'server.settings.server_cleanup_threshold' => 'required|integer|min:1|max:100',
]; ];
@@ -73,7 +73,19 @@ class Form extends Component
public function mount() public function mount()
{ {
$this->wildcard_domain = $this->server->settings->wildcard_domain; $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() 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) { if ($this->server->settings->isDirty('is_server_api_enabled') && $this->server->settings->is_server_api_enabled === true) {
ray('Starting sentinel'); ray('Starting sentinel');
} }
} else { } else {
ray('Sentinel is not enabled'); ray('Sentinel is not enabled');
@@ -192,7 +203,11 @@ class Form extends Component
} }
refresh_server_connection($this->server->privateKey); refresh_server_connection($this->server->privateKey);
$this->server->settings->wildcard_domain = $this->wildcard_domain; $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->settings->save();
$this->server->save(); $this->server->save();
$this->dispatch('success', 'Server updated.'); $this->dispatch('success', 'Server updated.');