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
 | 
			
		||||
    {
 | 
			
		||||
        $this->server = data_get($event, 'data');
 | 
			
		||||
        $this->server->setupDefault404Redirect();
 | 
			
		||||
        $this->server->setupDefaultRedirect();
 | 
			
		||||
        $this->server->setupDynamicProxyConfiguration();
 | 
			
		||||
        $this->server->proxy->force_stop = false;
 | 
			
		||||
        $this->server->save();
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@ class Proxy extends Component
 | 
			
		||||
 | 
			
		||||
    public $proxy_settings = null;
 | 
			
		||||
 | 
			
		||||
    public bool $redirect_enabled = true;
 | 
			
		||||
    public ?string $redirect_url = null;
 | 
			
		||||
 | 
			
		||||
    protected $listeners = ['proxyStatusUpdated', 'saveConfiguration' => 'submit'];
 | 
			
		||||
@@ -27,6 +28,7 @@ class Proxy extends Component
 | 
			
		||||
    public function mount()
 | 
			
		||||
    {
 | 
			
		||||
        $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');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -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()
 | 
			
		||||
    {
 | 
			
		||||
        try {
 | 
			
		||||
            SaveConfiguration::run($this->server, $this->proxy_settings);
 | 
			
		||||
            $this->server->proxy->redirect_url = $this->redirect_url;
 | 
			
		||||
            $this->server->save();
 | 
			
		||||
            $this->server->setupDefault404Redirect();
 | 
			
		||||
            $this->server->setupDefaultRedirect();
 | 
			
		||||
            $this->dispatch('success', 'Proxy configuration saved.');
 | 
			
		||||
        } catch (\Throwable $e) {
 | 
			
		||||
            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) {
 | 
			
		||||
            $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;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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';
 | 
			
		||||
        $proxy_type = $this->proxyType();
 | 
			
		||||
        $redirect_enabled = $this->proxy->redirect_enabled ?? true;
 | 
			
		||||
        $redirect_url = $this->proxy->redirect_url;
 | 
			
		||||
 | 
			
		||||
        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) {
 | 
			
		||||
            $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) {
 | 
			
		||||
                $conf = ':80, :443 {
 | 
			
		||||
respond 404
 | 
			
		||||
                if (empty($redirect_url)) {
 | 
			
		||||
                    $conf = ':80, :443 {
 | 
			
		||||
    respond 503
 | 
			
		||||
}';
 | 
			
		||||
                $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);
 | 
			
		||||
                instant_remote_process([
 | 
			
		||||
                    "mkdir -p $dynamic_conf_path",
 | 
			
		||||
                    "echo '$base64' | base64 -d | tee $default_redirect_file > /dev/null",
 | 
			
		||||
                ], $this);
 | 
			
		||||
                $this->reloadCaddy();
 | 
			
		||||
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            instant_remote_process([
 | 
			
		||||
                "mkdir -p $dynamic_conf_path",
 | 
			
		||||
                "rm -f $default_redirect_file",
 | 
			
		||||
            ], $this);
 | 
			
		||||
 | 
			
		||||
            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',
 | 
			
		||||
                } else {
 | 
			
		||||
                    $conf = ":80, :443 {
 | 
			
		||||
    redir $redirect_url
 | 
			
		||||
}";
 | 
			
		||||
                }
 | 
			
		||||
            } elseif ($proxy_type === ProxyTypes::TRAEFIK->value) {
 | 
			
		||||
                $dynamic_conf = [
 | 
			
		||||
                    'http' => [
 | 
			
		||||
                        'routers' => [
 | 
			
		||||
                            'catchall' => [
 | 
			
		||||
                                'entryPoints' => [
 | 
			
		||||
                                    0 => 'http',
 | 
			
		||||
                                    1 => 'https',
 | 
			
		||||
                                ],
 | 
			
		||||
                                'service' => 'noop',
 | 
			
		||||
                                'rule' => 'HostRegexp(`{catchall:.*}`)',
 | 
			
		||||
                                'priority' => 1,
 | 
			
		||||
                            ],
 | 
			
		||||
                        ],
 | 
			
		||||
                    ],
 | 
			
		||||
                    'services' => [
 | 
			
		||||
                        'noop' => [
 | 
			
		||||
                            'loadBalancer' => [
 | 
			
		||||
                                'servers' => [
 | 
			
		||||
                                    0 => [
 | 
			
		||||
                                        'url' => '',
 | 
			
		||||
                                    ],
 | 
			
		||||
                        'services' => [
 | 
			
		||||
                            'noop' => [
 | 
			
		||||
                                'loadBalancer' => [
 | 
			
		||||
                                    'servers' => [],
 | 
			
		||||
                                ],
 | 
			
		||||
                            ],
 | 
			
		||||
                        ],
 | 
			
		||||
                    ],
 | 
			
		||||
                    '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' => [
 | 
			
		||||
                            'redirectRegex' => [
 | 
			
		||||
                                'regex' => '(.*)',
 | 
			
		||||
@@ -235,32 +245,17 @@ respond 404
 | 
			
		||||
                                'permanent' => false,
 | 
			
		||||
                            ],
 | 
			
		||||
                        ],
 | 
			
		||||
                    ],
 | 
			
		||||
                ],
 | 
			
		||||
            ];
 | 
			
		||||
            $conf = Yaml::dump($dynamic_conf, 12, 2);
 | 
			
		||||
            $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;
 | 
			
		||||
                    ];
 | 
			
		||||
                }
 | 
			
		||||
                $conf = Yaml::dump($dynamic_conf, 12, 2);
 | 
			
		||||
            }
 | 
			
		||||
            $conf = $banner . $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') {
 | 
			
		||||
            $this->reloadCaddy();
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,13 @@
 | 
			
		||||
                            id="server.settings.generate_exact_labels"
 | 
			
		||||
                            label="Generate labels only for {{ str($server->proxyType())->title() }}" instantSave />
 | 
			
		||||
                    </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)
 | 
			
		||||
                        <h4>Traefik</h4>
 | 
			
		||||
                    @elseif ($server->proxyType() === 'CADDY')
 | 
			
		||||
@@ -40,8 +47,6 @@
 | 
			
		||||
                            configurations.
 | 
			
		||||
                        </div>
 | 
			
		||||
                    @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">
 | 
			
		||||
                        <x-loading text="Loading proxy configuration..." />
 | 
			
		||||
                    </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -29,7 +29,7 @@
 | 
			
		||||
                                @if (str_replace('|', '.', $fileName) === 'coolify.yaml' ||
 | 
			
		||||
                                        str_replace('|', '.', $fileName) === 'Caddyfile' ||
 | 
			
		||||
                                        str_replace('|', '.', $fileName) === 'coolify.caddy' ||
 | 
			
		||||
                                        str_replace('|', '.', $fileName) === 'default_redirect_404.caddy')
 | 
			
		||||
                                        str_replace('|', '.', $fileName) === 'default_redirect_503.caddy')
 | 
			
		||||
                                    <div>
 | 
			
		||||
                                        <h3 class="dark:text-white">File: {{ str_replace('|', '.', $fileName) }}</h3>
 | 
			
		||||
                                    </div>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user