fix(ServiceParser): prioritize manually migrated services over image detection for database identification

This commit is contained in:
Andras Bacsai 2025-11-11 23:24:53 +01:00
parent 4055c1790b
commit 033433f553
2 changed files with 123 additions and 44 deletions

View file

@ -1433,6 +1433,23 @@ function serviceParser(Service $resource): Collection
} }
$image = data_get_str($service, 'image'); $image = data_get_str($service, 'image');
// Check for manually migrated services first (respects user's conversion choice)
$migratedApp = ServiceApplication::where('name', $serviceName)
->where('service_id', $resource->id)
->where('is_migrated', true)
->first();
$migratedDb = ServiceDatabase::where('name', $serviceName)
->where('service_id', $resource->id)
->where('is_migrated', true)
->first();
if ($migratedApp || $migratedDb) {
// Use the migrated service type, ignoring image detection
$isDatabase = (bool) $migratedDb;
$savedService = $migratedApp ?: $migratedDb;
} else {
// Use image detection for non-migrated services
$isDatabase = isDatabaseImage($image, $service); $isDatabase = isDatabaseImage($image, $service);
if ($isDatabase) { if ($isDatabase) {
$applicationFound = ServiceApplication::where('name', $serviceName)->where('service_id', $resource->id)->first(); $applicationFound = ServiceApplication::where('name', $serviceName)->where('service_id', $resource->id)->first();
@ -1450,6 +1467,7 @@ function serviceParser(Service $resource): Collection
'service_id' => $resource->id, 'service_id' => $resource->id,
]); ]);
} }
}
// Update image if it changed // Update image if it changed
if ($savedService->image !== $image) { if ($savedService->image !== $image) {
$savedService->image = $image; $savedService->image = $image;
@ -1463,7 +1481,24 @@ function serviceParser(Service $resource): Collection
$environment = collect(data_get($service, 'environment', [])); $environment = collect(data_get($service, 'environment', []));
$buildArgs = collect(data_get($service, 'build.args', [])); $buildArgs = collect(data_get($service, 'build.args', []));
$environment = $environment->merge($buildArgs); $environment = $environment->merge($buildArgs);
// Check for manually migrated services first (respects user's conversion choice)
$migratedApp = ServiceApplication::where('name', $serviceName)
->where('service_id', $resource->id)
->where('is_migrated', true)
->first();
$migratedDb = ServiceDatabase::where('name', $serviceName)
->where('service_id', $resource->id)
->where('is_migrated', true)
->first();
if ($migratedApp || $migratedDb) {
// Use the migrated service type, ignoring image detection
$isDatabase = (bool) $migratedDb;
} else {
// Use image detection for non-migrated services
$isDatabase = isDatabaseImage($image, $service); $isDatabase = isDatabaseImage($image, $service);
}
$containerName = "$serviceName-{$resource->uuid}"; $containerName = "$serviceName-{$resource->uuid}";
@ -1483,7 +1518,11 @@ function serviceParser(Service $resource): Collection
if ($serviceName === 'plausible') { if ($serviceName === 'plausible') {
$predefinedPort = '8000'; $predefinedPort = '8000';
} }
if ($isDatabase) {
if ($migratedApp || $migratedDb) {
// Use the already determined migrated service
$savedService = $migratedApp ?: $migratedDb;
} elseif ($isDatabase) {
$applicationFound = ServiceApplication::where('name', $serviceName)->where('service_id', $resource->id)->first(); $applicationFound = ServiceApplication::where('name', $serviceName)->where('service_id', $resource->id)->first();
if ($applicationFound) { if ($applicationFound) {
$savedService = $applicationFound; $savedService = $applicationFound;
@ -1756,7 +1795,25 @@ function serviceParser(Service $resource): Collection
$environment = convertToKeyValueCollection($environment); $environment = convertToKeyValueCollection($environment);
$coolifyEnvironments = collect([]); $coolifyEnvironments = collect([]);
// Check for manually migrated services first (respects user's conversion choice)
$migratedApp = ServiceApplication::where('name', $serviceName)
->where('service_id', $resource->id)
->where('is_migrated', true)
->first();
$migratedDb = ServiceDatabase::where('name', $serviceName)
->where('service_id', $resource->id)
->where('is_migrated', true)
->first();
if ($migratedApp || $migratedDb) {
// Use the migrated service type, ignoring image detection
$isDatabase = (bool) $migratedDb;
$savedService = $migratedApp ?: $migratedDb;
} else {
// Use image detection for non-migrated services
$isDatabase = isDatabaseImage($image, $service); $isDatabase = isDatabaseImage($image, $service);
}
$volumesParsed = collect([]); $volumesParsed = collect([]);
$containerName = "$serviceName-{$resource->uuid}"; $containerName = "$serviceName-{$resource->uuid}";
@ -1778,7 +1835,10 @@ function serviceParser(Service $resource): Collection
$predefinedPort = '8000'; $predefinedPort = '8000';
} }
if ($isDatabase) { if ($migratedApp || $migratedDb) {
// Use the already determined migrated service
$savedService = $migratedApp ?: $migratedDb;
} elseif ($isDatabase) {
$applicationFound = ServiceApplication::where('name', $serviceName)->where('service_id', $resource->id)->first(); $applicationFound = ServiceApplication::where('name', $serviceName)->where('service_id', $resource->id)->first();
if ($applicationFound) { if ($applicationFound) {
$savedService = $applicationFound; $savedService = $applicationFound;

View file

@ -1353,8 +1353,24 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal
// Decide if the service is a database // Decide if the service is a database
$image = data_get_str($service, 'image'); $image = data_get_str($service, 'image');
// Check for manually migrated services first (respects user's conversion choice)
$migratedApp = ServiceApplication::where('name', $serviceName)
->where('service_id', $resource->id)
->where('is_migrated', true)
->first();
$migratedDb = ServiceDatabase::where('name', $serviceName)
->where('service_id', $resource->id)
->where('is_migrated', true)
->first();
if ($migratedApp || $migratedDb) {
// Use the migrated service type, ignoring image detection
$isDatabase = (bool) $migratedDb;
$savedService = $migratedApp ?: $migratedDb;
} else {
// Use image detection for non-migrated services
$isDatabase = isDatabaseImage($image, $service); $isDatabase = isDatabaseImage($image, $service);
data_set($service, 'is_database', $isDatabase);
// Create new serviceApplication or serviceDatabase // Create new serviceApplication or serviceDatabase
if ($isDatabase) { if ($isDatabase) {
@ -1398,6 +1414,9 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal
} }
} }
} }
}
data_set($service, 'is_database', $isDatabase);
// Check if image changed // Check if image changed
if ($savedService->image !== $image) { if ($savedService->image !== $image) {