From 1835a914673b54527d19cbb015a07a2181a4498d Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Tue, 12 Mar 2024 12:30:40 +0100 Subject: [PATCH] fix: proxy switch --- app/Actions/CoolifyTask/RunRemoteProcess.php | 1 - app/Events/ProxyStarted.php | 4 +- app/Listeners/ProxyStartedNotification.php | 2 +- .../Server/Proxy/DynamicConfigurations.php | 12 +- app/Livewire/Settings/Configuration.php | 7 +- app/Models/Server.php | 241 +++++++++--------- 6 files changed, 133 insertions(+), 134 deletions(-) diff --git a/app/Actions/CoolifyTask/RunRemoteProcess.php b/app/Actions/CoolifyTask/RunRemoteProcess.php index 737b4babe..2c90750e6 100644 --- a/app/Actions/CoolifyTask/RunRemoteProcess.php +++ b/app/Actions/CoolifyTask/RunRemoteProcess.php @@ -114,7 +114,6 @@ class RunRemoteProcess } if ($this->call_event_on_finish) { try { - ray($this->call_event_data); if ($this->call_event_data) { event(resolve("App\\Events\\$this->call_event_on_finish", [ "data" => $this->call_event_data, diff --git a/app/Events/ProxyStarted.php b/app/Events/ProxyStarted.php index c77fe08b0..a4e053171 100644 --- a/app/Events/ProxyStarted.php +++ b/app/Events/ProxyStarted.php @@ -2,7 +2,6 @@ namespace App\Events; -use App\Models\Server; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; @@ -10,7 +9,8 @@ use Illuminate\Queue\SerializesModels; class ProxyStarted { use Dispatchable, InteractsWithSockets, SerializesModels; - public function __construct(public Server $server) + public function __construct(public $data) { + } } diff --git a/app/Listeners/ProxyStartedNotification.php b/app/Listeners/ProxyStartedNotification.php index 62131c22a..e6be605ce 100644 --- a/app/Listeners/ProxyStartedNotification.php +++ b/app/Listeners/ProxyStartedNotification.php @@ -14,7 +14,7 @@ class ProxyStartedNotification public function handle(ProxyStarted $event): void { - $this->server = data_get($event, 'server'); + $this->server = data_get($event, 'data'); $this->server->setupDefault404Redirect(); $this->server->setupDynamicProxyConfiguration(); } diff --git a/app/Livewire/Server/Proxy/DynamicConfigurations.php b/app/Livewire/Server/Proxy/DynamicConfigurations.php index b9e89321c..36219dc7e 100644 --- a/app/Livewire/Server/Proxy/DynamicConfigurations.php +++ b/app/Livewire/Server/Proxy/DynamicConfigurations.php @@ -11,7 +11,15 @@ class DynamicConfigurations extends Component public ?Server $server = null; public $parameters = []; public Collection $contents; - protected $listeners = ['loadDynamicConfigurations', 'refresh' => '$refresh']; + public function getListeners() + { + $teamId = auth()->user()->currentTeam()->id; + return [ + "echo-private:team.{$teamId},ProxyStatusChanged" => 'loadDynamicConfigurations', + 'loadDynamicConfigurations', + 'refresh' => '$refresh' + ]; + } protected $rules = [ 'contents.*' => 'nullable|string', ]; @@ -24,6 +32,7 @@ class DynamicConfigurations extends Component $files = $files->sort(); if ($files->contains('coolify.yaml')) { $files = $files->filter(fn ($file) => $file !== 'coolify.yaml')->prepend('coolify.yaml'); + $files = $files->filter(fn ($file) => $file !== 'Caddyfile')->prepend('Caddyfile'); } $contents = collect([]); foreach ($files as $file) { @@ -31,6 +40,7 @@ class DynamicConfigurations extends Component $contents[$without_extension] = instant_remote_process(["cat {$proxy_path}/dynamic/{$file}"], $this->server); } $this->contents = $contents; + $this->dispatch('refresh'); } public function mount() { diff --git a/app/Livewire/Settings/Configuration.php b/app/Livewire/Settings/Configuration.php index f1c732a97..79ff3bcb6 100644 --- a/app/Livewire/Settings/Configuration.php +++ b/app/Livewire/Settings/Configuration.php @@ -75,12 +75,7 @@ class Configuration extends Component $this->settings->save(); $this->server = Server::findOrFail(0); - $this->setup_instance_fqdn(); + $this->server->setupDynamicProxyConfiguration(); $this->dispatch('success', 'Instance settings updated successfully!'); } - - private function setup_instance_fqdn() - { - $this->server->setupDynamicProxyConfiguration(); - } } diff --git a/app/Models/Server.php b/app/Models/Server.php index 5ad5130d7..f361adc7b 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -3,7 +3,6 @@ namespace App\Models; use App\Actions\Server\InstallDocker; -use App\Enums\ProxyStatus; use App\Enums\ProxyTypes; use App\Notifications\Server\Revived; use App\Notifications\Server\Unreachable; @@ -125,7 +124,6 @@ class Server extends BaseModel $dynamic_conf_path = $this->proxyPath() . "/dynamic"; $proxy_type = $this->proxyType(); $redirect_url = $this->proxy->redirect_url; - if ($proxy_type === 'TRAEFIK_V2') { $default_redirect_file = "$dynamic_conf_path/default_redirect_404.yaml"; } else if ($proxy_type === 'CADDY') { @@ -199,7 +197,6 @@ class Server extends BaseModel $conf = ":80, :443 { redir $redirect_url }"; -ray($conf); $conf = "# This file is automatically generated by Coolify.\n" . "# Do not edit it manually (only if you know what are you doing).\n\n" . @@ -224,150 +221,148 @@ ray($conf); { $settings = InstanceSettings::get(); $dynamic_config_path = $this->proxyPath() . "/dynamic"; - if ($this) { - if ($this->proxyType() === 'TRAEFIK_V2') { - $file = "$dynamic_config_path/coolify.yaml"; - if (empty($settings->fqdn)) { - instant_remote_process([ - "rm -f $file", - ], $this); - } else { - $url = Url::fromString($settings->fqdn); - $host = $url->getHost(); - $schema = $url->getScheme(); - $traefik_dynamic_conf = [ - 'http' => + if ($this->proxyType() === 'TRAEFIK_V2') { + $file = "$dynamic_config_path/coolify.yaml"; + if (empty($settings->fqdn)) { + instant_remote_process([ + "rm -f $file", + ], $this); + } else { + $url = Url::fromString($settings->fqdn); + $host = $url->getHost(); + $schema = $url->getScheme(); + $traefik_dynamic_conf = [ + 'http' => + [ + 'middlewares' => [ + 'redirect-to-https' => [ + 'redirectscheme' => [ + 'scheme' => 'https', + ], + ], + 'gzip' => [ + 'compress' => true, + ], + ], + 'routers' => [ - 'middlewares' => [ - 'redirect-to-https' => [ - 'redirectscheme' => [ - 'scheme' => 'https', - ], - ], - 'gzip' => [ - 'compress' => true, - ], - ], - 'routers' => + 'coolify-http' => [ - 'coolify-http' => - [ - 'middlewares' => [ - 0 => 'gzip', - ], - 'entryPoints' => [ - 0 => 'http', - ], - 'service' => 'coolify', - 'rule' => "Host(`{$host}`)", + 'middlewares' => [ + 0 => 'gzip', ], - 'coolify-realtime-ws' => - [ - 'entryPoints' => [ - 0 => 'http', - ], - 'service' => 'coolify-realtime', - 'rule' => "Host(`{$host}`) && PathPrefix(`/app`)", + 'entryPoints' => [ + 0 => 'http', ], + 'service' => 'coolify', + 'rule' => "Host(`{$host}`)", ], - 'services' => + 'coolify-realtime-ws' => [ - 'coolify' => + 'entryPoints' => [ + 0 => 'http', + ], + 'service' => 'coolify-realtime', + 'rule' => "Host(`{$host}`) && PathPrefix(`/app`)", + ], + ], + 'services' => + [ + 'coolify' => + [ + 'loadBalancer' => [ - 'loadBalancer' => + 'servers' => [ - 'servers' => + 0 => [ - 0 => - [ - 'url' => 'http://coolify:80', - ], + 'url' => 'http://coolify:80', ], ], ], - 'coolify-realtime' => + ], + 'coolify-realtime' => + [ + 'loadBalancer' => [ - 'loadBalancer' => + 'servers' => [ - 'servers' => + 0 => [ - 0 => - [ - 'url' => 'http://coolify-realtime:6001', - ], + 'url' => 'http://coolify-realtime:6001', ], ], ], ], ], + ], + ]; + + if ($schema === 'https') { + $traefik_dynamic_conf['http']['routers']['coolify-http']['middlewares'] = [ + 0 => 'redirect-to-https', ]; - if ($schema === 'https') { - $traefik_dynamic_conf['http']['routers']['coolify-http']['middlewares'] = [ - 0 => 'redirect-to-https', - ]; - - $traefik_dynamic_conf['http']['routers']['coolify-https'] = [ - 'entryPoints' => [ - 0 => 'https', - ], - 'service' => 'coolify', - 'rule' => "Host(`{$host}`)", - 'tls' => [ - 'certresolver' => 'letsencrypt', - ], - ]; - $traefik_dynamic_conf['http']['routers']['coolify-realtime-wss'] = [ - 'entryPoints' => [ - 0 => 'https', - ], - 'service' => 'coolify-realtime', - 'rule' => "Host(`{$host}`) && PathPrefix(`/app`)", - 'tls' => [ - 'certresolver' => 'letsencrypt', - ], - ]; - } - $yaml = Yaml::dump($traefik_dynamic_conf, 12, 2); - $yaml = - "# This file is automatically generated by Coolify.\n" . - "# Do not edit it manually (only if you know what are you doing).\n\n" . - $yaml; - - $base64 = base64_encode($yaml); - instant_remote_process([ - "mkdir -p $dynamic_config_path", - "echo '$base64' | base64 -d > $file", - ], $this); - - if (config('app.env') == 'local') { - // ray($yaml); - } + $traefik_dynamic_conf['http']['routers']['coolify-https'] = [ + 'entryPoints' => [ + 0 => 'https', + ], + 'service' => 'coolify', + 'rule' => "Host(`{$host}`)", + 'tls' => [ + 'certresolver' => 'letsencrypt', + ], + ]; + $traefik_dynamic_conf['http']['routers']['coolify-realtime-wss'] = [ + 'entryPoints' => [ + 0 => 'https', + ], + 'service' => 'coolify-realtime', + 'rule' => "Host(`{$host}`) && PathPrefix(`/app`)", + 'tls' => [ + 'certresolver' => 'letsencrypt', + ], + ]; } - } else if ($this->proxyType() === 'CADDY') { - $file = "$dynamic_config_path/coolify.caddy"; - if (empty($settings->fqdn)) { - instant_remote_process([ - "rm -f $file", - ], $this); - $this->reloadCaddy(); - } else { - $url = Url::fromString($settings->fqdn); - $host = $url->getHost(); - $schema = $url->getScheme(); - $caddy_file = " + $yaml = Yaml::dump($traefik_dynamic_conf, 12, 2); + $yaml = + "# This file is automatically generated by Coolify.\n" . + "# Do not edit it manually (only if you know what are you doing).\n\n" . + $yaml; + + $base64 = base64_encode($yaml); + instant_remote_process([ + "mkdir -p $dynamic_config_path", + "echo '$base64' | base64 -d > $file", + ], $this); + + if (config('app.env') == 'local') { + // ray($yaml); + } + } + } else if ($this->proxyType() === 'CADDY') { + $file = "$dynamic_config_path/coolify.caddy"; + if (empty($settings->fqdn)) { + instant_remote_process([ + "rm -f $file", + ], $this); + $this->reloadCaddy(); + } else { + $url = Url::fromString($settings->fqdn); + $host = $url->getHost(); + $schema = $url->getScheme(); + $caddy_file = " $schema://$host { handle /app/* { reverse_proxy coolify-realtime:6001 } reverse_proxy coolify:80 }"; - $base64 = base64_encode($caddy_file); - instant_remote_process([ - "echo '$base64' | base64 -d > $file", - ], $this); - $this->reloadCaddy(); - } + $base64 = base64_encode($caddy_file); + instant_remote_process([ + "echo '$base64' | base64 -d > $file", + ], $this); + $this->reloadCaddy(); } } } @@ -396,16 +391,16 @@ $schema://$host { } public function proxyType() { - $proxyType = $this->proxy->get('type'); - if ($proxyType === ProxyTypes::NONE->value) { - return $proxyType; - } + // $proxyType = $this->proxy->get('type'); + // if ($proxyType === ProxyTypes::NONE->value) { + // return $proxyType; + // } // if (is_null($proxyType)) { // $this->proxy->type = ProxyTypes::TRAEFIK_V2->value; // $this->proxy->status = ProxyStatus::EXITED->value; // $this->save(); // } - return $this->proxy->get('type'); + return data_get($this->proxy, 'type.type'); } public function scopeWithProxy(): Builder {