Merge pull request #5194 from coollabsio/next

v4.0.0-beta.395
This commit is contained in:
Andras Bacsai
2025-02-22 13:12:13 +01:00
committed by GitHub
12 changed files with 62 additions and 17 deletions

View File

@@ -35,10 +35,18 @@ class Docker extends Component
$this->network = new Cuid2; $this->network = new Cuid2;
$this->servers = Server::isUsable()->get(); $this->servers = Server::isUsable()->get();
if ($server_id) { 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; $this->serverId = $this->selectedServer->id;
} else { } 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->serverId = $this->selectedServer->id;
} }
$this->generateName(); $this->generateName();

View File

@@ -43,8 +43,10 @@ class Heading extends Component
public function check_status($showNotification = false) public function check_status($showNotification = false)
{ {
GetContainersStatus::run($this->database->destination->server); if ($this->database->destination->server->isFunctional()) {
$this->database->refresh(); GetContainersStatus::dispatch($this->database->destination->server);
}
if ($showNotification) { if ($showNotification) {
$this->dispatch('success', 'Database status updated.'); $this->dispatch('success', 'Database status updated.');
} }

View File

@@ -92,7 +92,9 @@ class Configuration extends Component
public function check_status() public function check_status()
{ {
try { try {
GetContainersStatus::run($this->service->server); if ($this->service->server->isFunctional()) {
GetContainersStatus::dispatch($this->service->server);
}
$this->service->applications->each(function ($application) { $this->service->applications->each(function ($application) {
$application->refresh(); $application->refresh();
}); });

View File

@@ -7,6 +7,7 @@ use App\Actions\Server\StopSentinel;
use App\Events\ServerReachabilityChanged; use App\Events\ServerReachabilityChanged;
use App\Models\Server; use App\Models\Server;
use Livewire\Attributes\Computed; use Livewire\Attributes\Computed;
use Livewire\Attributes\Locked;
use Livewire\Attributes\Validate; use Livewire\Attributes\Validate;
use Livewire\Component; use Livewire\Component;
@@ -50,6 +51,9 @@ class Show extends Component
#[Validate(['required'])] #[Validate(['required'])]
public bool $isBuildServer; public bool $isBuildServer;
#[Locked]
public bool $isBuildServerLocked = false;
#[Validate(['required'])] #[Validate(['required'])]
public bool $isMetricsEnabled; public bool $isMetricsEnabled;
@@ -95,6 +99,9 @@ class Show extends Component
try { try {
$this->server = Server::ownedByCurrentTeam()->whereUuid($server_uuid)->firstOrFail(); $this->server = Server::ownedByCurrentTeam()->whereUuid($server_uuid)->firstOrFail();
$this->syncData(); $this->syncData();
if (! $this->server->isEmpty()) {
$this->isBuildServerLocked = true;
}
} catch (\Throwable $e) { } catch (\Throwable $e) {
return handleError($e, $this); return handleError($e, $this);
} }

View File

@@ -1341,4 +1341,11 @@ $schema://$host {
throw new \Exception('Invalid proxy type.'); throw new \Exception('Invalid proxy type.');
} }
} }
public function isEmpty()
{
return $this->applications()->count() == 0 &&
$this->databases()->count() == 0 &&
$this->services()->count() == 0;
}
} }

View File

