From 596f8bcf976265338e5946f75234494fd6e3f483 Mon Sep 17 00:00:00 2001 From: TheGenio Date: Mon, 2 Feb 2026 00:49:22 +0300 Subject: [PATCH] feat: add custom container name prefix option --- app/Livewire/Project/Application/Advanced.php | 23 +++++++++++++++ bootstrap/helpers/docker.php | 6 +++- ...er_name_prefix_to_application_settings.php | 28 +++++++++++++++++++ .../project/application/advanced.blade.php | 7 +++++ 4 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 database/migrations/2026_02_02_000000_add_custom_container_name_prefix_to_application_settings.php 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" /> Save +
+ + Save + @endif @if ($application->build_pack === 'dockercompose')

Network