feat: allow disabling default redirect, set status to 503

This commit is contained in:
Kael
2024-10-11 02:44:52 +11:00
parent 99431998f5
commit b997b7393b
5 changed files with 91 additions and 77 deletions

View File

@@ -14,7 +14,7 @@ class ProxyStartedNotification
public function handle(ProxyStarted $event): void public function handle(ProxyStarted $event): void
{ {
$this->server = data_get($event, 'data'); $this->server = data_get($event, 'data');
$this->server->setupDefault404Redirect(); $this->server->setupDefaultRedirect();
$this->server->setupDynamicProxyConfiguration(); $this->server->setupDynamicProxyConfiguration();
$this->server->proxy->force_stop = false; $this->server->proxy->force_stop = false;
$this->server->save(); $this->server->save();

View File

@@ -16,6 +16,7 @@ class Proxy extends Component
public $proxy_settings = null; public $proxy_settings = null;
public bool $redirect_enabled = true;
public ?string $redirect_url = null; public ?string $redirect_url = null;
protected $listeners = ['proxyStatusUpdated', 'saveConfiguration' => 'submit']; protected $listeners = ['proxyStatusUpdated', 'saveConfiguration' => 'submit'];
@@ -27,6 +28,7 @@ class Proxy extends Component
public function mount() public function mount()
{ {
$this->selectedProxy = $this->server->proxyType(); $this->selectedProxy = $this->server->proxyType();
$this->redirect_enabled = data_get($this->server, 'proxy.redirect_enabled', true);
$this->redirect_url = data_get($this->server, 'proxy.redirect_url'); $this->redirect_url = data_get($this->server, 'proxy.redirect_url');
} }
@@ -65,13 +67,25 @@ class Proxy extends Component
} }
} }
public function instantSaveRedirect()
{
try {
$this->server->proxy->redirect_enabled = $this->redirect_enabled;
$this->server->save();
$this->server->setupDefaultRedirect();
$this->dispatch('success', 'Proxy configuration saved.');
} catch (\Throwable $e) {
return handleError($e, $this);
}
}
public function submit() public function submit()
{ {
try { try {
SaveConfiguration::run($this->server, $this->proxy_settings); SaveConfiguration::run($this->server, $this->proxy_settings);
$this->server->proxy->redirect_url = $this->redirect_url; $this->server->proxy->redirect_url = $this->redirect_url;
$this->server->save(); $this->server->save();
$this->server->setupDefault404Redirect(); $this->server->setupDefaultRedirect();
$this->dispatch('success', 'Proxy configuration saved.'); $this->dispatch('success', 'Proxy configuration saved.');
} catch (\Throwable $e) { } catch (\Throwable $e) {
return handleError($e, $this); return handleError($e, $this);

View File

@@ -94,6 +94,14 @@ class Server extends BaseModel
]); ]);
} }
} }
if (!isset($server->proxy->redirect_enabled)) {
$server->proxy->redirect_enabled = true;
}
});
static::retrieved(function ($server) {
if (!isset($server->proxy->redirect_enabled)) {
$server->proxy->redirect_enabled = true;
}
}); });
static::deleting(function ($server) { static::deleting(function ($server) {
$server->destinations()->each(function ($destination) { $server->destinations()->each(function ($destination) {
@@ -164,70 +172,72 @@ class Server extends BaseModel
return $this->proxyType() && $this->proxyType() !== 'NONE' && $this->isFunctional() && ! $this->isSwarmWorker() && ! $this->settings->is_build_server; return $this->proxyType() && $this->proxyType() !== 'NONE' && $this->isFunctional() && ! $this->isSwarmWorker() && ! $this->settings->is_build_server;
} }
public function setupDefault404Redirect() public function setupDefaultRedirect()
{ {
$banner =
"# This file is generated by Coolify, do not edit it manually.\n" .
"# Disable the default redirect to customize (only if you know what are you doing).\n\n";
$dynamic_conf_path = $this->proxyPath().'/dynamic'; $dynamic_conf_path = $this->proxyPath().'/dynamic';
$proxy_type = $this->proxyType(); $proxy_type = $this->proxyType();
$redirect_enabled = $this->proxy->redirect_enabled ?? true;
$redirect_url = $this->proxy->redirect_url; $redirect_url = $this->proxy->redirect_url;
if ($proxy_type === ProxyTypes::TRAEFIK->value) { if ($proxy_type === ProxyTypes::TRAEFIK->value) {
$default_redirect_file = "$dynamic_conf_path/default_redirect_404.yaml"; $default_redirect_file = "$dynamic_conf_path/default_redirect_503.yaml";
} elseif ($proxy_type === ProxyTypes::CADDY->value) { } elseif ($proxy_type === ProxyTypes::CADDY->value) {
$default_redirect_file = "$dynamic_conf_path/default_redirect_404.caddy"; $default_redirect_file = "$dynamic_conf_path/default_redirect_503.caddy";
} }
if (empty($redirect_url)) {
instant_remote_process([
"mkdir -p $dynamic_conf_path",
"rm -f $dynamic_conf_path/default_redirect_404.yaml",
"rm -f $dynamic_conf_path/default_redirect_404.caddy",
], $this);
if (!$redirect_enabled) {
instant_remote_process(["rm -f $default_redirect_file"], $this);
} else {
if ($proxy_type === ProxyTypes::CADDY->value) { if ($proxy_type === ProxyTypes::CADDY->value) {
$conf = ':80, :443 { if (empty($redirect_url)) {
respond 404 $conf = ':80, :443 {
respond 503
}'; }';
$conf = } else {
"# This file is automatically generated by Coolify.\n". $conf = ":80, :443 {
"# Do not edit it manually (only if you know what are you doing).\n\n". redir $redirect_url
$conf; }";
$base64 = base64_encode($conf); }
instant_remote_process([ } elseif ($proxy_type === ProxyTypes::TRAEFIK->value) {
"mkdir -p $dynamic_conf_path", $dynamic_conf = [
"echo '$base64' | base64 -d | tee $default_redirect_file > /dev/null", 'http' => [
], $this); 'routers' => [
$this->reloadCaddy(); 'catchall' => [
'entryPoints' => [
return; 0 => 'http',
} 1 => 'https',
instant_remote_process([ ],
"mkdir -p $dynamic_conf_path", 'service' => 'noop',
"rm -f $default_redirect_file", 'rule' => 'HostRegexp(`{catchall:.*}`)',
], $this); 'priority' => 1,
return;
}
if ($proxy_type === ProxyTypes::TRAEFIK->value) {
$dynamic_conf = [
'http' => [
'routers' => [
'catchall' => [
'entryPoints' => [
0 => 'http',
1 => 'https',
],
'service' => 'noop',
'rule' => 'HostRegexp(`{catchall:.*}`)',
'priority' => 1,
'middlewares' => [
0 => 'redirect-regexp@file',
], ],
], ],
], 'services' => [
'services' => [ 'noop' => [
'noop' => [ 'loadBalancer' => [
'loadBalancer' => [ 'servers' => [],
'servers' => [
0 => [
'url' => '',
],
], ],
], ],
], ],
], ],
'middlewares' => [ ];
if (!empty($redirect_url)) {
$dynamic_conf['http']['routers']['catchall']['middlewares'] = [
0 => 'redirect-regexp@file',
];
$dynamic_conf['http']['services']['noop']['loadBalancer']['servers'][0] = [
'url' => '',
];
$dynamic_conf['http']['middlewares'] = [
'redirect-regexp' => [ 'redirect-regexp' => [
'redirectRegex' => [ 'redirectRegex' => [
'regex' => '(.*)', 'regex' => '(.*)',
@@ -235,32 +245,17 @@ respond 404
'permanent' => false, 'permanent' => false,
], ],
], ],
], ];
], }
]; $conf = Yaml::dump($dynamic_conf, 12, 2);
$conf = Yaml::dump($dynamic_conf, 12, 2); }
$conf = $conf = $banner . $conf;
"# This file is automatically generated by Coolify.\n".
"# Do not edit it manually (only if you know what are you doing).\n\n".
$conf;
$base64 = base64_encode($conf);
} elseif ($proxy_type === ProxyTypes::CADDY->value) {
$conf = ":80, :443 {
redir $redirect_url
}";
$conf =
"# This file is automatically generated by Coolify.\n".
"# Do not edit it manually (only if you know what are you doing).\n\n".
$conf;
$base64 = base64_encode($conf); $base64 = base64_encode($conf);
instant_remote_process([
"echo '$base64' | base64 -d | tee $default_redirect_file > /dev/null",
], $this);
} }
instant_remote_process([
"mkdir -p $dynamic_conf_path",
"echo '$base64' | base64 -d | tee $default_redirect_file > /dev/null",
], $this);
if ($proxy_type === 'CADDY') { if ($proxy_type === 'CADDY') {
$this->reloadCaddy(); $this->reloadCaddy();
} }

View File

@@ -28,6 +28,13 @@
id="server.settings.generate_exact_labels" id="server.settings.generate_exact_labels"
label="Generate labels only for {{ str($server->proxyType())->title() }}" instantSave /> label="Generate labels only for {{ str($server->proxyType())->title() }}" instantSave />
</div> </div>
<h5>Default request handler</h5>
<div class="pb-4 w-96">
<x-forms.checkbox instantSave="instantSaveRedirect" id="redirect_enabled" label="Enabled" helper="Requests to unknown hosts or stopped services will recieve a 503 response." />
@if ($redirect_enabled)
<x-forms.input placeholder="https://app.coolify.io" id="redirect_url" label="Or redirect to (optional)" />
@endif
</div>
@if ($server->proxyType() === ProxyTypes::TRAEFIK->value) @if ($server->proxyType() === ProxyTypes::TRAEFIK->value)
<h4>Traefik</h4> <h4>Traefik</h4>
@elseif ($server->proxyType() === 'CADDY') @elseif ($server->proxyType() === 'CADDY')
@@ -40,8 +47,6 @@
configurations. configurations.
</div> </div>
@endif @endif
<x-forms.input placeholder="https://app.coolify.io" id="redirect_url" label="Default Redirect 404"
helper="All urls that has no service available will be redirected to this domain." />
<div wire:loading wire:target="loadProxyConfiguration" class="pt-4"> <div wire:loading wire:target="loadProxyConfiguration" class="pt-4">
<x-loading text="Loading proxy configuration..." /> <x-loading text="Loading proxy configuration..." />
</div> </div>

View File

@@ -29,7 +29,7 @@
@if (str_replace('|', '.', $fileName) === 'coolify.yaml' || @if (str_replace('|', '.', $fileName) === 'coolify.yaml' ||
str_replace('|', '.', $fileName) === 'Caddyfile' || str_replace('|', '.', $fileName) === 'Caddyfile' ||
str_replace('|', '.', $fileName) === 'coolify.caddy' || str_replace('|', '.', $fileName) === 'coolify.caddy' ||
str_replace('|', '.', $fileName) === 'default_redirect_404.caddy') str_replace('|', '.', $fileName) === 'default_redirect_503.caddy')
<div> <div>
<h3 class="dark:text-white">File: {{ str_replace('|', '.', $fileName) }}</h3> <h3 class="dark:text-white">File: {{ str_replace('|', '.', $fileName) }}</h3>
</div> </div>