@@ -2,7 +2,7 @@
return [ return [
'coolify' => [ 'coolify' => [
'version' => '4.0.0-beta.394', 'version' => '4.0.0-beta.395',
'helper_version' => '1.0.6', 'helper_version' => '1.0.6',
'realtime_version' => '1.0.5', 'realtime_version' => '1.0.5',
'self_hosted' => env('SELF_HOSTED', true), 'self_hosted' => env('SELF_HOSTED', true),

View File

@@ -57,7 +57,8 @@
language: '{{ $language }}', language: '{{ $language }}',
domReadOnly: '{{ $readonly ?? false }}', domReadOnly: '{{ $readonly ?? false }}',
contextmenu: '!{{ $readonly ?? false }}', contextmenu: '!{{ $readonly ?? false }}',
renderLineHighlight: '{{ $readonly ?? false }} ? none : all' renderLineHighlight: '{{ $readonly ?? false }} ? none : all',
stickyScroll: { enabled: false }
}); });
const observer = new MutationObserver((mutations) => { const observer = new MutationObserver((mutations) => {

View File

@@ -1,22 +1,33 @@
<div x-data="{ raw: true }"> <div x-data="{ raw: true, showNormalTextarea: false }">
<div class="pb-4">Volume names are updated upon save. The service UUID will be added as a prefix to all volumes, to <div class="pb-4">Volume names are updated upon save. The service UUID will be added as a prefix to all volumes, to
prevent prevent
name collision. <br>To see the actual volume names, check the Deployable Compose file, or go to Storage name collision. <br>To see the actual volume names, check the Deployable Compose file, or go to Storage
menu.</div> menu.</div>
<div x-cloak x-show="raw" class="font-mono"> <div x-cloak x-show="raw" class="font-mono">
<div x-cloak x-show="showNormalTextarea">
<x-forms.textarea rows="20" id="service.docker_compose_raw">
</x-forms.textarea>
</div>
<div x-cloak x-show="!showNormalTextarea">
<x-forms.textarea allowTab useMonacoEditor monacoEditorLanguage="yaml" rows="20" <x-forms.textarea allowTab useMonacoEditor monacoEditorLanguage="yaml" rows="20"
id="service.docker_compose_raw"> id="service.docker_compose_raw">
</x-forms.textarea> </x-forms.textarea>
</div> </div>
</div>
<div x-cloak x-show="raw === false" class="font-mono"> <div x-cloak x-show="raw === false" class="font-mono">
<x-forms.textarea rows="20" readonly id="service.docker_compose"> <x-forms.textarea rows="20" readonly id="service.docker_compose">
</x-forms.textarea> </x-forms.textarea>
</div> </div>
<div class="pt-2 w-96"> <div class="pt-2 flex gap-2">
<x-forms.checkbox label="Escape special characters in labels?" <x-forms.checkbox label="Escape special characters in labels?"
helper="By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$.<br><br>If you want to use env variables inside the labels, turn this off." helper="By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$.<br><br>If you want to use env variables inside the labels, turn this off."
id="service.is_container_label_escape_enabled" instantSave></x-forms.checkbox> id="service.is_container_label_escape_enabled" instantSave></x-forms.checkbox>
<div class="flex-1"></div>
<div x-cloak x-show="raw">
<x-forms.button class="w-32" @click.prevent="showNormalTextarea = !showNormalTextarea">Switch
Textarea</x-forms.button>
</div>
</div> </div>
<div class="flex justify-end w-full gap-2 pt-4"> <div class="flex justify-end w-full gap-2 pt-4">
<div class="flex items-end gap-2"> <div class="flex items-end gap-2">

View File

@@ -134,7 +134,14 @@
<div class="w-full"> <div class="w-full">
@if (!$server->isLocalhost()) @if (!$server->isLocalhost())
<div class="w-96"> <div class="w-96">
<x-forms.checkbox instantSave id="isBuildServer" label="Use it as a build server?" /> @if ($isBuildServerLocked)
<x-forms.checkbox disabled instantSave id="isBuildServer"
helper="You can't use this server as a build server because it has defined resources."
label="Use it as a build server?" />
@else
<x-forms.checkbox instantSave id="isBuildServer"
label="Use it as a build server?" />
@endif
</div> </div>
@if (!$server->isBuildServer() && !$server->settings->is_cloudflare_tunnel) @if (!$server->isBuildServer() && !$server->settings->is_cloudflare_tunnel)

View File

@@ -38,7 +38,7 @@ services:
- POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
- POSTGRES_DB=${POSTGRES_DB:-fider} - POSTGRES_DB=${POSTGRES_DB:-fider}
healthcheck: healthcheck:
test: ["CMD", "pg_isready", "-U", "$SERVICE_USER_POSTGRES"] test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
interval: 5s interval: 5s
timeout: 20s timeout: 20s
retries: 10 retries: 10

View File

@@ -801,7 +801,7 @@
"fider": { "fider": {
"documentation": "https://fider.io?utm_source=coolify.io", "documentation": "https://fider.io?utm_source=coolify.io",
"slogan": "Fider is a feedback platform for collecting and managing user feedback.", "slogan": "Fider is a feedback platform for collecting and managing user feedback.",
"compose": "c2VydmljZXM6CiAgZmlkZXI6CiAgICBpbWFnZTogJ2dldGZpZGVyL2ZpZGVyOnN0YWJsZScKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9GSURFUl8zMDAwCiAgICAgIC0gQkFTRV9VUkw9JFNFUlZJQ0VfRlFETl9GSURFUl8zMDAwCiAgICAgIC0gJ0RBVEFCQVNFX1VSTD1wb3N0Z3JlczovLyRTRVJWSUNFX1VTRVJfUE9TVEdSRVM6JFNFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVNAZGF0YWJhc2U6NTQzMi9maWRlcj9zc2xtb2RlPWRpc2FibGUnCiAgICAgIC0gSldUX1NFQ1JFVD0kU0VSVklDRV9QQVNTV09SRF82NF9GSURFUgogICAgICAtICdFTUFJTF9OT1JFUExZPSR7RU1BSUxfTk9SRVBMWTotbm9yZXBseUBleGFtcGxlLmNvbX0nCiAgICAgIC0gRU1BSUxfTUFJTEdVTl9BUEk9JEVNQUlMX01BSUxHVU5fQVBJCiAgICAgIC0gRU1BSUxfTUFJTEdVTl9ET01BSU49JEVNQUlMX01BSUxHVU5fRE9NQUlOCiAgICAgIC0gRU1BSUxfTUFJTEdVTl9SRUdJT049JEVNQUlMX01BSUxHVU5fUkVHSU9OCiAgICAgIC0gJ0VNQUlMX1NNVFBfSE9TVD0ke0VNQUlMX1NNVFBfSE9TVDotc210cC5tYWlsZ3VuLmNvbX0nCiAgICAgIC0gJ0VNQUlMX1NNVFBfUE9SVD0ke0VNQUlMX1NNVFBfUE9SVDotNTg3fScKICAgICAgLSAnRU1BSUxfU01UUF9VU0VSTkFNRT0ke0VNQUlMX1NNVFBfVVNFUk5BTUU6LXBvc3RtYXN0ZXJAbWFpbGd1bi5jb219JwogICAgICAtIEVNQUlMX1NNVFBfUEFTU1dPUkQ9JEVNQUlMX1NNVFBfUEFTU1dPUkQKICAgICAgLSBFTUFJTF9TTVRQX0VOQUJMRV9TVEFSVFRMUz0kRU1BSUxfU01UUF9FTkFCTEVfU1RBUlRUTFMKICAgICAgLSBFTUFJTF9BV1NTRVNfUkVHSU9OPSRFTUFJTF9BV1NTRVNfUkVHSU9OCiAgICAgIC0gRU1BSUxfQVdTU0VTX0FDQ0VTU19LRVlfSUQ9JEVNQUlMX0FXU1NFU19BQ0NFU1NfS0VZX0lECiAgICAgIC0gRU1BSUxfQVdTU0VTX1NFQ1JFVF9BQ0NFU1NfS0VZPSRFTUFJTF9BV1NTRVNfU0VDUkVUX0FDQ0VTU19LRVkKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSAvYXBwL2ZpZGVyCiAgICAgICAgLSBwaW5nCiAgICAgIGludGVydmFsOiAycwogICAgICB0aW1lb3V0OiAxMHMKICAgICAgcmV0cmllczogMTAKICBkYXRhYmFzZToKICAgIGltYWdlOiAncG9zdGdyZXM6MTInCiAgICB2b2x1bWVzOgogICAgICAtICdwZ19kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGVudmlyb25tZW50OgogICAgICAtIFBPU1RHUkVTX1VTRVI9JFNFUlZJQ0VfVVNFUl9QT1NUR1JFUwogICAgICAtIFBPU1RHUkVTX1BBU1NXT1JEPSRTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTCiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7UE9TVEdSRVNfREI6LWZpZGVyfScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSBwZ19pc3JlYWR5CiAgICAgICAgLSAnLVUnCiAgICAgICAgLSAkU0VSVklDRV9VU0VSX1BPU1RHUkVTCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMTAK", "compose": "c2VydmljZXM6CiAgZmlkZXI6CiAgICBpbWFnZTogJ2dldGZpZGVyL2ZpZGVyOnN0YWJsZScKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9GSURFUl8zMDAwCiAgICAgIC0gQkFTRV9VUkw9JFNFUlZJQ0VfRlFETl9GSURFUl8zMDAwCiAgICAgIC0gJ0RBVEFCQVNFX1VSTD1wb3N0Z3JlczovLyRTRVJWSUNFX1VTRVJfUE9TVEdSRVM6JFNFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVNAZGF0YWJhc2U6NTQzMi9maWRlcj9zc2xtb2RlPWRpc2FibGUnCiAgICAgIC0gSldUX1NFQ1JFVD0kU0VSVklDRV9QQVNTV09SRF82NF9GSURFUgogICAgICAtICdFTUFJTF9OT1JFUExZPSR7RU1BSUxfTk9SRVBMWTotbm9yZXBseUBleGFtcGxlLmNvbX0nCiAgICAgIC0gRU1BSUxfTUFJTEdVTl9BUEk9JEVNQUlMX01BSUxHVU5fQVBJCiAgICAgIC0gRU1BSUxfTUFJTEdVTl9ET01BSU49JEVNQUlMX01BSUxHVU5fRE9NQUlOCiAgICAgIC0gRU1BSUxfTUFJTEdVTl9SRUdJT049JEVNQUlMX01BSUxHVU5fUkVHSU9OCiAgICAgIC0gJ0VNQUlMX1NNVFBfSE9TVD0ke0VNQUlMX1NNVFBfSE9TVDotc210cC5tYWlsZ3VuLmNvbX0nCiAgICAgIC0gJ0VNQUlMX1NNVFBfUE9SVD0ke0VNQUlMX1NNVFBfUE9SVDotNTg3fScKICAgICAgLSAnRU1BSUxfU01UUF9VU0VSTkFNRT0ke0VNQUlMX1NNVFBfVVNFUk5BTUU6LXBvc3RtYXN0ZXJAbWFpbGd1bi5jb219JwogICAgICAtIEVNQUlMX1NNVFBfUEFTU1dPUkQ9JEVNQUlMX1NNVFBfUEFTU1dPUkQKICAgICAgLSBFTUFJTF9TTVRQX0VOQUJMRV9TVEFSVFRMUz0kRU1BSUxfU01UUF9FTkFCTEVfU1RBUlRUTFMKICAgICAgLSBFTUFJTF9BV1NTRVNfUkVHSU9OPSRFTUFJTF9BV1NTRVNfUkVHSU9OCiAgICAgIC0gRU1BSUxfQVdTU0VTX0FDQ0VTU19LRVlfSUQ9JEVNQUlMX0FXU1NFU19BQ0NFU1NfS0VZX0lECiAgICAgIC0gRU1BSUxfQVdTU0VTX1NFQ1JFVF9BQ0NFU1NfS0VZPSRFTUFJTF9BV1NTRVNfU0VDUkVUX0FDQ0VTU19LRVkKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSAvYXBwL2ZpZGVyCiAgICAgICAgLSBwaW5nCiAgICAgIGludGVydmFsOiAycwogICAgICB0aW1lb3V0OiAxMHMKICAgICAgcmV0cmllczogMTAKICBkYXRhYmFzZToKICAgIGltYWdlOiAncG9zdGdyZXM6MTInCiAgICB2b2x1bWVzOgogICAgICAtICdwZ19kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGVudmlyb25tZW50OgogICAgICAtIFBPU1RHUkVTX1VTRVI9JFNFUlZJQ0VfVVNFUl9QT1NUR1JFUwogICAgICAtIFBPU1RHUkVTX1BBU1NXT1JEPSRTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTCiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7UE9TVEdSRVNfREI6LWZpZGVyfScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAncGdfaXNyZWFkeSAtZCAkJHtQT1NUR1JFU19EQn0gLVUgJCR7UE9TVEdSRVNfVVNFUn0nCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMTAK",
"tags": [ "tags": [
"feedback", "feedback",
"user-feedback" "user-feedback"

View File

@@ -1,10 +1,10 @@
{ {
"coolify": { "coolify": {
"v4": { "v4": {
"version": "4.0.0-beta.394" "version": "4.0.0-beta.395"
}, },
"nightly": { "nightly": {
"version": "4.0.0-beta.395" "version": "4.0.0-beta.396"
}, },
"helper": { "helper": {
"version": "1.0.6" "version": "1.0.6"