Fix PostgREST misclassification and empty Domains section (#7442)

This commit is contained in:
Andras Bacsai 2025-12-04 14:53:36 +01:00 committed by GitHub
commit 21f3ef6f9f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 103 additions and 2 deletions

View File

@ -48,6 +48,8 @@ const DATABASE_DOCKER_IMAGES = [
'influxdb',
'clickhouse/clickhouse-server',
'timescaledb/timescaledb',
'timescaledb', // Matches timescale/timescaledb
'timescaledb-ha', // Matches timescale/timescaledb-ha
'pgvector/pgvector',
];
const SPECIFIC_SERVICES = [

View File

@ -770,10 +770,26 @@ function isDatabaseImage(?string $image = null, ?array $serviceConfig = null)
}
$imageName = $image->before(':');
// First check if it's a known database image
// Extract base image name (ignore registry prefix)
// Examples:
// docker.io/library/postgres -> postgres
// ghcr.io/postgrest/postgrest -> postgrest
// postgres -> postgres
// postgrest/postgrest -> postgrest
$baseImageName = $imageName;
if (str($imageName)->contains('/')) {
$baseImageName = str($imageName)->afterLast('/');
}
// Check if base image name exactly matches a known database image
$isKnownDatabase = false;
foreach (DATABASE_DOCKER_IMAGES as $database_docker_image) {
if (str($imageName)->contains($database_docker_image)) {
// Extract base name from database pattern for comparison
$databaseBaseName = str($database_docker_image)->contains('/')
? str($database_docker_image)->afterLast('/')
: $database_docker_image;
if ($baseImageName == $databaseBaseName) {
$isKnownDatabase = true;
break;
}

View File

@ -37,6 +37,16 @@
<livewire:project.service.stack-form :service="$service" />
<h3>Services</h3>
<div class="grid grid-cols-1 gap-2 pt-4 xl:grid-cols-1">
@if($applications->isEmpty() && $databases->isEmpty())
<div class="p-4 text-sm text-neutral-500">
No services defined in this Docker Compose file.
</div>
@elseif($applications->isEmpty())
<div class="p-4 text-sm text-neutral-500">
No applications with domains defined. Only database services are available.
</div>
@endif
@foreach ($applications as $application)
<div @class([
'border-l border-dashed border-red-500' => str(

View File

@ -0,0 +1,73 @@
<?php
test('postgrest image is detected as application not database', function () {
$result = isDatabaseImage('postgrest/postgrest:latest');
expect($result)->toBeFalse();
});
test('postgrest image with version is detected as application', function () {
$result = isDatabaseImage('postgrest/postgrest:v12.0.2');
expect($result)->toBeFalse();
});
test('postgrest with registry prefix is detected as application', function () {
$result = isDatabaseImage('ghcr.io/postgrest/postgrest:latest');
expect($result)->toBeFalse();
});
test('regular postgres image is still detected as database', function () {
$result = isDatabaseImage('postgres:15');
expect($result)->toBeTrue();
});
test('postgres with registry prefix is detected as database', function () {
$result = isDatabaseImage('docker.io/library/postgres:15');
expect($result)->toBeTrue();
});
test('postgres image with service config is detected correctly', function () {
$serviceConfig = [
'image' => 'postgres:15',
'environment' => [
'POSTGRES_PASSWORD=secret',
],
];
$result = isDatabaseImage('postgres:15', $serviceConfig);
expect($result)->toBeTrue();
});
test('postgrest without service config is still detected as application', function () {
$result = isDatabaseImage('postgrest/postgrest', null);
expect($result)->toBeFalse();
});
test('supabase postgres-meta is detected as application', function () {
$result = isDatabaseImage('supabase/postgres-meta:latest');
expect($result)->toBeFalse();
});
test('mysql image is detected as database', function () {
$result = isDatabaseImage('mysql:8.0');
expect($result)->toBeTrue();
});
test('redis image is detected as database', function () {
$result = isDatabaseImage('redis:7');
expect($result)->toBeTrue();
});
test('timescale timescaledb is detected as database', function () {
$result = isDatabaseImage('timescale/timescaledb:latest');
expect($result)->toBeTrue();
});
test('mariadb is detected as database', function () {
$result = isDatabaseImage('mariadb:10.11');
expect($result)->toBeTrue();
});
test('mongodb is detected as database', function () {
$result = isDatabaseImage('mongo:7');
expect($result)->toBeTrue();
});