diff --git a/app/Livewire/Project/Application/Advanced.php b/app/Livewire/Project/Application/Advanced.php
index cf7ef3e0b..75fe6fcfc 100644
--- a/app/Livewire/Project/Application/Advanced.php
+++ b/app/Livewire/Project/Application/Advanced.php
@@ -70,6 +70,9 @@ class Advanced extends Component
#[Validate(['string', 'nullable'])]
public ?string $customInternalName = null;
+ #[Validate(['string', 'nullable'])]
+ public ?string $customContainerNamePrefix = null;
+
#[Validate(['boolean'])]
public bool $isGzipEnabled = true;
@@ -111,6 +114,7 @@ class Advanced extends Component
$this->application->settings->is_build_server_enabled = $this->isBuildServerEnabled;
$this->application->settings->is_consistent_container_name_enabled = $this->isConsistentContainerNameEnabled;
$this->application->settings->custom_internal_name = $this->customInternalName;
+ $this->application->settings->custom_container_name_prefix = $this->customContainerNamePrefix;
$this->application->settings->is_gzip_enabled = $this->isGzipEnabled;
$this->application->settings->is_stripprefix_enabled = $this->isStripprefixEnabled;
$this->application->settings->is_raw_compose_deployment_enabled = $this->isRawComposeDeploymentEnabled;
@@ -139,6 +143,7 @@ class Advanced extends Component
$this->isBuildServerEnabled = $this->application->settings->is_build_server_enabled;
$this->isConsistentContainerNameEnabled = $this->application->settings->is_consistent_container_name_enabled;
$this->customInternalName = $this->application->settings->custom_internal_name;
+ $this->customContainerNamePrefix = $this->application->settings->custom_container_name_prefix;
$this->isRawComposeDeploymentEnabled = $this->application->settings->is_raw_compose_deployment_enabled;
$this->isConnectToDockerNetworkEnabled = $this->application->settings->connect_to_docker_network;
$this->disableBuildCache = $this->application->settings->disable_build_cache;
@@ -252,6 +257,24 @@ class Advanced extends Component
}
}
+ public function saveCustomNamePrefix()
+ {
+ try {
+ $this->authorize('update', $this->application);
+
+ if (str($this->customContainerNamePrefix)->isNotEmpty()) {
+ $this->customContainerNamePrefix = str($this->customContainerNamePrefix)->slug()->value();
+ } else {
+ $this->customContainerNamePrefix = null;
+ }
+
+ $this->syncData(true);
+ $this->dispatch('success', 'Custom container name prefix saved.');
+ } catch (\Throwable $e) {
+ return handleError($e, $this);
+ }
+ }
+
public function render()
{
return view('livewire.project.application.advanced');
diff --git a/bootstrap/helpers/docker.php b/bootstrap/helpers/docker.php
index b0d401b5f..af7166e08 100644
--- a/bootstrap/helpers/docker.php
+++ b/bootstrap/helpers/docker.php
@@ -180,6 +180,7 @@ function generateApplicationContainerName(Application $application, $pull_reques
// TODO: refactor generateApplicationContainerName, we do not need $application and $pull_request_id
$consistent_container_name = $application->settings->is_consistent_container_name_enabled;
+ $custom_container_name_prefix = $application->settings->custom_container_name_prefix;
$now = now()->format('Hisu');
if ($pull_request_id !== 0 && $pull_request_id !== null) {
return $application->uuid.'-pr-'.$pull_request_id;
@@ -188,7 +189,10 @@ function generateApplicationContainerName(Application $application, $pull_reques
return $application->uuid;
}
- return $application->uuid.'-'.$now;
+ // Use custom prefix if set, otherwise use uuid
+ $prefix = $custom_container_name_prefix ?? $application->uuid;
+
+ return $prefix.'-'.$now;
}
}
function get_port_from_dockerfile($dockerfile): ?int
diff --git a/database/migrations/2026_02_02_000000_add_custom_container_name_prefix_to_application_settings.php b/database/migrations/2026_02_02_000000_add_custom_container_name_prefix_to_application_settings.php
new file mode 100644
index 000000000..bbeb825e2
--- /dev/null
+++ b/database/migrations/2026_02_02_000000_add_custom_container_name_prefix_to_application_settings.php
@@ -0,0 +1,28 @@
+string('custom_container_name_prefix')->nullable();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::table('application_settings', function (Blueprint $table) {
+ $table->dropColumn('custom_container_name_prefix');
+ });
+ }
+};
diff --git a/resources/views/livewire/project/application/advanced.blade.php b/resources/views/livewire/project/application/advanced.blade.php
index 907500dfa..63656c34f 100644
--- a/resources/views/livewire/project/application/advanced.blade.php
+++ b/resources/views/livewire/project/application/advanced.blade.php
@@ -68,6 +68,13 @@
:canResource="$application" />