diff --git a/app/Actions/Proxy/CheckProxy.php b/app/Actions/Proxy/CheckProxy.php
index 5a1ae56cf..32a4897a6 100644
--- a/app/Actions/Proxy/CheckProxy.php
+++ b/app/Actions/Proxy/CheckProxy.php
@@ -35,6 +35,9 @@ class CheckProxy
$server->save();
return false;
}
+ if ($server->settings->is_cloudflare_tunnel) {
+ return false;
+ }
$ip = $server->ip;
if ($server->id === 0) {
$ip = 'host.docker.internal';
diff --git a/app/Actions/Server/ConfigureCloudflared.php b/app/Actions/Server/ConfigureCloudflared.php
new file mode 100644
index 000000000..6b08b3de6
--- /dev/null
+++ b/app/Actions/Server/ConfigureCloudflared.php
@@ -0,0 +1,44 @@
+ [
+ "coolify-cloudflared" => [
+ "container_name" => "coolify-cloudflared",
+ "image" => "cloudflare/cloudflared:latest",
+ "restart" => RESTART_MODE,
+ "network_mode" => "host",
+ "command" => "tunnel run",
+ "environment" => [
+ "TUNNEL_TOKEN={$cloudflare_token}",
+ ],
+ ],
+ ],
+ ];
+ $config = Yaml::dump($config, 12, 2);
+ $docker_compose_yml_base64 = base64_encode($config);
+ $commands = collect([
+ "mkdir -p /tmp/cloudflared && cd /tmp/cloudflared",
+ "echo '$docker_compose_yml_base64' | base64 -d > docker-compose.yml",
+ "docker compose pull",
+ "docker compose down -v --remove-orphans > /dev/null 2>&1",
+ "docker compose up -d --remove-orphans",
+ ]);
+ instant_remote_process($commands, $server);
+ } catch (\Throwable $e) {
+ ray($e);
+ throw $e;
+ }
+ }
+}
diff --git a/app/Http/Livewire/Server/New/ByIp.php b/app/Http/Livewire/Server/New/ByIp.php
deleted file mode 100644
index e69de29bb..000000000
diff --git a/app/Livewire/Server/ConfigureCloudflareTunnels.php b/app/Livewire/Server/ConfigureCloudflareTunnels.php
new file mode 100644
index 000000000..7a07a4d04
--- /dev/null
+++ b/app/Livewire/Server/ConfigureCloudflareTunnels.php
@@ -0,0 +1,42 @@
+where('id', $this->server_id)->firstOrFail();
+ $server->settings->is_cloudflare_tunnel = true;
+ $server->settings->save();
+ $this->dispatch('success', 'Cloudflare Tunnels configured successfully.');
+ $this->dispatch('serverInstalled');
+ } catch (\Throwable $e) {
+ return handleError($e, $this);
+ }
+ }
+ public function submit()
+ {
+ try {
+ $server = Server::ownedByCurrentTeam()->where('id', $this->server_id)->firstOrFail();
+ ConfigureCloudflared::run($server, $this->cloudflare_token);
+ $server->settings->is_cloudflare_tunnel = true;
+ $server->settings->save();
+ $this->dispatch('success', 'Cloudflare Tunnels configured successfully.');
+ $this->dispatch('serverInstalled');
+ } catch(\Throwable $e) {
+ return handleError($e, $this);
+ }
+ }
+ public function render()
+ {
+ return view('livewire.server.configure-cloudflare-tunnels');
+ }
+}
diff --git a/config/sentry.php b/config/sentry.php
index 295643a93..0958a5e3c 100644
--- a/config/sentry.php
+++ b/config/sentry.php
@@ -7,7 +7,7 @@ return [
// The release version of your application
// Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD'))
- 'release' => '4.0.0-beta.246',
+ 'release' => '4.0.0-beta.247',
// When left empty or `null` the Laravel environment will be used
'environment' => config('app.env'),
diff --git a/config/version.php b/config/version.php
index c7cc17991..c5f90b65a 100644
--- a/config/version.php
+++ b/config/version.php
@@ -1,3 +1,3 @@
+