From e0d233f933f570a85d87a5b7ae169c07c37d9d95 Mon Sep 17 00:00:00 2001 From: Devin Dissanayaka Date: Sun, 30 Aug 2026 20:23:23 +0530 Subject: [PATCH] =?UTF-8?q?fix(deployments):=20keep=20every=20domain=20int?= =?UTF-8?q?act=20in=20COOLIFY=5FURL=20and=20COOLIFY=E2=80=A6=20(#11527)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> --- app/Jobs/ApplicationDeploymentJob.php | 6 +- ...icationDeploymentCoolifyUrlDomainsTest.php | 94 +++++++++++++++++++ 2 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 tests/Unit/ApplicationDeploymentCoolifyUrlDomainsTest.php diff --git a/app/Jobs/ApplicationDeploymentJob.php b/app/Jobs/ApplicationDeploymentJob.php index 7168aea5f..48547c4d9 100644 --- a/app/Jobs/ApplicationDeploymentJob.php +++ b/app/Jobs/ApplicationDeploymentJob.php @@ -2280,9 +2280,9 @@ private function set_coolify_variables() $fqdn = $this->preview->fqdn; } if (isset($fqdn)) { - $url = Url::fromString($fqdn); - $fqdn = $url->getHost(); - $url = $url->withHost($fqdn)->withPort(null)->__toString(); + $domains = str($fqdn)->explode(',')->map(fn (string $domain) => trim($domain))->filter(); + $url = $domains->map(fn (string $domain) => Url::fromString($domain)->withPort(null)->__toString())->implode(','); + $fqdn = $domains->map(fn (string $domain) => Url::fromString($domain)->getHost())->implode(','); if ((int) $this->application->compose_parsing_version >= 3) { $this->coolify_variables .= 'COOLIFY_URL='.escapeShellValue($url).' '; $this->coolify_variables .= 'COOLIFY_FQDN='.escapeShellValue($fqdn).' '; diff --git a/tests/Unit/ApplicationDeploymentCoolifyUrlDomainsTest.php b/tests/Unit/ApplicationDeploymentCoolifyUrlDomainsTest.php new file mode 100644 index 000000000..f6684718e --- /dev/null +++ b/tests/Unit/ApplicationDeploymentCoolifyUrlDomainsTest.php @@ -0,0 +1,94 @@ + 'Coolify Url Team', + 'personal_team' => false, + 'show_boarding' => false, + ]); + $project = Project::create([ + 'name' => 'Coolify Url Project', + 'team_id' => $team->id, + ]); + $environment = Environment::where('project_id', $project->id)->firstOrFail(); + $server = Server::factory()->create(['team_id' => $team->id]); + $destination = $server->standaloneDockers()->firstOrFail(); + $application = Application::factory()->create([ + 'environment_id' => $environment->id, + 'destination_id' => $destination->id, + 'destination_type' => StandaloneDocker::class, + 'build_pack' => 'dockercompose', + 'fqdn' => $fqdn, + ]); + + // The created hook resets this, so it has to be set afterwards. + $application->compose_parsing_version = $composeParsingVersion; + $application->save(); + + $job = new TestableCoolifyUrlDeploymentJob; + $reflection = new ReflectionClass(ApplicationDeploymentJob::class); + + foreach ([ + 'application' => $application->fresh(), + 'pull_request_id' => 0, + 'commit' => 'HEAD', + ] as $property => $value) { + $reflection->getProperty($property)->setValue($job, $value); + } + + $reflection->getMethod('set_coolify_variables')->invoke($job); + + return $reflection->getProperty('coolify_variables')->getValue($job); +} + +it('keeps every domain intact when an application has multiple domains', function () { + $variables = coolifyVariablesForFqdn('https://a.example.com,https://b.example.com'); + + expect($variables) + ->toContain("COOLIFY_URL='https://a.example.com,https://b.example.com'") + ->toContain("COOLIFY_FQDN='a.example.com,b.example.com'"); +}); + +it('strips the port from every domain when an application has multiple domains', function () { + $variables = coolifyVariablesForFqdn('https://a.example.com:8080,https://b.example.com:9000'); + + expect($variables) + ->toContain("COOLIFY_URL='https://a.example.com,https://b.example.com'") + ->toContain("COOLIFY_FQDN='a.example.com,b.example.com'"); +}); + +it('keeps every domain intact on the legacy compose parsing version', function () { + $variables = coolifyVariablesForFqdn('https://a.example.com,https://b.example.com', '2'); + + expect($variables) + ->toContain("COOLIFY_URL='a.example.com,b.example.com'") + ->toContain("COOLIFY_FQDN='https://a.example.com,https://b.example.com'"); +}); + +it('still resolves a single domain', function () { + $variables = coolifyVariablesForFqdn('https://a.example.com'); + + expect($variables) + ->toContain("COOLIFY_URL='https://a.example.com'") + ->toContain("COOLIFY_FQDN='a.example.com'"); +});