Skip to content

Commit

Permalink
fix: parse proxy config and check the set ports usage
Browse files Browse the repository at this point in the history
  • Loading branch information
andrasbacsai committed Oct 3, 2024
1 parent 5bcd813 commit 5f07b47
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 24 deletions.
51 changes: 37 additions & 14 deletions app/Actions/Proxy/CheckProxy.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,17 @@

namespace App\Actions\Proxy;

use App\Enums\ProxyTypes;
use App\Models\Server;
use Lorisleiva\Actions\Concerns\AsAction;
use Symfony\Component\Yaml\Yaml;

class CheckProxy
{
use AsAction;

public function handle(Server $server, $fromUI = false)
// It should return if the proxy should be started (true) or not (false)
public function handle(Server $server, $fromUI = false): bool
{
if (! $server->isFunctional()) {
return false;
Expand Down Expand Up @@ -62,22 +65,42 @@ public function handle(Server $server, $fromUI = false)
$ip = 'host.docker.internal';
}

$connection80 = @fsockopen($ip, '80');
$connection443 = @fsockopen($ip, '443');
$port80 = is_resource($connection80) && fclose($connection80);
$port443 = is_resource($connection443) && fclose($connection443);
if ($port80) {
if ($fromUI) {
throw new \Exception("Port 80 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>");
$portsToCheck = ['80', '443'];

try {
if ($server->proxyType() !== ProxyTypes::NONE->value) {
$proxyCompose = CheckConfiguration::run($server);
if (isset($proxyCompose)) {
$yaml = Yaml::parse($proxyCompose);
$portsToCheck = [];
if ($server->proxyType() === ProxyTypes::TRAEFIK->value) {
$ports = data_get($yaml, 'services.traefik.ports');
} elseif ($server->proxyType() === ProxyTypes::CADDY->value) {
$ports = data_get($yaml, 'services.caddy.ports');
}
if (isset($ports)) {
foreach ($ports as $port) {
$portsToCheck[] = str($port)->before(':')->value();
}
}
}
} else {
return false;
$portsToCheck = [];
}
} catch (\Exception $e) {
ray($e->getMessage());
}
if ($port443) {
if ($fromUI) {
throw new \Exception("Port 443 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;
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;
}
}
}

Expand Down
7 changes: 5 additions & 2 deletions app/Livewire/Server/Proxy/Status.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

use App\Actions\Docker\GetContainersStatus;
use App\Actions\Proxy\CheckProxy;
use App\Jobs\ContainerStatusJob;
use App\Actions\Proxy\StartProxy;
use App\Models\Server;
use Livewire\Component;

Expand Down Expand Up @@ -44,7 +44,10 @@ public function checkProxy(bool $notification = false)
}
$this->numberOfPolls++;
}
CheckProxy::run($this->server, true);
$shouldStart = CheckProxy::run($this->server, true);
if ($shouldStart) {
StartProxy::run($this->server, false);
}
$this->dispatch('proxyStatusUpdated');
if ($this->server->proxy->status === 'running') {
$this->polling = false;
Expand Down
5 changes: 4 additions & 1 deletion resources/views/components/status/restarting.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@
'status' => 'Restarting',
'lastDeploymentInfo' => null,
'lastDeploymentLink' => null,
'noLoading' => false,
])
<div class="flex items-center">
<x-loading wire:loading.delay.longer />
@if (!$noLoading)
<x-loading wire:loading.delay.longer />
@endif
<span wire:loading.remove.delay.longer class="flex items-center">
<div class="badge badge-warning "></div>
<div class="pl-2 pr-1 text-xs font-bold tracking-wider dark:text-warning" @if($lastDeploymentInfo) title="{{$lastDeploymentInfo}}" @endif>
Expand Down
5 changes: 4 additions & 1 deletion resources/views/components/status/running.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@
'status' => 'Running',
'lastDeploymentInfo' => null,
'lastDeploymentLink' => null,
'noLoading' => false,
])
<div class="flex items-center">
<x-loading wire:loading.delay.longer />
@if (!$noLoading)
<x-loading wire:loading.delay.longer />
@endif
<span wire:loading.remove.delay.longer class="flex items-center">
<div class="badge badge-success "></div>
<div class="pl-2 pr-1 text-xs font-bold tracking-wider text-success" @if($lastDeploymentInfo) title="{{$lastDeploymentInfo}}" @endif>
Expand Down
5 changes: 4 additions & 1 deletion resources/views/components/status/stopped.blade.php
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
@props([
'status' => 'Stopped',
'noLoading' => false,
])
<div class="flex items-center">
<x-loading wire:loading.delay.longer />
@if (!$noLoading)
<x-loading wire:loading.delay.longer />
@endif
<span wire:loading.remove.delay.longer class="flex items-center">
<div class="badge badge-error "></div>
<div class="pl-2 pr-1 text-xs font-bold tracking-wider text-error">{{ str($status)->before(':')->headline() }}</div>
Expand Down
10 changes: 5 additions & 5 deletions resources/views/livewire/server/proxy/status.blade.php
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
<div x-init="$wire.checkProxy()" class="flex gap-2">
@if (data_get($server, 'proxy.status') === 'running')
<x-status.running status="Proxy Running" />
<x-status.running status="Proxy Running" noLoading />
@elseif (data_get($server, 'proxy.status') === 'restarting')
<x-status.restarting status="Proxy Restarting" />
<x-status.restarting status="Proxy Restarting" noLoading />
@elseif (data_get($server, 'proxy.force_stop'))
<x-status.stopped status="Proxy Stopped" />
<x-status.stopped status="Proxy Stopped" noLoading />
@elseif (data_get($server, 'proxy.status') === 'exited')
<x-status.stopped status="Proxy Exited" />
<x-status.stopped status="Proxy Exited" noLoading />
@else
<x-status.stopped status="Proxy Not Running" />
<x-status.stopped status="Proxy Not Running" noLoading />
@endif
<x-forms.button wire:click='checkProxy(true)'>Refresh</x-forms.button>
</div>

0 comments on commit 5f07b47

Please sign in to comment.