From 1b68f11ec0864f3de0a7dac017b2fd68aec0d6f3 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Sun, 31 May 2026 21:47:18 +0200 Subject: [PATCH] fix(cleanup): disable unreachable self-hosted servers Preserve self-hosted server IPs during unreachable cleanup and force-disable them instead. Keep cloud cleanup behavior overwriting the IP, with test coverage for both paths. --- .../Commands/CleanupUnreachableServers.php | 10 +++++-- .../Feature/CleanupUnreachableServersTest.php | 28 ++++++++++++++++++- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/app/Console/Commands/CleanupUnreachableServers.php b/app/Console/Commands/CleanupUnreachableServers.php index 09563a2c3..666e98a18 100644 --- a/app/Console/Commands/CleanupUnreachableServers.php +++ b/app/Console/Commands/CleanupUnreachableServers.php @@ -18,9 +18,13 @@ public function handle() if ($servers->count() > 0) { foreach ($servers as $server) { echo "Cleanup unreachable server ($server->id) with name $server->name"; - $server->update([ - 'ip' => '1.2.3.4', - ]); + if (isCloud()) { + $server->update([ + 'ip' => '1.2.3.4', + ]); + } else { + $server->forceDisableServer(); + } } } } diff --git a/tests/Feature/CleanupUnreachableServersTest.php b/tests/Feature/CleanupUnreachableServersTest.php index c06944969..8849b1ca0 100644 --- a/tests/Feature/CleanupUnreachableServersTest.php +++ b/tests/Feature/CleanupUnreachableServersTest.php @@ -6,7 +6,30 @@ uses(RefreshDatabase::class); -it('cleans up servers with unreachable_count >= 3 after 7 days', function () { +it('disables (non-destructively) self-hosted servers with unreachable_count >= 3 after 7 days', function () { + config(['constants.coolify.self_hosted' => true]); + + $team = Team::factory()->create(); + $server = Server::factory()->create([ + 'team_id' => $team->id, + 'unreachable_count' => 50, + 'unreachable_notification_sent' => true, + 'updated_at' => now()->subDays(8), + ]); + + $originalIp = (string) $server->ip; + + $this->artisan('cleanup:unreachable-servers')->assertSuccessful(); + + $server->refresh(); + // IP must be preserved — never overwritten on self-hosted. + expect($server->ip)->toBe($originalIp); + expect($server->settings->force_disabled)->toBeTrue(); +}); + +it('overwrites the IP with 1.2.3.4 on cloud for servers with unreachable_count >= 3 after 7 days', function () { + config(['constants.coolify.self_hosted' => false]); + $team = Team::factory()->create(); $server = Server::factory()->create([ 'team_id' => $team->id, @@ -36,6 +59,7 @@ $server->refresh(); expect($server->ip)->toBe($originalIp); + expect($server->settings->force_disabled)->toBeFalse(); }); it('does not clean up servers updated within 7 days', function () { @@ -53,6 +77,7 @@ $server->refresh(); expect($server->ip)->toBe($originalIp); + expect($server->settings->force_disabled)->toBeFalse(); }); it('does not clean up servers without notification sent', function () { @@ -70,4 +95,5 @@ $server->refresh(); expect($server->ip)->toBe($originalIp); + expect($server->settings->force_disabled)->toBeFalse(); });