diff --git a/app/Actions/Database/StartDatabaseProxy.php b/app/Actions/Database/StartDatabaseProxy.php
index c634f14bac..ac27480936 100644
--- a/app/Actions/Database/StartDatabaseProxy.php
+++ b/app/Actions/Database/StartDatabaseProxy.php
@@ -50,6 +50,13 @@ public function handle(StandaloneRedis|StandalonePostgresql|StandaloneMongodb|St
};
}
+ $proxyTimeout = $database->public_proxy_timeout ?? 0;
+ if ($proxyTimeout <= 0) {
+ $timeoutValue = '365d';
+ } else {
+ $timeoutValue = "{$proxyTimeout}s";
+ }
+
$configuration_dir = database_proxy_dir($database->uuid);
if (isDev()) {
$configuration_dir = '/var/lib/docker/volumes/coolify_dev_coolify_data/_data/databases/'.$database->uuid.'/proxy';
@@ -67,6 +74,8 @@ public function handle(StandaloneRedis|StandalonePostgresql|StandaloneMongodb|St
server {
listen $database->public_port;
proxy_pass $containerName:$internalPort;
+ proxy_timeout $timeoutValue;
+ proxy_connect_timeout 60s;
}
}
EOF;
diff --git a/app/Livewire/Project/Database/Clickhouse/General.php b/app/Livewire/Project/Database/Clickhouse/General.php
index 7ad453fd58..3817134d3a 100644
--- a/app/Livewire/Project/Database/Clickhouse/General.php
+++ b/app/Livewire/Project/Database/Clickhouse/General.php
@@ -36,6 +36,8 @@ class General extends Component
public ?int $publicPort = null;
+ public ?int $publicProxyTimeout = null;
+
public ?string $customDockerRunOptions = null;
public ?string $dbUrl = null;
@@ -80,6 +82,7 @@ protected function rules(): array
'portsMappings' => 'nullable|string',
'isPublic' => 'nullable|boolean',
'publicPort' => 'nullable|integer',
+ 'publicProxyTimeout' => 'nullable|integer|min:0',
'customDockerRunOptions' => 'nullable|string',
'dbUrl' => 'nullable|string',
'dbUrlPublic' => 'nullable|string',
@@ -115,6 +118,7 @@ public function syncData(bool $toModel = false)
$this->database->ports_mappings = $this->portsMappings;
$this->database->is_public = $this->isPublic;
$this->database->public_port = $this->publicPort;
+ $this->database->public_proxy_timeout = $this->publicProxyTimeout;
$this->database->custom_docker_run_options = $this->customDockerRunOptions;
$this->database->is_log_drain_enabled = $this->isLogDrainEnabled;
$this->database->save();
@@ -130,6 +134,7 @@ public function syncData(bool $toModel = false)
$this->portsMappings = $this->database->ports_mappings;
$this->isPublic = $this->database->is_public;
$this->publicPort = $this->database->public_port;
+ $this->publicProxyTimeout = $this->database->public_proxy_timeout;
$this->customDockerRunOptions = $this->database->custom_docker_run_options;
$this->isLogDrainEnabled = $this->database->is_log_drain_enabled;
$this->dbUrl = $this->database->internal_db_url;
diff --git a/app/Livewire/Project/Database/Dragonfly/General.php b/app/Livewire/Project/Database/Dragonfly/General.php
index 4e325b9eef..db32d0661a 100644
--- a/app/Livewire/Project/Database/Dragonfly/General.php
+++ b/app/Livewire/Project/Database/Dragonfly/General.php
@@ -36,6 +36,8 @@ class General extends Component
public ?int $publicPort = null;
+ public ?int $publicProxyTimeout = null;
+
public ?string $customDockerRunOptions = null;
public ?string $dbUrl = null;
@@ -91,6 +93,7 @@ protected function rules(): array
'portsMappings' => 'nullable|string',
'isPublic' => 'nullable|boolean',
'publicPort' => 'nullable|integer',
+ 'publicProxyTimeout' => 'nullable|integer|min:0',
'customDockerRunOptions' => 'nullable|string',
'dbUrl' => 'nullable|string',
'dbUrlPublic' => 'nullable|string',
@@ -124,6 +127,7 @@ public function syncData(bool $toModel = false)
$this->database->ports_mappings = $this->portsMappings;
$this->database->is_public = $this->isPublic;
$this->database->public_port = $this->publicPort;
+ $this->database->public_proxy_timeout = $this->publicProxyTimeout;
$this->database->custom_docker_run_options = $this->customDockerRunOptions;
$this->database->is_log_drain_enabled = $this->isLogDrainEnabled;
$this->database->enable_ssl = $this->enable_ssl;
@@ -139,6 +143,7 @@ public function syncData(bool $toModel = false)
$this->portsMappings = $this->database->ports_mappings;
$this->isPublic = $this->database->is_public;
$this->publicPort = $this->database->public_port;
+ $this->publicProxyTimeout = $this->database->public_proxy_timeout;
$this->customDockerRunOptions = $this->database->custom_docker_run_options;
$this->isLogDrainEnabled = $this->database->is_log_drain_enabled;
$this->enable_ssl = $this->database->enable_ssl;
diff --git a/app/Livewire/Project/Database/Keydb/General.php b/app/Livewire/Project/Database/Keydb/General.php
index f02aa6674b..8890ab3f6b 100644
--- a/app/Livewire/Project/Database/Keydb/General.php
+++ b/app/Livewire/Project/Database/Keydb/General.php
@@ -38,6 +38,8 @@ class General extends Component
public ?int $publicPort = null;
+ public ?int $publicProxyTimeout = null;
+
public ?string $customDockerRunOptions = null;
public ?string $dbUrl = null;
@@ -94,6 +96,7 @@ protected function rules(): array
'portsMappings' => 'nullable|string',
'isPublic' => 'nullable|boolean',
'publicPort' => 'nullable|integer',
+ 'publicProxyTimeout' => 'nullable|integer|min:0',
'customDockerRunOptions' => 'nullable|string',
'dbUrl' => 'nullable|string',
'dbUrlPublic' => 'nullable|string',
@@ -130,6 +133,7 @@ public function syncData(bool $toModel = false)
$this->database->ports_mappings = $this->portsMappings;
$this->database->is_public = $this->isPublic;
$this->database->public_port = $this->publicPort;
+ $this->database->public_proxy_timeout = $this->publicProxyTimeout;
$this->database->custom_docker_run_options = $this->customDockerRunOptions;
$this->database->is_log_drain_enabled = $this->isLogDrainEnabled;
$this->database->enable_ssl = $this->enable_ssl;
@@ -146,6 +150,7 @@ public function syncData(bool $toModel = false)
$this->portsMappings = $this->database->ports_mappings;
$this->isPublic = $this->database->is_public;
$this->publicPort = $this->database->public_port;
+ $this->publicProxyTimeout = $this->database->public_proxy_timeout;
$this->customDockerRunOptions = $this->database->custom_docker_run_options;
$this->isLogDrainEnabled = $this->database->is_log_drain_enabled;
$this->enable_ssl = $this->database->enable_ssl;
diff --git a/app/Livewire/Project/Database/Mariadb/General.php b/app/Livewire/Project/Database/Mariadb/General.php
index 74658e2a4e..b58acc0cbe 100644
--- a/app/Livewire/Project/Database/Mariadb/General.php
+++ b/app/Livewire/Project/Database/Mariadb/General.php
@@ -44,6 +44,8 @@ class General extends Component
public ?int $publicPort = null;
+ public ?int $publicProxyTimeout = null;
+
public bool $isLogDrainEnabled = false;
public ?string $customDockerRunOptions = null;
@@ -79,6 +81,7 @@ protected function rules(): array
'portsMappings' => 'nullable',
'isPublic' => 'nullable|boolean',
'publicPort' => 'nullable|integer',
+ 'publicProxyTimeout' => 'nullable|integer|min:0',
'isLogDrainEnabled' => 'nullable|boolean',
'customDockerRunOptions' => 'nullable',
'enableSsl' => 'boolean',
@@ -154,6 +157,7 @@ public function syncData(bool $toModel = false)
$this->database->ports_mappings = $this->portsMappings;
$this->database->is_public = $this->isPublic;
$this->database->public_port = $this->publicPort;
+ $this->database->public_proxy_timeout = $this->publicProxyTimeout;
$this->database->is_log_drain_enabled = $this->isLogDrainEnabled;
$this->database->custom_docker_run_options = $this->customDockerRunOptions;
$this->database->enable_ssl = $this->enableSsl;
@@ -173,6 +177,7 @@ public function syncData(bool $toModel = false)
$this->portsMappings = $this->database->ports_mappings;
$this->isPublic = $this->database->is_public;
$this->publicPort = $this->database->public_port;
+ $this->publicProxyTimeout = $this->database->public_proxy_timeout;
$this->isLogDrainEnabled = $this->database->is_log_drain_enabled;
$this->customDockerRunOptions = $this->database->custom_docker_run_options;
$this->enableSsl = $this->database->enable_ssl;
diff --git a/app/Livewire/Project/Database/Mongodb/General.php b/app/Livewire/Project/Database/Mongodb/General.php
index 9f34b73d5b..0f274a585f 100644
--- a/app/Livewire/Project/Database/Mongodb/General.php
+++ b/app/Livewire/Project/Database/Mongodb/General.php
@@ -42,6 +42,8 @@ class General extends Component
public ?int $publicPort = null;
+ public ?int $publicProxyTimeout = null;
+
public bool $isLogDrainEnabled = false;
public ?string $customDockerRunOptions = null;
@@ -78,6 +80,7 @@ protected function rules(): array
'portsMappings' => 'nullable',
'isPublic' => 'nullable|boolean',
'publicPort' => 'nullable|integer',
+ 'publicProxyTimeout' => 'nullable|integer|min:0',
'isLogDrainEnabled' => 'nullable|boolean',
'customDockerRunOptions' => 'nullable',
'enableSsl' => 'boolean',
@@ -153,6 +156,7 @@ public function syncData(bool $toModel = false)
$this->database->ports_mappings = $this->portsMappings;
$this->database->is_public = $this->isPublic;
$this->database->public_port = $this->publicPort;
+ $this->database->public_proxy_timeout = $this->publicProxyTimeout;
$this->database->is_log_drain_enabled = $this->isLogDrainEnabled;
$this->database->custom_docker_run_options = $this->customDockerRunOptions;
$this->database->enable_ssl = $this->enableSsl;
@@ -172,6 +176,7 @@ public function syncData(bool $toModel = false)
$this->portsMappings = $this->database->ports_mappings;
$this->isPublic = $this->database->is_public;
$this->publicPort = $this->database->public_port;
+ $this->publicProxyTimeout = $this->database->public_proxy_timeout;
$this->isLogDrainEnabled = $this->database->is_log_drain_enabled;
$this->customDockerRunOptions = $this->database->custom_docker_run_options;
$this->enableSsl = $this->database->enable_ssl;
diff --git a/app/Livewire/Project/Database/Mysql/General.php b/app/Livewire/Project/Database/Mysql/General.php
index 86b1092514..041dd71c5c 100644
--- a/app/Livewire/Project/Database/Mysql/General.php
+++ b/app/Livewire/Project/Database/Mysql/General.php
@@ -44,6 +44,8 @@ class General extends Component
public ?int $publicPort = null;
+ public ?int $publicProxyTimeout = null;
+
public bool $isLogDrainEnabled = false;
public ?string $customDockerRunOptions = null;
@@ -81,6 +83,7 @@ protected function rules(): array
'portsMappings' => 'nullable',
'isPublic' => 'nullable|boolean',
'publicPort' => 'nullable|integer',
+ 'publicProxyTimeout' => 'nullable|integer|min:0',
'isLogDrainEnabled' => 'nullable|boolean',
'customDockerRunOptions' => 'nullable',
'enableSsl' => 'boolean',
@@ -159,6 +162,7 @@ public function syncData(bool $toModel = false)
$this->database->ports_mappings = $this->portsMappings;
$this->database->is_public = $this->isPublic;
$this->database->public_port = $this->publicPort;
+ $this->database->public_proxy_timeout = $this->publicProxyTimeout;
$this->database->is_log_drain_enabled = $this->isLogDrainEnabled;
$this->database->custom_docker_run_options = $this->customDockerRunOptions;
$this->database->enable_ssl = $this->enableSsl;
@@ -179,6 +183,7 @@ public function syncData(bool $toModel = false)
$this->portsMappings = $this->database->ports_mappings;
$this->isPublic = $this->database->is_public;
$this->publicPort = $this->database->public_port;
+ $this->publicProxyTimeout = $this->database->public_proxy_timeout;
$this->isLogDrainEnabled = $this->database->is_log_drain_enabled;
$this->customDockerRunOptions = $this->database->custom_docker_run_options;
$this->enableSsl = $this->database->enable_ssl;
diff --git a/app/Livewire/Project/Database/Postgresql/General.php b/app/Livewire/Project/Database/Postgresql/General.php
index e246743151..c8f464f198 100644
--- a/app/Livewire/Project/Database/Postgresql/General.php
+++ b/app/Livewire/Project/Database/Postgresql/General.php
@@ -48,6 +48,8 @@ class General extends Component
public ?int $publicPort = null;
+ public ?int $publicProxyTimeout = null;
+
public bool $isLogDrainEnabled = false;
public ?string $customDockerRunOptions = null;
@@ -93,6 +95,7 @@ protected function rules(): array
'portsMappings' => 'nullable',
'isPublic' => 'nullable|boolean',
'publicPort' => 'nullable|integer',
+ 'publicProxyTimeout' => 'nullable|integer|min:0',
'isLogDrainEnabled' => 'nullable|boolean',
'customDockerRunOptions' => 'nullable',
'enableSsl' => 'boolean',
@@ -174,6 +177,7 @@ public function syncData(bool $toModel = false)
$this->database->ports_mappings = $this->portsMappings;
$this->database->is_public = $this->isPublic;
$this->database->public_port = $this->publicPort;
+ $this->database->public_proxy_timeout = $this->publicProxyTimeout;
$this->database->is_log_drain_enabled = $this->isLogDrainEnabled;
$this->database->custom_docker_run_options = $this->customDockerRunOptions;
$this->database->enable_ssl = $this->enableSsl;
@@ -196,6 +200,7 @@ public function syncData(bool $toModel = false)
$this->portsMappings = $this->database->ports_mappings;
$this->isPublic = $this->database->is_public;
$this->publicPort = $this->database->public_port;
+ $this->publicProxyTimeout = $this->database->public_proxy_timeout;
$this->isLogDrainEnabled = $this->database->is_log_drain_enabled;
$this->customDockerRunOptions = $this->database->custom_docker_run_options;
$this->enableSsl = $this->database->enable_ssl;
diff --git a/app/Livewire/Project/Database/Redis/General.php b/app/Livewire/Project/Database/Redis/General.php
index 08bcdc3431..5c96092a73 100644
--- a/app/Livewire/Project/Database/Redis/General.php
+++ b/app/Livewire/Project/Database/Redis/General.php
@@ -36,6 +36,8 @@ class General extends Component
public ?int $publicPort = null;
+ public ?int $publicProxyTimeout = null;
+
public bool $isLogDrainEnabled = false;
public ?string $customDockerRunOptions = null;
@@ -74,6 +76,7 @@ protected function rules(): array
'portsMappings' => 'nullable',
'isPublic' => 'nullable|boolean',
'publicPort' => 'nullable|integer',
+ 'publicProxyTimeout' => 'nullable|integer|min:0',
'isLogDrainEnabled' => 'nullable|boolean',
'customDockerRunOptions' => 'nullable',
'redisUsername' => 'required',
@@ -143,6 +146,7 @@ public function syncData(bool $toModel = false)
$this->database->ports_mappings = $this->portsMappings;
$this->database->is_public = $this->isPublic;
$this->database->public_port = $this->publicPort;
+ $this->database->public_proxy_timeout = $this->publicProxyTimeout;
$this->database->is_log_drain_enabled = $this->isLogDrainEnabled;
$this->database->custom_docker_run_options = $this->customDockerRunOptions;
$this->database->enable_ssl = $this->enableSsl;
@@ -158,6 +162,7 @@ public function syncData(bool $toModel = false)
$this->portsMappings = $this->database->ports_mappings;
$this->isPublic = $this->database->is_public;
$this->publicPort = $this->database->public_port;
+ $this->publicProxyTimeout = $this->database->public_proxy_timeout;
$this->isLogDrainEnabled = $this->database->is_log_drain_enabled;
$this->customDockerRunOptions = $this->database->custom_docker_run_options;
$this->enableSsl = $this->database->enable_ssl;
diff --git a/database/migrations/2026_02_18_000001_add_public_proxy_timeout_to_database_tables.php b/database/migrations/2026_02_18_000001_add_public_proxy_timeout_to_database_tables.php
new file mode 100644
index 0000000000..af87c482e0
--- /dev/null
+++ b/database/migrations/2026_02_18_000001_add_public_proxy_timeout_to_database_tables.php
@@ -0,0 +1,56 @@
+integer('public_proxy_timeout')->default(0)->after('public_port');
+ });
+ }
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ $tables = [
+ 'standalone_postgresqls',
+ 'standalone_mysqls',
+ 'standalone_mariadbs',
+ 'standalone_redis',
+ 'standalone_keydbs',
+ 'standalone_dragonflies',
+ 'standalone_mongodbs',
+ 'standalone_clickhouses',
+ 'service_databases',
+ ];
+
+ foreach ($tables as $table) {
+ Schema::table($table, function (Blueprint $table) {
+ $table->dropColumn('public_proxy_timeout');
+ });
+ }
+ }
+};
diff --git a/resources/views/livewire/project/database/clickhouse/general.blade.php b/resources/views/livewire/project/database/clickhouse/general.blade.php
index 2010e0afcd..c0a99dd1ab 100644
--- a/resources/views/livewire/project/database/clickhouse/general.blade.php
+++ b/resources/views/livewire/project/database/clickhouse/general.blade.php
@@ -78,6 +78,9 @@