From ebfc0bd1e1a976167f5c52deba9e199ea2a7beb2 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Fri, 22 Sep 2023 08:42:27 +0200 Subject: [PATCH] fix: add proxy to network with periodic check --- app/Actions/Proxy/StartProxy.php | 19 +++++-------------- app/Jobs/ContainerStatusJob.php | 6 ++++-- bootstrap/helpers/proxy.php | 16 ++++++++++++++++ bootstrap/helpers/remoteProcess.php | 10 ++++++++-- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/app/Actions/Proxy/StartProxy.php b/app/Actions/Proxy/StartProxy.php index edb84dd01..aafeb2f3e 100644 --- a/app/Actions/Proxy/StartProxy.php +++ b/app/Actions/Proxy/StartProxy.php @@ -14,21 +14,12 @@ class StartProxy use AsAction; public function handle(Server $server, bool $async = true): Activity|string { + $commands = collect([]); $proxyType = $server->proxyType(); if ($proxyType === 'none') { return 'OK'; } $proxy_path = get_proxy_path(); - $networks = collect($server->standaloneDockers)->map(function ($docker) { - return $docker['network']; - })->unique(); - if ($networks->count() === 0) { - $networks = collect(['coolify']); - } - $create_networks_command = $networks->map(function ($network) { - return "docker network ls --format '{{.Name}}' | grep '^$network$' >/dev/null 2>&1 || docker network create --attachable $network > /dev/null 2>&1"; - }); - $configuration = CheckConfiguration::run($server); if (!$configuration) { throw new \Exception("Configuration is not synced"); @@ -36,13 +27,12 @@ public function handle(Server $server, bool $async = true): Activity|string $docker_compose_yml_base64 = base64_encode($configuration); $server->proxy->last_applied_settings = Str::of($docker_compose_yml_base64)->pipe('md5')->value; $server->save(); - $commands = [ + + $commands = $commands->merge([ "command -v lsof >/dev/null || echo '####### Installing lsof...'", "command -v lsof >/dev/null || apt-get update", "command -v lsof >/dev/null || apt install -y lsof", "command -v lsof >/dev/null || command -v fuser >/dev/null || apt install -y psmisc", - "echo '####### Creating required Docker networks...'", - ...$create_networks_command, "cd $proxy_path", "echo '####### Creating Docker Compose file...'", "echo '####### Pulling docker image...'", @@ -60,7 +50,8 @@ public function handle(Server $server, bool $async = true): Activity|string "echo '####### Starting coolify-proxy...'", 'docker compose up -d --remove-orphans || docker-compose up -d --remove-orphans', "echo '####### Proxy installed successfully...'" - ]; + ]); + $commands = $commands->merge(connectProxyToNetworks($server)); if (!$async) { instant_remote_process($commands, $server); return 'OK'; diff --git a/app/Jobs/ContainerStatusJob.php b/app/Jobs/ContainerStatusJob.php index 6da47121b..37fb19762 100644 --- a/app/Jobs/ContainerStatusJob.php +++ b/app/Jobs/ContainerStatusJob.php @@ -89,11 +89,14 @@ public function handle(): void } else { $this->server->proxy->status = data_get($foundProxyContainer, 'State.Status'); $this->server->save(); + $connectProxyToDockerNetworks = connectProxyToNetworks($this->server); + instant_remote_process([$connectProxyToDockerNetworks], $this->server, false); } $foundApplications = []; $foundApplicationPreviews = []; $foundDatabases = []; $foundServices = []; + foreach ($containers as $container) { $containerStatus = data_get($container, 'State.Status'); $labels = data_get($container, 'Config.Labels'); @@ -179,7 +182,7 @@ public function handle(): void $db->update(['status' => 'exited']); } } - } + } $exitedServices = $exitedServices->unique('id'); ray($exitedServices); // ray($exitedServices); @@ -202,7 +205,6 @@ public function handle(): void // $this->server->team->notify(new ContainerStopped($containerName, $this->server, $url)); // } - $notRunningApplications = $applications->pluck('id')->diff($foundApplications); foreach ($notRunningApplications as $applicationId) { $application = $applications->where('id', $applicationId)->first(); diff --git a/bootstrap/helpers/proxy.php b/bootstrap/helpers/proxy.php index e3db2be36..661da1c52 100644 --- a/bootstrap/helpers/proxy.php +++ b/bootstrap/helpers/proxy.php @@ -10,7 +10,23 @@ function get_proxy_path() $proxy_path = "$base_path/proxy"; return $proxy_path; } +function connectProxyToNetworks(Server $server) { + $networks = collect($server->standaloneDockers)->map(function ($docker) { + return $docker['network']; + })->unique(); + if ($networks->count() === 0) { + $networks = collect(['coolify']); + } + $commands = $networks->map(function ($network) { + return [ + "echo '####### Connecting coolify-proxy to $network network...'", + "docker network ls --format '{{.Name}}' | grep '^$network$' >/dev/null 2>&1 || docker network create --attachable $network > /dev/null 2>&1", + "docker network connect $network coolify-proxy >/dev/null 2>&1 || true", + ]; + }); + return $commands->flatten(); +} function generate_default_proxy_configuration(Server $server) { $proxy_path = get_proxy_path(); diff --git a/bootstrap/helpers/remoteProcess.php b/bootstrap/helpers/remoteProcess.php index 7936ca62b..706be1e1b 100644 --- a/bootstrap/helpers/remoteProcess.php +++ b/bootstrap/helpers/remoteProcess.php @@ -16,7 +16,7 @@ use Spatie\Activitylog\Contracts\Activity; function remote_process( - array $command, + Collection|array $command, Server $server, ?string $type = null, ?string $type_uuid = null, @@ -26,6 +26,9 @@ function remote_process( if (is_null($type)) { $type = ActivityTypes::INLINE->value; } + if ($command instanceof Collection) { + $command = $command->toArray(); + } $command_string = implode("\n", $command); if (auth()->user()) { $teams = auth()->user()->teams->pluck('id'); @@ -98,8 +101,11 @@ function generateSshCommand(Server $server, string $command, bool $isMux = true) // ray($ssh_command); return $ssh_command; } -function instant_remote_process(array $command, Server $server, $throwError = true) +function instant_remote_process(Collection|array $command, Server $server, $throwError = true) { + if ($command instanceof Collection) { + $command = $command->toArray(); + } $command_string = implode("\n", $command); $ssh_command = generateSshCommand($server, $command_string); $process = Process::run($ssh_command);