diff --git a/app/Console/Commands/CloudCleanupSubscriptions.php b/app/Console/Commands/CloudCleanupSubscriptions.php index 9198b003ec..9dc6e24f57 100644 --- a/app/Console/Commands/CloudCleanupSubscriptions.php +++ b/app/Console/Commands/CloudCleanupSubscriptions.php @@ -2,6 +2,7 @@ namespace App\Console\Commands; +use App\Events\ServerReachabilityChanged; use App\Models\Team; use Illuminate\Console\Command; @@ -92,6 +93,8 @@ private function disableServers(Team $team) $server->update([ 'ip' => '1.2.3.4', ]); + + ServerReachabilityChanged::dispatch($server); } } } diff --git a/app/Events/ServerReachabilityChanged.php b/app/Events/ServerReachabilityChanged.php new file mode 100644 index 0000000000..fb4680146c --- /dev/null +++ b/app/Events/ServerReachabilityChanged.php @@ -0,0 +1,17 @@ +server->isReachableChanged(); + } +} diff --git a/app/Jobs/ServerCheckJob.php b/app/Jobs/ServerCheckJob.php index 49d8dfe08f..9818d5c6a0 100644 --- a/app/Jobs/ServerCheckJob.php +++ b/app/Jobs/ServerCheckJob.php @@ -31,12 +31,7 @@ public function middleware(): array return [(new WithoutOverlapping($this->server->uuid))->dontRelease()]; } - public function __construct(public Server $server) - { - if (isDev()) { - $this->handle(); - } - } + public function __construct(public Server $server) {} public function handle() { diff --git a/app/Livewire/Server/Show.php b/app/Livewire/Server/Show.php index ac5211c1b0..6d267b9c89 100644 --- a/app/Livewire/Server/Show.php +++ b/app/Livewire/Server/Show.php @@ -4,6 +4,7 @@ use App\Actions\Server\StartSentinel; use App\Actions\Server\StopSentinel; +use App\Events\ServerReachabilityChanged; use App\Models\Server; use Livewire\Attributes\Computed; use Livewire\Attributes\Validate; @@ -202,6 +203,7 @@ public function checkLocalhostConnection() $this->server->settings->is_reachable = $this->isReachable = true; $this->server->settings->is_usable = $this->isUsable = true; $this->server->settings->save(); + ServerReachabilityChanged::dispatch($this->server); $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); diff --git a/app/Models/Server.php b/app/Models/Server.php index cc82117890..767327b8e4 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -6,6 +6,7 @@ use App\Actions\Server\InstallDocker; use App\Actions\Server\StartSentinel; use App\Enums\ProxyTypes; +use App\Events\ServerReachabilityChanged; use App\Jobs\CheckAndStartSentinelJob; use App\Notifications\Server\Reachable; use App\Notifications\Server\Unreachable; @@ -1024,14 +1025,63 @@ public function isReachableChanged() $this->refresh(); $unreachableNotificationSent = (bool) $this->unreachable_notification_sent; $isReachable = (bool) $this->settings->is_reachable; - // If the server is reachable, send the reachable notification if it was sent before + + \Log::debug('Server reachability check', [ + 'server_id' => $this->id, + 'is_reachable' => $isReachable, + 'notification_sent' => $unreachableNotificationSent, + 'unreachable_count' => $this->unreachable_count, + ]); + if ($isReachable === true) { + $this->unreachable_count = 0; + $this->save(); + if ($unreachableNotificationSent === true) { + \Log::debug('Server is now reachable, sending notification', [ + 'server_id' => $this->id, + ]); $this->sendReachableNotification(); } - } else { - // If the server is unreachable, send the unreachable notification if it was not sent before - if ($unreachableNotificationSent === false) { + + return; + } + + $this->increment('unreachable_count'); + \Log::debug('Incremented unreachable count', [ + 'server_id' => $this->id, + 'new_count' => $this->unreachable_count, + ]); + + if ($this->unreachable_count === 1) { + $this->settings->is_reachable = true; + $this->settings->save(); + \Log::debug('First unreachable attempt, marking as reachable', [ + 'server_id' => $this->id, + ]); + + return; + } + + if ($this->unreachable_count >= 2 && ! $unreachableNotificationSent) { + $failedChecks = 0; + for ($i = 0; $i < 3; $i++) { + $status = $this->serverStatus(); + \Log::debug('Additional reachability check', [ + 'server_id' => $this->id, + 'attempt' => $i + 1, + 'status' => $status, + ]); + sleep(5); + if (! $status) { + $failedChecks++; + } + } + + if ($failedChecks === 3 && ! $unreachableNotificationSent) { + \Log::debug('Server confirmed unreachable after 3 attempts, sending notification', [ + 'server_id' => $this->id, + ]); $this->sendUnreachableNotification(); } } @@ -1065,6 +1115,7 @@ public function validateConnection(bool $justCheckingNewKey = false) if ($this->settings->is_reachable === false) { $this->settings->is_reachable = true; $this->settings->save(); + ServerReachabilityChanged::dispatch($this); } return ['uptime' => true, 'error' => null]; @@ -1075,6 +1126,7 @@ public function validateConnection(bool $justCheckingNewKey = false) if ($this->settings->is_reachable === true) { $this->settings->is_reachable = false; $this->settings->save(); + ServerReachabilityChanged::dispatch($this); } return ['uptime' => false, 'error' => $e->getMessage()]; @@ -1165,6 +1217,7 @@ public function validateDockerEngineVersion() $this->settings->is_reachable = true; $this->settings->is_usable = true; $this->settings->save(); + ServerReachabilityChanged::dispatch($this); return true; } diff --git a/app/Models/ServerSetting.php b/app/Models/ServerSetting.php index e078372e25..f4b776cca0 100644 --- a/app/Models/ServerSetting.php +++ b/app/Models/ServerSetting.php @@ -85,9 +85,6 @@ protected static function booted() ) { $settings->server->restartSentinel(); } - if ($settings->isDirty('is_reachable')) { - $settings->server->isReachableChanged(); - } }); } diff --git a/app/Models/Team.php b/app/Models/Team.php index e55cb0d19d..33847a3c83 100644 --- a/app/Models/Team.php +++ b/app/Models/Team.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Events\ServerReachabilityChanged; use App\Notifications\Channels\SendsDiscord; use App\Notifications\Channels\SendsEmail; use App\Notifications\Channels\SendsPushover; @@ -202,6 +203,7 @@ public function subscriptionEnded() 'is_usable' => false, 'is_reachable' => false, ]); + ServerReachabilityChanged::dispatch($server); } }