refactor(proxy): improve port availability checks with multiple methods
This commit is contained in:
@@ -30,10 +30,6 @@ class CheckProxy
|
||||
if (is_null($proxyType) || $proxyType === 'NONE' || $server->proxy->force_stop) {
|
||||
return false;
|
||||
}
|
||||
['uptime' => $uptime, 'error' => $error] = $server->validateConnection();
|
||||
if (! $uptime) {
|
||||
throw new \Exception($error);
|
||||
}
|
||||
if (! $server->isProxyShouldRun()) {
|
||||
if ($fromUI) {
|
||||
throw new \Exception('Proxy should not run. You selected the Custom Proxy.');
|
||||
@@ -68,6 +64,38 @@ class CheckProxy
|
||||
|
||||
$portsToCheck = ['80', '443'];
|
||||
|
||||
foreach ($portsToCheck as $port) {
|
||||
// Try multiple methods to check port availability
|
||||
$commands = [
|
||||
// Method 1: Check /proc/net/tcp directly (convert port to hex)
|
||||
"cat /proc/net/tcp | grep -q '00000000:".str_pad(dechex($port), 4, '0', STR_PAD_LEFT)."'",
|
||||
// Method 2: Use ss command (modern alternative to netstat)
|
||||
"ss -tuln | grep -q ':$port '",
|
||||
// Method 3: Use lsof if available
|
||||
"lsof -i :$port >/dev/null 2>&1",
|
||||
// Method 4: Use fuser if available
|
||||
"fuser $port/tcp >/dev/null 2>&1",
|
||||
];
|
||||
|
||||
$portInUse = false;
|
||||
foreach ($commands as $command) {
|
||||
try {
|
||||
instant_remote_process([$command], $server);
|
||||
$portInUse = true;
|
||||
break;
|
||||
} catch (\Throwable $e) {
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if ($portInUse) {
|
||||
if ($fromUI) {
|
||||
throw new \Exception("Port $port is in use.<br>You must stop the process using this port.<br><br>Docs: <a target='_blank' class='dark:text-white hover:underline' href='https://coolify.io/docs'>https://coolify.io/docs</a><br>Discord: <a target='_blank' class='dark:text-white hover:underline' href='https://coolify.io/discord'>https://coolify.io/discord</a>");
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
try {
|
||||
if ($server->proxyType() !== ProxyTypes::NONE->value) {
|
||||
$proxyCompose = CheckConfiguration::run($server);
|
||||
@@ -94,16 +122,6 @@ class CheckProxy
|
||||
if (count($portsToCheck) === 0) {
|
||||
return false;
|
||||
}
|
||||
foreach ($portsToCheck as $port) {
|
||||
$connection = @fsockopen($ip, $port);
|
||||
if (is_resource($connection) && fclose($connection)) {
|
||||
if ($fromUI) {
|
||||
throw new \Exception("Port $port is in use.<br>You must stop the process using this port.<br>Docs: <a target='_blank' href='https://coolify.io/docs'>https://coolify.io/docs</a><br>Discord: <a target='_blank' href='https://coollabs.io/discord'>https://coollabs.io/discord</a>");
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user