add logic

This commit is contained in:
ayntk-ai 2024-08-16 16:01:41 +02:00
parent d906bb2381
commit dab5f0fe09
No known key found for this signature in database
4 changed files with 97 additions and 44 deletions

View File

@ -30,70 +30,74 @@ protected function schedule(Schedule $schedule): void
$this->all_servers = Server::all(); $this->all_servers = Server::all();
$settings = InstanceSettings::get(); $settings = InstanceSettings::get();
$serverTimezone = $this->getServerTimezone();
if (isDev()) { if (isDev()) {
// Instance Jobs // Instance Jobs
$schedule->command('horizon:snapshot')->everyMinute()->timezone($serverTimezone); $schedule->command('horizon:snapshot')->everyMinute();
$schedule->job(new CleanupInstanceStuffsJob)->everyMinute()->onOneServer()->timezone($serverTimezone); $schedule->job(new CleanupInstanceStuffsJob)->everyMinute()->onOneServer();
// Server Jobs // Server Jobs
$this->check_scheduled_backups($schedule, $serverTimezone); $this->check_scheduled_backups($schedule);
$this->check_resources($schedule, $serverTimezone); $this->check_resources($schedule);
$this->check_scheduled_tasks($schedule, $serverTimezone); $this->check_scheduled_tasks($schedule);
$schedule->command('uploads:clear')->everyTwoMinutes()->timezone($serverTimezone); $schedule->command('uploads:clear')->everyTwoMinutes();
} else { } else {
// Instance Jobs // Instance Jobs
$schedule->command('horizon:snapshot')->everyFiveMinutes()->timezone($serverTimezone); $schedule->command('horizon:snapshot')->everyFiveMinutes();
$schedule->command('cleanup:unreachable-servers')->daily()->timezone($serverTimezone); $schedule->command('cleanup:unreachable-servers')->daily();
$schedule->job(new PullCoolifyImageJob)->cron($settings->update_check_frequency)->onOneServer()->timezone($serverTimezone); $schedule->job(new PullCoolifyImageJob)->cron($settings->update_check_frequency)->timezone($settings->instance_timezone)->onOneServer();
$schedule->job(new PullTemplatesFromCDN)->cron($settings->update_check_frequency)->onOneServer()->timezone($serverTimezone); $schedule->job(new PullTemplatesFromCDN)->cron($settings->update_check_frequency)->timezone($settings->instance_timezone)->onOneServer();
$schedule->job(new CleanupInstanceStuffsJob)->everyTwoMinutes()->onOneServer()->timezone($serverTimezone); $schedule->job(new CleanupInstanceStuffsJob)->everyTwoMinutes()->onOneServer();
$this->schedule_updates($schedule, $serverTimezone); $this->schedule_updates($schedule);
// Server Jobs // Server Jobs
$this->check_scheduled_backups($schedule, $serverTimezone); $this->check_scheduled_backups($schedule);
$this->check_resources($schedule, $serverTimezone); $this->check_resources($schedule);
$this->pull_images($schedule, $serverTimezone); $this->pull_images($schedule);
$this->check_scheduled_tasks($schedule, $serverTimezone); $this->check_scheduled_tasks($schedule);
$schedule->command('cleanup:database --yes')->daily()->timezone($serverTimezone); $schedule->command('cleanup:database --yes')->daily();
$schedule->command('uploads:clear')->everyTwoMinutes()->timezone($serverTimezone); $schedule->command('uploads:clear')->everyTwoMinutes();
} }
} }
private function getServerTimezone() private function pull_images($schedule)
{
$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)
{ {
$settings = InstanceSettings::get(); $settings = InstanceSettings::get();
$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()->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(); $settings = InstanceSettings::get();
$updateCheckFrequency = $settings->update_check_frequency; $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) { if ($settings->is_auto_update_enabled) {
$autoUpdateFrequency = $settings->auto_update_frequency; $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()) { 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');
@ -103,12 +107,16 @@ private function check_resources($schedule, $serverTimezone)
$servers = $this->all_servers->where('ip', '!=', '1.2.3.4'); $servers = $this->all_servers->where('ip', '!=', '1.2.3.4');
} }
foreach ($servers as $server) { foreach ($servers as $server) {
$schedule->job(new ServerCheckJob($server))->everyMinute()->onOneServer()->timezone($serverTimezone); $schedule->job(new ServerCheckJob($server))->everyMinute()->onOneServer();
$schedule->job(new DockerCleanupJob($server))->everyTenMinutes()->onOneServer()->timezone($serverTimezone); $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(); $scheduled_backups = ScheduledDatabaseBackup::all();
if ($scheduled_backups->isEmpty()) { if ($scheduled_backups->isEmpty()) {
@ -121,20 +129,22 @@ private function check_scheduled_backups($schedule, $serverTimezone)
if (is_null(data_get($scheduled_backup, 'database'))) { if (is_null(data_get($scheduled_backup, 'database'))) {
ray('database not found'); ray('database not found');
$scheduled_backup->delete(); $scheduled_backup->delete();
continue; continue;
} }
$server = $scheduled_backup->server();
$serverTimezone = $server->settings->server_timezone;
if (isset(VALID_CRON_STRINGS[$scheduled_backup->frequency])) { if (isset(VALID_CRON_STRINGS[$scheduled_backup->frequency])) {
$scheduled_backup->frequency = VALID_CRON_STRINGS[$scheduled_backup->frequency]; $scheduled_backup->frequency = VALID_CRON_STRINGS[$scheduled_backup->frequency];
} }
$schedule->job(new DatabaseBackupJob( $schedule->job(new DatabaseBackupJob(
backup: $scheduled_backup 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(); $scheduled_tasks = ScheduledTask::all();
if ($scheduled_tasks->isEmpty()) { if ($scheduled_tasks->isEmpty()) {
@ -147,7 +157,7 @@ private function check_scheduled_tasks($schedule, $serverTimezone)
$service = $scheduled_task->service; $service = $scheduled_task->service;
$application = $scheduled_task->application; $application = $scheduled_task->application;
if (!$application && !$service) { if (! $application && ! $service) {
ray('application/service attached to scheduled task does not exist'); ray('application/service attached to scheduled task does not exist');
$scheduled_task->delete(); $scheduled_task->delete();
continue; continue;
@ -162,6 +172,10 @@ private function check_scheduled_tasks($schedule, $serverTimezone)
continue; continue;
} }
} }
$server = $scheduled_task->server();
$serverTimezone = $server->settings->server_timezone ?: config('app.timezone');
if (isset(VALID_CRON_STRINGS[$scheduled_task->frequency])) { if (isset(VALID_CRON_STRINGS[$scheduled_task->frequency])) {
$scheduled_task->frequency = 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 protected function commands(): void
{ {
$this->load(__DIR__.'/Commands'); $this->load(__DIR__ . '/Commands');
require base_path('routes/console.php'); require base_path('routes/console.php');
} }

View File

@ -49,7 +49,16 @@ public function __construct($task)
throw new \RuntimeException('ScheduledTaskJob failed: No resource found.'); throw new \RuntimeException('ScheduledTaskJob failed: No resource found.');
} }
$this->team = Team::find($task->team_id); $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 public function middleware(): array

View File

@ -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(); 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;
}
} }

View File

@ -28,4 +28,16 @@ public function executions(): HasMany
{ {
return $this->hasMany(ScheduledTaskExecution::class); 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;
}
} }