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