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"