diff --git a/app/Livewire/Destination/New/Docker.php b/app/Livewire/Destination/New/Docker.php
index 0e60025e5..eb768d191 100644
--- a/app/Livewire/Destination/New/Docker.php
+++ b/app/Livewire/Destination/New/Docker.php
@@ -35,10 +35,18 @@ class Docker extends Component
$this->network = new Cuid2;
$this->servers = Server::isUsable()->get();
if ($server_id) {
- $this->selectedServer = $this->servers->find($server_id) ?: $this->servers->first();
+ $foundServer = $this->servers->find($server_id) ?: $this->servers->first();
+ if (! $foundServer) {
+ throw new \Exception('Server not found.');
+ }
+ $this->selectedServer = $foundServer;
$this->serverId = $this->selectedServer->id;
} else {
- $this->selectedServer = $this->servers->first();
+ $foundServer = $this->servers->first();
+ if (! $foundServer) {
+ throw new \Exception('Server not found.');
+ }
+ $this->selectedServer = $foundServer;
$this->serverId = $this->selectedServer->id;
}
$this->generateName();
diff --git a/app/Livewire/Project/Database/Heading.php b/app/Livewire/Project/Database/Heading.php
index fc0febd02..c3b57b9f4 100644
--- a/app/Livewire/Project/Database/Heading.php
+++ b/app/Livewire/Project/Database/Heading.php
@@ -43,8 +43,10 @@ class Heading extends Component
public function check_status($showNotification = false)
{
- GetContainersStatus::run($this->database->destination->server);
- $this->database->refresh();
+ if ($this->database->destination->server->isFunctional()) {
+ GetContainersStatus::dispatch($this->database->destination->server);
+ }
+
if ($showNotification) {
$this->dispatch('success', 'Database status updated.');
}
diff --git a/app/Livewire/Project/Service/Configuration.php b/app/Livewire/Project/Service/Configuration.php
index b36a860ce..da49dcae9 100644
--- a/app/Livewire/Project/Service/Configuration.php
+++ b/app/Livewire/Project/Service/Configuration.php
@@ -92,7 +92,9 @@ class Configuration extends Component
public function check_status()
{
try {
- GetContainersStatus::run($this->service->server);
+ if ($this->service->server->isFunctional()) {
+ GetContainersStatus::dispatch($this->service->server);
+ }
$this->service->applications->each(function ($application) {
$application->refresh();
});
diff --git a/app/Livewire/Server/Show.php b/app/Livewire/Server/Show.php
index 6d267b9c8..b0e6d8858 100644
--- a/app/Livewire/Server/Show.php
+++ b/app/Livewire/Server/Show.php
@@ -7,6 +7,7 @@ use App\Actions\Server\StopSentinel;
use App\Events\ServerReachabilityChanged;
use App\Models\Server;
use Livewire\Attributes\Computed;
+use Livewire\Attributes\Locked;
use Livewire\Attributes\Validate;
use Livewire\Component;
@@ -50,6 +51,9 @@ class Show extends Component
#[Validate(['required'])]
public bool $isBuildServer;
+ #[Locked]
+ public bool $isBuildServerLocked = false;
+
#[Validate(['required'])]
public bool $isMetricsEnabled;
@@ -95,6 +99,9 @@ class Show extends Component
try {
$this->server = Server::ownedByCurrentTeam()->whereUuid($server_uuid)->firstOrFail();
$this->syncData();
+ if (! $this->server->isEmpty()) {
+ $this->isBuildServerLocked = true;
+ }
} catch (\Throwable $e) {
return handleError($e, $this);
}
diff --git a/app/Models/Server.php b/app/Models/Server.php
index f3edd82fb..187685d66 100644
--- a/app/Models/Server.php
+++ b/app/Models/Server.php
@@ -1341,4 +1341,11 @@ $schema://$host {
throw new \Exception('Invalid proxy type.');
}
}
+
+ public function isEmpty()
+ {
+ return $this->applications()->count() == 0 &&
+ $this->databases()->count() == 0 &&
+ $this->services()->count() == 0;
+ }
}
diff --git a/config/constants.php b/config/constants.php
index 4a10d22ef..eedb348f7 100644
--- a/config/constants.php
+++ b/config/constants.php
@@ -2,7 +2,7 @@
return [
'coolify' => [
- 'version' => '4.0.0-beta.394',
+ 'version' => '4.0.0-beta.395',
'helper_version' => '1.0.6',
'realtime_version' => '1.0.5',
'self_hosted' => env('SELF_HOSTED', true),
diff --git a/resources/views/components/forms/monaco-editor.blade.php b/resources/views/components/forms/monaco-editor.blade.php
index 690e654d4..811953153 100644
--- a/resources/views/components/forms/monaco-editor.blade.php
+++ b/resources/views/components/forms/monaco-editor.blade.php
@@ -57,7 +57,8 @@
language: '{{ $language }}',
domReadOnly: '{{ $readonly ?? false }}',
contextmenu: '!{{ $readonly ?? false }}',
- renderLineHighlight: '{{ $readonly ?? false }} ? none : all'
+ renderLineHighlight: '{{ $readonly ?? false }} ? none : all',
+ stickyScroll: { enabled: false }
});
const observer = new MutationObserver((mutations) => {
diff --git a/resources/views/livewire/project/service/edit-compose.blade.php b/resources/views/livewire/project/service/edit-compose.blade.php
index a99c117fb..beaccac91 100644
--- a/resources/views/livewire/project/service/edit-compose.blade.php
+++ b/resources/views/livewire/project/service/edit-compose.blade.php
@@ -1,22 +1,33 @@
-
+
Volume names are updated upon save. The service UUID will be added as a prefix to all volumes, to
prevent
name collision.
To see the actual volume names, check the Deployable Compose file, or go to Storage
menu.
-
+
+
+
+ Switch
+ Textarea
+
diff --git a/resources/views/livewire/server/show.blade.php b/resources/views/livewire/server/show.blade.php
index ac0d3a6df..77aebbc04 100644
--- a/resources/views/livewire/server/show.blade.php
+++ b/resources/views/livewire/server/show.blade.php
@@ -134,7 +134,14 @@
@if (!$server->isLocalhost())
-
+ @if ($isBuildServerLocked)
+
+ @else
+
+ @endif
@if (!$server->isBuildServer() && !$server->settings->is_cloudflare_tunnel)
diff --git a/templates/compose/fider.yaml b/templates/compose/fider.yaml
index d3bda3895..fa3b323b0 100644
--- a/templates/compose/fider.yaml
+++ b/templates/compose/fider.yaml
@@ -38,7 +38,7 @@ services:
- POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
- POSTGRES_DB=${POSTGRES_DB:-fider}
healthcheck:
- test: ["CMD", "pg_isready", "-U", "$SERVICE_USER_POSTGRES"]
+ test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
interval: 5s
timeout: 20s
retries: 10
diff --git a/templates/service-templates.json b/templates/service-templates.json
index df57f65ee..0e151805b 100644
--- a/templates/service-templates.json
+++ b/templates/service-templates.json
@@ -801,7 +801,7 @@
"fider": {
"documentation": "https://fider.io?utm_source=coolify.io",
"slogan": "Fider is a feedback platform for collecting and managing user feedback.",
- "compose": "c2VydmljZXM6CiAgZmlkZXI6CiAgICBpbWFnZTogJ2dldGZpZGVyL2ZpZGVyOnN0YWJsZScKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9GSURFUl8zMDAwCiAgICAgIC0gQkFTRV9VUkw9JFNFUlZJQ0VfRlFETl9GSURFUl8zMDAwCiAgICAgIC0gJ0RBVEFCQVNFX1VSTD1wb3N0Z3JlczovLyRTRVJWSUNFX1VTRVJfUE9TVEdSRVM6JFNFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVNAZGF0YWJhc2U6NTQzMi9maWRlcj9zc2xtb2RlPWRpc2FibGUnCiAgICAgIC0gSldUX1NFQ1JFVD0kU0VSVklDRV9QQVNTV09SRF82NF9GSURFUgogICAgICAtICdFTUFJTF9OT1JFUExZPSR7RU1BSUxfTk9SRVBMWTotbm9yZXBseUBleGFtcGxlLmNvbX0nCiAgICAgIC0gRU1BSUxfTUFJTEdVTl9BUEk9JEVNQUlMX01BSUxHVU5fQVBJCiAgICAgIC0gRU1BSUxfTUFJTEdVTl9ET01BSU49JEVNQUlMX01BSUxHVU5fRE9NQUlOCiAgICAgIC0gRU1BSUxfTUFJTEdVTl9SRUdJT049JEVNQUlMX01BSUxHVU5fUkVHSU9OCiAgICAgIC0gJ0VNQUlMX1NNVFBfSE9TVD0ke0VNQUlMX1NNVFBfSE9TVDotc210cC5tYWlsZ3VuLmNvbX0nCiAgICAgIC0gJ0VNQUlMX1NNVFBfUE9SVD0ke0VNQUlMX1NNVFBfUE9SVDotNTg3fScKICAgICAgLSAnRU1BSUxfU01UUF9VU0VSTkFNRT0ke0VNQUlMX1NNVFBfVVNFUk5BTUU6LXBvc3RtYXN0ZXJAbWFpbGd1bi5jb219JwogICAgICAtIEVNQUlMX1NNVFBfUEFTU1dPUkQ9JEVNQUlMX1NNVFBfUEFTU1dPUkQKICAgICAgLSBFTUFJTF9TTVRQX0VOQUJMRV9TVEFSVFRMUz0kRU1BSUxfU01UUF9FTkFCTEVfU1RBUlRUTFMKICAgICAgLSBFTUFJTF9BV1NTRVNfUkVHSU9OPSRFTUFJTF9BV1NTRVNfUkVHSU9OCiAgICAgIC0gRU1BSUxfQVdTU0VTX0FDQ0VTU19LRVlfSUQ9JEVNQUlMX0FXU1NFU19BQ0NFU1NfS0VZX0lECiAgICAgIC0gRU1BSUxfQVdTU0VTX1NFQ1JFVF9BQ0NFU1NfS0VZPSRFTUFJTF9BV1NTRVNfU0VDUkVUX0FDQ0VTU19LRVkKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSAvYXBwL2ZpZGVyCiAgICAgICAgLSBwaW5nCiAgICAgIGludGVydmFsOiAycwogICAgICB0aW1lb3V0OiAxMHMKICAgICAgcmV0cmllczogMTAKICBkYXRhYmFzZToKICAgIGltYWdlOiAncG9zdGdyZXM6MTInCiAgICB2b2x1bWVzOgogICAgICAtICdwZ19kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGVudmlyb25tZW50OgogICAgICAtIFBPU1RHUkVTX1VTRVI9JFNFUlZJQ0VfVVNFUl9QT1NUR1JFUwogICAgICAtIFBPU1RHUkVTX1BBU1NXT1JEPSRTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTCiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7UE9TVEdSRVNfREI6LWZpZGVyfScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSBwZ19pc3JlYWR5CiAgICAgICAgLSAnLVUnCiAgICAgICAgLSAkU0VSVklDRV9VU0VSX1BPU1RHUkVTCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMTAK",
+ "compose": "c2VydmljZXM6CiAgZmlkZXI6CiAgICBpbWFnZTogJ2dldGZpZGVyL2ZpZGVyOnN0YWJsZScKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9GSURFUl8zMDAwCiAgICAgIC0gQkFTRV9VUkw9JFNFUlZJQ0VfRlFETl9GSURFUl8zMDAwCiAgICAgIC0gJ0RBVEFCQVNFX1VSTD1wb3N0Z3JlczovLyRTRVJWSUNFX1VTRVJfUE9TVEdSRVM6JFNFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVNAZGF0YWJhc2U6NTQzMi9maWRlcj9zc2xtb2RlPWRpc2FibGUnCiAgICAgIC0gSldUX1NFQ1JFVD0kU0VSVklDRV9QQVNTV09SRF82NF9GSURFUgogICAgICAtICdFTUFJTF9OT1JFUExZPSR7RU1BSUxfTk9SRVBMWTotbm9yZXBseUBleGFtcGxlLmNvbX0nCiAgICAgIC0gRU1BSUxfTUFJTEdVTl9BUEk9JEVNQUlMX01BSUxHVU5fQVBJCiAgICAgIC0gRU1BSUxfTUFJTEdVTl9ET01BSU49JEVNQUlMX01BSUxHVU5fRE9NQUlOCiAgICAgIC0gRU1BSUxfTUFJTEdVTl9SRUdJT049JEVNQUlMX01BSUxHVU5fUkVHSU9OCiAgICAgIC0gJ0VNQUlMX1NNVFBfSE9TVD0ke0VNQUlMX1NNVFBfSE9TVDotc210cC5tYWlsZ3VuLmNvbX0nCiAgICAgIC0gJ0VNQUlMX1NNVFBfUE9SVD0ke0VNQUlMX1NNVFBfUE9SVDotNTg3fScKICAgICAgLSAnRU1BSUxfU01UUF9VU0VSTkFNRT0ke0VNQUlMX1NNVFBfVVNFUk5BTUU6LXBvc3RtYXN0ZXJAbWFpbGd1bi5jb219JwogICAgICAtIEVNQUlMX1NNVFBfUEFTU1dPUkQ9JEVNQUlMX1NNVFBfUEFTU1dPUkQKICAgICAgLSBFTUFJTF9TTVRQX0VOQUJMRV9TVEFSVFRMUz0kRU1BSUxfU01UUF9FTkFCTEVfU1RBUlRUTFMKICAgICAgLSBFTUFJTF9BV1NTRVNfUkVHSU9OPSRFTUFJTF9BV1NTRVNfUkVHSU9OCiAgICAgIC0gRU1BSUxfQVdTU0VTX0FDQ0VTU19LRVlfSUQ9JEVNQUlMX0FXU1NFU19BQ0NFU1NfS0VZX0lECiAgICAgIC0gRU1BSUxfQVdTU0VTX1NFQ1JFVF9BQ0NFU1NfS0VZPSRFTUFJTF9BV1NTRVNfU0VDUkVUX0FDQ0VTU19LRVkKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSAvYXBwL2ZpZGVyCiAgICAgICAgLSBwaW5nCiAgICAgIGludGVydmFsOiAycwogICAgICB0aW1lb3V0OiAxMHMKICAgICAgcmV0cmllczogMTAKICBkYXRhYmFzZToKICAgIGltYWdlOiAncG9zdGdyZXM6MTInCiAgICB2b2x1bWVzOgogICAgICAtICdwZ19kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGVudmlyb25tZW50OgogICAgICAtIFBPU1RHUkVTX1VTRVI9JFNFUlZJQ0VfVVNFUl9QT1NUR1JFUwogICAgICAtIFBPU1RHUkVTX1BBU1NXT1JEPSRTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTCiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7UE9TVEdSRVNfREI6LWZpZGVyfScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAncGdfaXNyZWFkeSAtZCAkJHtQT1NUR1JFU19EQn0gLVUgJCR7UE9TVEdSRVNfVVNFUn0nCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMTAK",
"tags": [
"feedback",
"user-feedback"
diff --git a/versions.json b/versions.json
index 9d3522fbe..4070c932e 100644
--- a/versions.json
+++ b/versions.json
@@ -1,10 +1,10 @@
{
"coolify": {
"v4": {
- "version": "4.0.0-beta.394"
+ "version": "4.0.0-beta.395"
},
"nightly": {
- "version": "4.0.0-beta.395"
+ "version": "4.0.0-beta.396"
},
"helper": {
"version": "1.0.6"