From dab5f0fe093dafcdcdf701954c39268bcdf24256 Mon Sep 17 00:00:00 2001 From: ayntk-ai <122374094+ayntk-ai@users.noreply.github.com> Date: Fri, 16 Aug 2024 16:01:41 +0200 Subject: [PATCH] add logic --- app/Console/Kernel.php | 96 +++++++++++++++----------- app/Jobs/ScheduledTaskJob.php | 11 ++- app/Models/ScheduledDatabaseBackup.php | 20 +++++- app/Models/ScheduledTask.php | 14 +++- 4 files changed, 97 insertions(+), 44 deletions(-) diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 8cfcb0168..3140de52c 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -30,70 +30,74 @@ protected function schedule(Schedule $schedule): void $this->all_servers = Server::all(); $settings = InstanceSettings::get(); - $serverTimezone = $this->getServerTimezone(); - if (isDev()) { // Instance Jobs - $schedule->command('horizon:snapshot')->everyMinute()->timezone($serverTimezone); - $schedule->job(new CleanupInstanceStuffsJob)->everyMinute()->onOneServer()->timezone($serverTimezone); + $schedule->command('horizon:snapshot')->everyMinute(); + $schedule->job(new CleanupInstanceStuffsJob)->everyMinute()->onOneServer(); // Server Jobs - $this->check_scheduled_backups($schedule, $serverTimezone); - $this->check_resources($schedule, $serverTimezone); - $this->check_scheduled_tasks($schedule, $serverTimezone); - $schedule->command('uploads:clear')->everyTwoMinutes()->timezone($serverTimezone); + $this->check_scheduled_backups($schedule); + $this->check_resources($schedule); + $this->check_scheduled_tasks($schedule); + $schedule->command('uploads:clear')->everyTwoMinutes(); } else { // Instance Jobs - $schedule->command('horizon:snapshot')->everyFiveMinutes()->timezone($serverTimezone); - $schedule->command('cleanup:unreachable-servers')->daily()->timezone($serverTimezone); - $schedule->job(new PullCoolifyImageJob)->cron($settings->update_check_frequency)->onOneServer()->timezone($serverTimezone); - $schedule->job(new PullTemplatesFromCDN)->cron($settings->update_check_frequency)->onOneServer()->timezone($serverTimezone); - $schedule->job(new CleanupInstanceStuffsJob)->everyTwoMinutes()->onOneServer()->timezone($serverTimezone); - $this->schedule_updates($schedule, $serverTimezone); + $schedule->command('horizon:snapshot')->everyFiveMinutes(); + $schedule->command('cleanup:unreachable-servers')->daily(); + $schedule->job(new PullCoolifyImageJob)->cron($settings->update_check_frequency)->timezone($settings->instance_timezone)->onOneServer(); + $schedule->job(new PullTemplatesFromCDN)->cron($settings->update_check_frequency)->timezone($settings->instance_timezone)->onOneServer(); + $schedule->job(new CleanupInstanceStuffsJob)->everyTwoMinutes()->onOneServer(); + $this->schedule_updates($schedule); // Server Jobs - $this->check_scheduled_backups($schedule, $serverTimezone); - $this->check_resources($schedule, $serverTimezone); - $this->pull_images($schedule, $serverTimezone); - $this->check_scheduled_tasks($schedule, $serverTimezone); + $this->check_scheduled_backups($schedule); + $this->check_resources($schedule); + $this->pull_images($schedule); + $this->check_scheduled_tasks($schedule); - $schedule->command('cleanup:database --yes')->daily()->timezone($serverTimezone); - $schedule->command('uploads:clear')->everyTwoMinutes()->timezone($serverTimezone); + $schedule->command('cleanup:database --yes')->daily(); + $schedule->command('uploads:clear')->everyTwoMinutes(); } } - private function getServerTimezone() - { - $server = Server::find(0); // Only main server is used for scheduling tasks, not each server timezone? - return $server->settings->server_timezone; - } - - private function pull_images($schedule, $serverTimezone) + private function pull_images($schedule) { $settings = InstanceSettings::get(); $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()->timezone($serverTimezone); + $schedule->job(new PullSentinelImageJob($server)) + ->cron($settings->update_check_frequency) + ->timezone($settings->instance_timezone) + ->onOneServer(); } - $schedule->job(new PullHelperImageJob($server))->cron($settings->update_check_frequency)->onOneServer()->timezone($serverTimezone); + $schedule->job(new PullHelperImageJob($server)) + ->cron($settings->update_check_frequency) + ->timezone($settings->instance_timezone) + ->onOneServer(); } } - private function schedule_updates($schedule, $serverTimezone) + private function schedule_updates($schedule) { $settings = InstanceSettings::get(); $updateCheckFrequency = $settings->update_check_frequency; - $schedule->job(new CheckForUpdatesJob)->cron($updateCheckFrequency)->onOneServer()->timezone($serverTimezone); + $schedule->job(new CheckForUpdatesJob) + ->cron($updateCheckFrequency) + ->timezone($settings->instance_timezone) + ->onOneServer(); if ($settings->is_auto_update_enabled) { $autoUpdateFrequency = $settings->auto_update_frequency; - $schedule->job(new UpdateCoolifyJob)->cron($autoUpdateFrequency)->onOneServer()->timezone($serverTimezone); + $schedule->job(new UpdateCoolifyJob) + ->cron($autoUpdateFrequency) + ->timezone($settings->instance_timezone) + ->onOneServer(); } } - private function check_resources($schedule, $serverTimezone) + private function check_resources($schedule) { if (isCloud()) { $servers = $this->all_servers->whereNotNull('team.subscription')->where('team.subscription.stripe_trial_already_ended', false)->where('ip', '!=', '1.2.3.4'); @@ -103,12 +107,16 @@ private function check_resources($schedule, $serverTimezone) $servers = $this->all_servers->where('ip', '!=', '1.2.3.4'); } foreach ($servers as $server) { - $schedule->job(new ServerCheckJob($server))->everyMinute()->onOneServer()->timezone($serverTimezone); - $schedule->job(new DockerCleanupJob($server))->everyTenMinutes()->onOneServer()->timezone($serverTimezone); + $schedule->job(new ServerCheckJob($server))->everyMinute()->onOneServer(); + $serverTimezone = $server->settings->server_timezone; + $schedule->job(new DockerCleanupJob($server)) + ->everyTenMinutes() //will be changed in the second PR + ->timezone($serverTimezone) + ->onOneServer(); } } - private function check_scheduled_backups($schedule, $serverTimezone) + private function check_scheduled_backups($schedule) { $scheduled_backups = ScheduledDatabaseBackup::all(); if ($scheduled_backups->isEmpty()) { @@ -121,20 +129,22 @@ private function check_scheduled_backups($schedule, $serverTimezone) if (is_null(data_get($scheduled_backup, 'database'))) { ray('database not found'); $scheduled_backup->delete(); - continue; } + $server = $scheduled_backup->server(); + $serverTimezone = $server->settings->server_timezone; + if (isset(VALID_CRON_STRINGS[$scheduled_backup->frequency])) { $scheduled_backup->frequency = VALID_CRON_STRINGS[$scheduled_backup->frequency]; } $schedule->job(new DatabaseBackupJob( backup: $scheduled_backup - ))->cron($scheduled_backup->frequency)->onOneServer()->timezone($serverTimezone); + ))->cron($scheduled_backup->frequency)->timezone($serverTimezone)->onOneServer(); } } - private function check_scheduled_tasks($schedule, $serverTimezone) + private function check_scheduled_tasks($schedule) { $scheduled_tasks = ScheduledTask::all(); if ($scheduled_tasks->isEmpty()) { @@ -147,7 +157,7 @@ private function check_scheduled_tasks($schedule, $serverTimezone) $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(); continue; @@ -162,6 +172,10 @@ private function check_scheduled_tasks($schedule, $serverTimezone) continue; } } + + $server = $scheduled_task->server(); + $serverTimezone = $server->settings->server_timezone ?: config('app.timezone'); + if (isset(VALID_CRON_STRINGS[$scheduled_task->frequency])) { $scheduled_task->frequency = VALID_CRON_STRINGS[$scheduled_task->frequency]; } @@ -173,7 +187,7 @@ private function check_scheduled_tasks($schedule, $serverTimezone) protected function commands(): void { - $this->load(__DIR__.'/Commands'); + $this->load(__DIR__ . '/Commands'); require base_path('routes/console.php'); } diff --git a/app/Jobs/ScheduledTaskJob.php b/app/Jobs/ScheduledTaskJob.php index 2e8bf4015..3daaa9e83 100644 --- a/app/Jobs/ScheduledTaskJob.php +++ b/app/Jobs/ScheduledTaskJob.php @@ -49,7 +49,16 @@ public function __construct($task) throw new \RuntimeException('ScheduledTaskJob failed: No resource found.'); } $this->team = Team::find($task->team_id); - $this->server_timezone = $this->resource->destination->server->settings->server_timezone; + $this->server_timezone = $this->getServerTimezone(); + } + + private function getServerTimezone(): string + { + if ($this->resource instanceof Application) { + return $this->resource->destination->server->settings->server_timezone; + } elseif ($this->resource instanceof Service) { + return $this->resource->server->settings->server_timezone; + } } public function middleware(): array diff --git a/app/Models/ScheduledDatabaseBackup.php b/app/Models/ScheduledDatabaseBackup.php index edd840e7d..a512a3f5f 100644 --- a/app/Models/ScheduledDatabaseBackup.php +++ b/app/Models/ScheduledDatabaseBackup.php @@ -34,4 +34,22 @@ public function get_last_days_backup_status($days = 7) { return $this->hasMany(ScheduledDatabaseBackupExecution::class)->where('created_at', '>=', now()->subDays($days))->get(); } -} + + public function server() + { + $database = $this->database; + if (!$database) { + return null; + } + + if (method_exists($database, 'server')) { + return $database->server; + } + + if (method_exists($database, 'service') && $database->service) { + return $database->service->server; + } + + return null; + } +} \ No newline at end of file diff --git a/app/Models/ScheduledTask.php b/app/Models/ScheduledTask.php index 1cb805e8e..35b00873e 100644 --- a/app/Models/ScheduledTask.php +++ b/app/Models/ScheduledTask.php @@ -28,4 +28,16 @@ public function executions(): HasMany { return $this->hasMany(ScheduledTaskExecution::class); } -} + + public function server() + { + if ($this->application) { + return $this->application->server; + } elseif ($this->database) { + return $this->database->server; + } elseif ($this->service) { + return $this->service->server; + } + return null; + } +} \ No newline at end of file