diff --git a/resources/views/components/application/configuration-sidebar.blade.php b/resources/views/components/application/configuration-sidebar.blade.php
index 0040902d0c..6497a0b521 100644
--- a/resources/views/components/application/configuration-sidebar.blade.php
+++ b/resources/views/components/application/configuration-sidebar.blade.php
@@ -196,17 +196,11 @@
['id' => 'build-pipeline-section', 'label' => 'Build & deploy'],
$isComposeApp ? null : ['id' => 'container-section', 'label' => 'Container'],
])),
- 'project.application.advanced' => array_values(array_filter([
- ['id' => 'advanced-build-section', 'label' => 'Build'],
+ 'project.application.advanced' => [
+ ['id' => 'advanced-build-section', 'label' => 'Build & deploy'],
['id' => 'advanced-container-section', 'label' => 'Container'],
- $application->git_based() ? ['id' => 'advanced-deployment-section', 'label' => 'Deployment'] : null,
- $application->git_based() ? ['id' => 'advanced-git-section', 'label' => 'Git'] : null,
- $isComposeApp ? ['id' => 'advanced-compose-section', 'label' => 'Docker compose'] : null,
['id' => 'advanced-proxy-section', 'label' => 'Proxy'],
- ['id' => 'advanced-operations-section', 'label' => 'Operations'],
- ['id' => 'advanced-logs-section', 'label' => 'Logs'],
- $isComposeApp ? null : ['id' => 'advanced-gpu-section', 'label' => 'GPU'],
- ])),
+ ],
'project.application.webhooks' => [
['id' => 'deploy-webhook-section', 'label' => 'Deploy webhook'],
['id' => 'manual-git-webhooks-section', 'label' => 'Manual Git webhooks'],
@@ -220,12 +214,6 @@
])),
'project.application.healthcheck' => [
['id' => 'healthcheck-configuration-section', 'label' => 'Configuration'],
- [
- 'id' => $application->health_check_type === 'cmd'
- ? 'healthcheck-command-section'
- : 'healthcheck-request-section',
- 'label' => $application->health_check_type === 'cmd' ? 'Command' : 'HTTP request',
- ],
['id' => 'healthcheck-timing-section', 'label' => 'Timing and retries'],
],
'project.application.resource-operations' => [
diff --git a/resources/views/components/application/settings-subsection.blade.php b/resources/views/components/application/settings-subsection.blade.php
new file mode 100644
index 0000000000..758e957a4e
--- /dev/null
+++ b/resources/views/components/application/settings-subsection.blade.php
@@ -0,0 +1,23 @@
+@props([
+ 'title',
+ 'helper' => null,
+ // The first sub-section of a card has no top divider.
+ 'first' => false,
+])
+
+class(['mt-5 border-t border-neutral-200 pt-5 dark:border-white/[0.07]' => ! $first]) }}>
+
+
+ {{ $title }}
+ @if (filled($helper))
+
+ @endif
+
+ @isset($actions)
+
+ {{ $actions }}
+
+ @endisset
+
+ {{ $slot }}
+
diff --git a/resources/views/livewire/project/application/advanced.blade.php b/resources/views/livewire/project/application/advanced.blade.php
index 9ce4bc1ae9..8fe5f6eefa 100644
--- a/resources/views/livewire/project/application/advanced.blade.php
+++ b/resources/views/livewire/project/application/advanced.blade.php
@@ -11,8 +11,8 @@
@endphp
-
+
true, 'label' => 'Available during build'],
]" :disabled="! $canUpdate" />
+ @if ($application->git_based())
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @endif
+ @if ($application->build_pack === 'dockercompose')
+
+
+
+
+
+
+ @endif
+ helper="Naming, shutdown, logs, and GPU access for the deployed container.">
@endif
-
-
- @if ($application->git_based())
-
-
-
+
+
+
+
-
-
-
+
+
-
-
-
-
- @endif
-
- @if ($application->build_pack === 'dockercompose')
-
-
-
-
-
-
- @endif
+
+ @if ($application->build_pack !== 'dockercompose')
+
+
+ @php($canRefreshGpus = $gpuServers->contains(fn ($gpuServer) => $gpuServer->isFunctional()))
+
+
+ Refresh GPUs
+
+
+
+ @foreach ($gpuServers as $gpuServer)
+ ! $loop->first])>
+
+ {{ $gpuServer->name }}
+ @if (data_get($gpuServer->server_metadata, 'collected_at'))
+ · checked
+ {{ \Illuminate\Support\Carbon::parse(data_get($gpuServer->server_metadata, 'collected_at'))->diffForHumans() }}
+ @endif
+
+
+
+ @endforeach
+
+
+
+
+ @if ($isGpuEnabled)
+
+ @endif
+
+ @endif
+
@@ -173,87 +251,5 @@
@endif
-
-
-
-
-
-
-
-
-
-
-
-
-
- @if ($application->build_pack !== 'dockercompose')
-
-
- @php($canRefreshGpus = $gpuServers->contains(fn ($gpuServer) => $gpuServer->isFunctional()))
-
-
- Refresh GPUs
-
-
-
- @foreach ($gpuServers as $gpuServer)
- ! $loop->first])>
-
- {{ $gpuServer->name }}
- @if (data_get($gpuServer->server_metadata, 'collected_at'))
- · checked
- {{ \Illuminate\Support\Carbon::parse(data_get($gpuServer->server_metadata, 'collected_at'))->diffForHumans() }}
- @endif
-
-
-
- @endforeach
-
-
-
-
- @if ($isGpuEnabled)
-
- @endif
-
- @endif
diff --git a/resources/views/livewire/project/application/general.blade.php b/resources/views/livewire/project/application/general.blade.php
index 4e80a80bfe..f922c27191 100644
--- a/resources/views/livewire/project/application/general.blade.php
+++ b/resources/views/livewire/project/application/general.blade.php
@@ -99,8 +99,7 @@
@if ($buildPack !== 'dockercompose')
-
- Authentication
+
@if ($application->settings->is_container_label_readonly_enabled == false)
@endif
@endif
-
+
@endif
@if ($buildPack !== 'dockercompose')
@@ -398,8 +397,7 @@
@endif
@if ($buildPack !== 'dockercompose')
-
- {{ $application->build_pack === 'dockerimage' ? 'Image' : 'Image registry' }}
+
@if ($application->destination->server->isSwarm())
@if ($application->build_pack !== 'dockerimage')
-
- Credentials
+
@if (!$database->started_at)
You can only change these credentials here before the first start. Later changes must be made inside
@@ -61,7 +60,7 @@
helper="{{ $database->started_at ? 'You can only change this in the database.' : null }}" />
@endif
-
+
@endif
-
-
- Public access
+
+
@@ -102,7 +99,7 @@
helper="Comma-separated host-to-container mappings, for example 3000:8123."
canGate="update" :canResource="$database" />
-
+
-
+
diff --git a/resources/views/livewire/project/database/dragonfly/general.blade.php b/resources/views/livewire/project/database/dragonfly/general.blade.php
index fe8062dde4..d2d54cb619 100644
--- a/resources/views/livewire/project/database/dragonfly/general.blade.php
+++ b/resources/views/livewire/project/database/dragonfly/general.blade.php
@@ -16,8 +16,7 @@
-
- Credentials
+
@if ($database->started_at)
@if ($isPasswordHiddenForMember)
@@ -39,7 +38,7 @@
@endif
@endif
-
+
@endif
-
-
- Public access
+
+
@@ -80,7 +77,7 @@
helper="Comma-separated host-to-container mappings, for example 3000:6379."
canGate="update" :canResource="$database" />
-
+
-
+
diff --git a/resources/views/livewire/project/database/keydb/general.blade.php b/resources/views/livewire/project/database/keydb/general.blade.php
index aac83401a6..dc37700634 100644
--- a/resources/views/livewire/project/database/keydb/general.blade.php
+++ b/resources/views/livewire/project/database/keydb/general.blade.php
@@ -17,8 +17,7 @@
helper="Use a published eqalpha/keydb image from Docker Hub." />
-
- Credentials
+
@if ($database->started_at)
@if ($isPasswordHiddenForMember)
@@ -40,7 +39,7 @@
@endif
@endif
-
+
@endif
-
-
- Public access
+
+
@@ -81,7 +78,7 @@
helper="Comma-separated host-to-container mappings, for example 3000:6379."
canGate="update" :canResource="$database" />
-
+
-
-
+
diff --git a/resources/views/livewire/project/database/mariadb/general.blade.php b/resources/views/livewire/project/database/mariadb/general.blade.php
index 3669388609..84db318d80 100644
--- a/resources/views/livewire/project/database/mariadb/general.blade.php
+++ b/resources/views/livewire/project/database/mariadb/general.blade.php
@@ -17,8 +17,7 @@
helper="Use a published MariaDB image from Docker Hub." />
-
- Credentials
+
@if ($database->started_at)
Changing values here does not update MariaDB. Update MariaDB first, then synchronize the values here
@@ -45,7 +44,7 @@
:readonly="(bool) $database->started_at" canGate="update" :canResource="$database"
helper="{{ $database->started_at ? 'You can only change this in the database.' : null }}" />
-
+
@endif
-
-
- Public access
+
+
@@ -86,7 +83,7 @@
helper="Comma-separated host-to-container mappings, for example 3000:3306."
canGate="update" :canResource="$database" />
-
+
-
-
+
diff --git a/resources/views/livewire/project/database/mongodb/general.blade.php b/resources/views/livewire/project/database/mongodb/general.blade.php
index 0db195fd32..d25b94eb8c 100644
--- a/resources/views/livewire/project/database/mongodb/general.blade.php
+++ b/resources/views/livewire/project/database/mongodb/general.blade.php
@@ -17,8 +17,7 @@
helper="Use a published MongoDB image from Docker Hub." />
-
- Credentials
+
@if ($database->started_at)
Changing values here does not update MongoDB. Update MongoDB first, then synchronize the values here
@@ -42,7 +41,7 @@
canGate="update" :canResource="$database"
helper="{{ $database->started_at ? 'You can only change this in the database.' : null }}" />
-
+
@endif
-
-
- Public access
+
+
@@ -83,7 +80,7 @@
helper="Comma-separated host-to-container mappings, for example 3000:27017."
canGate="update" :canResource="$database" />
-
+
-
-
+
diff --git a/resources/views/livewire/project/database/mysql/general.blade.php b/resources/views/livewire/project/database/mysql/general.blade.php
index 237a7ec263..24647f89f1 100644
--- a/resources/views/livewire/project/database/mysql/general.blade.php
+++ b/resources/views/livewire/project/database/mysql/general.blade.php
@@ -17,8 +17,7 @@
helper="Use a published MySQL image from Docker Hub." />
-
- Credentials
+
@if ($database->started_at)
Changing values here does not update MySQL. Update MySQL first, then synchronize the values here so
@@ -45,7 +44,7 @@
:readonly="(bool) $database->started_at" canGate="update" :canResource="$database"
helper="{{ $database->started_at ? 'You can only change this in the database.' : null }}" />
-
+
@endif
-
-
- Public access
+
+
@@ -86,7 +83,7 @@
helper="Comma-separated host-to-container mappings, for example 3000:3306."
canGate="update" :canResource="$database" />
-
+
-
-
+
diff --git a/resources/views/livewire/project/database/postgresql/general.blade.php b/resources/views/livewire/project/database/postgresql/general.blade.php
index 5774892960..d7e0c3c9e9 100644
--- a/resources/views/livewire/project/database/postgresql/general.blade.php
+++ b/resources/views/livewire/project/database/postgresql/general.blade.php
@@ -17,8 +17,7 @@
helper="Use a published PostgreSQL image from Docker Hub." />
-
- Credentials
+
@if ($database->started_at)
Changing values here does not update PostgreSQL. Update PostgreSQL first, then synchronize the
@@ -39,16 +38,15 @@
:readonly="(bool) $database->started_at" canGate="update" :canResource="$database"
helper="{{ $database->started_at ? 'You can only change this in the database.' : null }}" />
-
-
+
-
+
@endif
-
-
- Public access
+
+
@@ -89,7 +85,7 @@
helper="Comma-separated host-to-container mappings, for example 3000:5432."
canGate="update" :canResource="$database" />
-
+
-
-
+
diff --git a/resources/views/livewire/project/database/redis/general.blade.php b/resources/views/livewire/project/database/redis/general.blade.php
index 6f3dbface9..f200018a00 100644
--- a/resources/views/livewire/project/database/redis/general.blade.php
+++ b/resources/views/livewire/project/database/redis/general.blade.php
@@ -17,8 +17,7 @@
helper="Use a published Redis image from Docker Hub." />
-
- Credentials
+
@if ($database->started_at)
Changing values here does not update Redis. Update Redis first, then synchronize the values here so
@@ -44,7 +43,7 @@
canGate="update" :canResource="$database" />
@endif
-
+
@endif
-
-
- Public access
+
+
@@ -85,7 +82,7 @@
helper="Comma-separated host-to-container mappings, for example 3000:6379."
canGate="update" :canResource="$database" />
-
+
-
-
+
diff --git a/resources/views/livewire/project/database/sqlite/general.blade.php b/resources/views/livewire/project/database/sqlite/general.blade.php
index 7fb8d6f9a9..ebe9fa1ca5 100644
--- a/resources/views/livewire/project/database/sqlite/general.blade.php
+++ b/resources/views/livewire/project/database/sqlite/general.blade.php
@@ -18,14 +18,13 @@
helper="Use a published peakimages/sqlite image from Docker Hub." />
-
+
@@ -37,14 +36,13 @@
placeholder="--cap-add SYS_ADMIN --device=/dev/fuse"
id="customDockerRunOptions" label="Custom Docker options" canGate="update"
:canResource="$database" />
-
+
diff --git a/resources/views/livewire/project/service/stack-form.blade.php b/resources/views/livewire/project/service/stack-form.blade.php
index fae8fb6bfc..e9a07c199b 100644
--- a/resources/views/livewire/project/service/stack-form.blade.php
+++ b/resources/views/livewire/project/service/stack-form.blade.php
@@ -49,14 +49,13 @@
placeholder="My WordPress site" />
-
+
@if ($fields->count() > 0)
diff --git a/resources/views/livewire/project/shared/health-checks.blade.php b/resources/views/livewire/project/shared/health-checks.blade.php
index 136fb8a52c..6b02c0bf31 100644
--- a/resources/views/livewire/project/shared/health-checks.blade.php
+++ b/resources/views/livewire/project/shared/health-checks.blade.php
@@ -38,56 +38,55 @@
['value' => 'cmd', 'label' => 'Container command'],
]" :disabled="! $canUpdate" />
+ @if ($healthCheckType === 'http')
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @else
+
+
+ The command runs directly inside the container. Operators such as ;, |, &, $, >, and <
+ are blocked.
+
+
+
+
+
+ @endif
- @if ($healthCheckType === 'http')
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- @else
-
-
- The command runs directly inside the container. Operators such as ;, |, &, $, >, and <
- are blocked.
-
-
-
-
-
- @endif
-
diff --git a/resources/views/livewire/server/docker-cleanup.blade.php b/resources/views/livewire/server/docker-cleanup.blade.php
index e12f4cd3da..c4ee3f82ed 100644
--- a/resources/views/livewire/server/docker-cleanup.blade.php
+++ b/resources/views/livewire/server/docker-cleanup.blade.php
@@ -55,57 +55,56 @@
@endif
+
+
+
+ @if (!$forceDockerCleanup)
+
+ @endif
+
+
+
+
+
+ Unused volumes may contain data from stopped containers, while removing retained images
+ disables rollback to older application versions.
+
+
+
+
+
+
+
+
-
-
-
- @if (!$forceDockerCleanup)
-
- @endif
-
-
-
-
-
-
- Unused volumes may contain data from stopped containers, while removing retained images
- disables rollback to older application versions.
-
-
-
-
-
-
-
-
-
+
false, 'label' => 'Disabled'],
]" />
-
-
-
-
-
-
-
-
-
- @if (isCloud())
-
-
-
- @if (filled(data_get($settings, 'domain_connect_private_key')))
-
-
-
- Remove key
-
-
- @elseif (filled(config('services.domain_connect.private_key')))
-
- @else
-
- Automated Cloudflare DNS (Domain Connect) stays hidden until a private key is set.
-
- @endif
-
-
- @endif
-
-
-
- @if ($is_api_enabled && (empty($allowed_ips) || in_array('0.0.0.0', array_map('trim', explode(',', $allowed_ips ?? '')))))
-
- Restrict the allowlist before using API access on a public production instance.
-
- @endif
- @if ($is_mcp_server_enabled)
-
-
- {{ url('/mcp') }}
-
-
- Authenticate with a bearer token from
- Security → API Tokens.
-
- @endif
-
-
-
-
-
-
+ @if ($is_api_enabled && (empty($allowed_ips) || in_array('0.0.0.0', array_map('trim', explode(',', $allowed_ips ?? '')))))
+
+ Restrict the allowlist before using API access on a public production instance.
+
+ @endif
+ @if ($is_mcp_server_enabled)
+
+
+ {{ url('/mcp') }}
+
+
+ Authenticate with a bearer token from
+ Security → API Tokens.
+
+ @endif
+
+
+
+
+
+
+
+
+
+
+ @if (isCloud())
+
+
+
+ @if (filled(data_get($settings, 'domain_connect_private_key')))
+
+
+
+ Remove key
+
+
+ @elseif (filled(config('services.domain_connect.private_key')))
+
+ @else
+
+ Automated Cloudflare DNS (Domain Connect) stays hidden until a private key is set.
+
+ @endif
+
+
+ @endif
+
+
+
@@ -160,36 +160,39 @@
-
-
-
-
-
- @if (count($avatar_storage_options) === 1)
-
- Add and test an S3-compatible storage under Storages before selecting it here.
+
+
+
+
+
+
+ @if (count($avatar_storage_options) === 1)
+
+ Add and test an S3-compatible storage under Storages before selecting it here.
+
+ @endif
+
+
+
+
+
+
+ When you select an S3 storage, Coolify adds a lifecycle rule that deletes objects under
+ coolify-file-downloads/ after 1 day, as a safety net. The selected
+ storage must be reachable from your servers, and the S3 provider must support lifecycle rules.
- @endif
+
-
-
-
-
-
- When you select an S3 storage, Coolify adds a lifecycle rule that deletes objects under
- coolify-file-downloads/ after 1 day, as a safety net. The selected
- storage must be reachable from your servers, and the S3 provider must support lifecycle rules.
-
-
diff --git a/resources/views/livewire/source/gitea/change.blade.php b/resources/views/livewire/source/gitea/change.blade.php
index a59fb7abf4..2bb4d74b29 100644
--- a/resources/views/livewire/source/gitea/change.blade.php
+++ b/resources/views/livewire/source/gitea/change.blade.php
@@ -33,11 +33,11 @@
-