From c79f48b6b8903e7553d703b04087c468b1bd1a2c Mon Sep 17 00:00:00 2001 From: johandenhollander Date: Thu, 15 Oct 2026 23:13:44 +0200 Subject: [PATCH 1/3] fix(previews): delete compose preview storage records on cleanup (#12006) Co-authored-by: Claude Opus 5.5 --- app/Models/ApplicationPreview.php | 5 +- .../ApplicationPreviewVolumeCleanupTest.php | 46 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/app/Models/ApplicationPreview.php b/app/Models/ApplicationPreview.php index 4a0f6d78f0..17b791d733 100644 --- a/app/Models/ApplicationPreview.php +++ b/app/Models/ApplicationPreview.php @@ -54,10 +54,13 @@ class ApplicationPreview extends BaseModel if (data_get($preview, 'application.build_pack') === 'dockercompose') { $composeFile = $application->parse(pull_request_id: $preview->pull_request_id); - foreach ($preview->generatedComposeVolumeNames($application, collect(data_get($composeFile, 'volumes', []))) as $volumeName) { + $volumeNames = $preview->generatedComposeVolumeNames($application, collect(data_get($composeFile, 'volumes', []))); + foreach ($volumeNames as $volumeName) { // Docker does not remove a volume that a container still uses, also with -f. instant_remote_process(['docker volume rm -f '.escapeshellarg($volumeName)], $server, false); } + // The compose parser stores preview volumes on the application, not on the preview + $application->persistentStorages()->whereIn('name', $volumeNames)->delete(); $preview->removeComposePreviewNetwork($application, $server); } else { // Regular application volume cleanup diff --git a/tests/Feature/ApplicationPreviewVolumeCleanupTest.php b/tests/Feature/ApplicationPreviewVolumeCleanupTest.php index 7f59f689fc..de7731aa08 100644 --- a/tests/Feature/ApplicationPreviewVolumeCleanupTest.php +++ b/tests/Feature/ApplicationPreviewVolumeCleanupTest.php @@ -11,6 +11,7 @@ use App\Models\StandaloneDocker; use App\Models\Team; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Support\Facades\Process; +use Illuminate\Support\Facades\Queue; uses(RefreshDatabase::class); @@ -118,3 +119,48 @@ it('continues removing preview volumes when an earlier volume is already absent' Process::assertRan(fn ($process) => str_contains($process->command, "docker volume rm -f 'app-data-pr-42'")); expect(ApplicationPreview::find($this->preview->id))->toBeNull(); }); + +it('deletes the persistent storage records of a docker compose preview', function () { + Queue::fake(); + $this->application->update([ + 'build_pack' => 'dockercompose', + 'compose_parsing_version' => '5', + 'docker_compose_raw' => <<<'YAML' +services: + app: + image: nginx:alpine + volumes: + - files:/app/files + - db:/var/lib/mysql +volumes: + files: + db: +YAML, + ]); + $this->application->refresh(); + $uuid = $this->application->uuid; + + // Deploying the application, this preview and another preview creates the storage records + $this->application->parse(); + $this->application->parse(pull_request_id: 42); + $this->application->parse(pull_request_id: 43); + expect($this->application->persistentStorages()->pluck('name')->sort()->values()->all())->toBe([ + "{$uuid}_db", + "{$uuid}_db-pr-42", + "{$uuid}_db-pr-43", + "{$uuid}_files", + "{$uuid}_files-pr-42", + "{$uuid}_files-pr-43", + ]); + Process::fake(['*' => Process::result(output: '')]); + + $this->preview->forceDelete(); + + Process::assertRan(fn ($process) => str_contains($process->command, "docker volume rm -f '{$uuid}_db-pr-42'")); + expect($this->application->persistentStorages()->pluck('name')->sort()->values()->all())->toBe([ + "{$uuid}_db", + "{$uuid}_db-pr-43", + "{$uuid}_files", + "{$uuid}_files-pr-43", + ]); +}); From fbdd2c77cd72e40a7b33350d5965991f727675d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Cruz?= <161638790+SrJooJ@users.noreply.github.com> Date: Thu, 15 Oct 2026 18:14:56 -0300 Subject: [PATCH 2/3] fix(service): supabase realtime logs not sent to analytics (#12001) --- templates/compose/supabase.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/compose/supabase.yaml b/templates/compose/supabase.yaml index b79eec6043..dd94501335 100644 --- a/templates/compose/supabase.yaml +++ b/templates/compose/supabase.yaml @@ -913,7 +913,7 @@ services: kong: 'contains(string!(.appname), "supabase-kong")' auth: 'contains(string!(.appname), "supabase-auth")' rest: 'contains(string!(.appname), "supabase-rest")' - realtime: 'contains(string!(.appname), "supabase-realtime")' + realtime: 'contains(string!(.appname), "realtime-dev")' storage: 'contains(string!(.appname), "supabase-storage")' functions: 'contains(string!(.appname), "supabase-edge-functions")' db: 'contains(string!(.appname), "supabase-db")' From 054100ef7facc47350a73541920172c355d7e9e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Cruz?= <161638790+SrJooJ@users.noreply.github.com> Date: Thu, 15 Oct 2026 18:15:19 -0300 Subject: [PATCH 3/3] fix(service): supabase realtime secret_key_base is empty (#12002) --- templates/compose/supabase.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/compose/supabase.yaml b/templates/compose/supabase.yaml index dd94501335..cedb19be94 100644 --- a/templates/compose/supabase.yaml +++ b/templates/compose/supabase.yaml @@ -1297,7 +1297,7 @@ services: - DB_AFTER_CONNECT_QUERY=SET search_path TO _realtime - DB_ENC_KEY=supabaserealtime - API_JWT_SECRET=${SERVICE_PASSWORD_JWT} - - SECRET_KEY_BASE=${SECRET_PASSWORD_REALTIME} + - SECRET_KEY_BASE=${SERVICE_PASSWORD_64_REALTIME} - METRICS_JWT_SECRET=${SERVICE_PASSWORD_JWT} - ERL_AFLAGS=-proto_dist inet_tcp - DNS_NODES=''