feat: allow disabling default redirect, set status to 503
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user