Fix network connection issues in Server and Service models
This commit is contained in:
@@ -19,6 +19,7 @@ class Show extends Component
|
|||||||
if (is_null($this->server)) {
|
if (is_null($this->server)) {
|
||||||
return redirect()->route('server.all');
|
return redirect()->route('server.all');
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -442,4 +442,10 @@ class Service extends BaseModel
|
|||||||
{
|
{
|
||||||
return parseDockerComposeFile($this, $isNew);
|
return parseDockerComposeFile($this, $isNew);
|
||||||
}
|
}
|
||||||
|
public function networks()
|
||||||
|
{
|
||||||
|
$networks = getTopLevelNetworks($this);
|
||||||
|
// ray($networks);
|
||||||
|
return $networks;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,10 +12,16 @@ function get_proxy_path()
|
|||||||
}
|
}
|
||||||
function connectProxyToNetworks(Server $server)
|
function connectProxyToNetworks(Server $server)
|
||||||
{
|
{
|
||||||
// TODO: Connect to service + compose based application networks as well.
|
// TODO: Connect to compose based application networks as well.
|
||||||
|
// Standalone networks
|
||||||
$networks = collect($server->standaloneDockers)->map(function ($docker) {
|
$networks = collect($server->standaloneDockers)->map(function ($docker) {
|
||||||
return $docker['network'];
|
return $docker['network'];
|
||||||
})->unique();
|
});
|
||||||
|
// Service networks
|
||||||
|
foreach($server->services()->get() as $service) {
|
||||||
|
$networks->push($service->networks());
|
||||||
|
}
|
||||||
|
$networks = collect($networks)->flatten()->unique();
|
||||||
if ($networks->count() === 0) {
|
if ($networks->count() === 0) {
|
||||||
$networks = collect(['coolify']);
|
$networks = collect(['coolify']);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -495,6 +495,89 @@ function removeAnsiColors($text)
|
|||||||
return preg_replace('/\e[[][A-Za-z0-9];?[0-9]*m?/', '', $text);
|
return preg_replace('/\e[[][A-Za-z0-9];?[0-9]*m?/', '', $text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getTopLevelNetworks(Service|Application $resource)
|
||||||
|
{
|
||||||
|
if ($resource->getMorphClass() === 'App\Models\Service') {
|
||||||
|
if ($resource->docker_compose_raw) {
|
||||||
|
try {
|
||||||
|
$yaml = Yaml::parse($resource->docker_compose_raw);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
throw new \Exception($e->getMessage());
|
||||||
|
}
|
||||||
|
$services = data_get($yaml, 'services');
|
||||||
|
$topLevelNetworks = collect(data_get($yaml, 'networks', []));
|
||||||
|
$definedNetwork = collect([$resource->uuid]);
|
||||||
|
$services = collect($services)->map(function ($service, $_) use ($topLevelNetworks, $definedNetwork) {
|
||||||
|
$serviceNetworks = collect(data_get($service, 'networks', []));
|
||||||
|
|
||||||
|
// Collect/create/update networks
|
||||||
|
if ($serviceNetworks->count() > 0) {
|
||||||
|
foreach ($serviceNetworks as $networkName => $networkDetails) {
|
||||||
|
$networkExists = $topLevelNetworks->contains(function ($value, $key) use ($networkName) {
|
||||||
|
return $value == $networkName || $key == $networkName;
|
||||||
|
});
|
||||||
|
if (!$networkExists) {
|
||||||
|
$topLevelNetworks->put($networkDetails, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$definedNetworkExists = $topLevelNetworks->contains(function ($value, $_) use ($definedNetwork) {
|
||||||
|
return $value == $definedNetwork;
|
||||||
|
});
|
||||||
|
if (!$definedNetworkExists) {
|
||||||
|
foreach ($definedNetwork as $network) {
|
||||||
|
$topLevelNetworks->put($network, [
|
||||||
|
'name' => $network,
|
||||||
|
'external' => true
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $service;
|
||||||
|
});
|
||||||
|
return $topLevelNetworks->keys();
|
||||||
|
}
|
||||||
|
} else if ($resource->getMorphClass() === 'App\Models\Application') {
|
||||||
|
try {
|
||||||
|
$yaml = Yaml::parse($resource->docker_compose_raw);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
throw new \Exception($e->getMessage());
|
||||||
|
}
|
||||||
|
$server = $resource->destination->server;
|
||||||
|
$topLevelNetworks = collect(data_get($yaml, 'networks', []));
|
||||||
|
$services = data_get($yaml, 'services');
|
||||||
|
$definedNetwork = collect([$resource->uuid]);
|
||||||
|
$services = collect($services)->map(function ($service, $_) use ($topLevelNetworks, $definedNetwork) {
|
||||||
|
$serviceNetworks = collect(data_get($service, 'networks', []));
|
||||||
|
|
||||||
|
// Collect/create/update networks
|
||||||
|
if ($serviceNetworks->count() > 0) {
|
||||||
|
foreach ($serviceNetworks as $networkName => $networkDetails) {
|
||||||
|
$networkExists = $topLevelNetworks->contains(function ($value, $key) use ($networkName) {
|
||||||
|
return $value == $networkName || $key == $networkName;
|
||||||
|
});
|
||||||
|
if (!$networkExists) {
|
||||||
|
$topLevelNetworks->put($networkDetails, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$definedNetworkExists = $topLevelNetworks->contains(function ($value, $_) use ($definedNetwork) {
|
||||||
|
return $value == $definedNetwork;
|
||||||
|
});
|
||||||
|
if (!$definedNetworkExists) {
|
||||||
|
foreach ($definedNetwork as $network) {
|
||||||
|
$topLevelNetworks->put($network, [
|
||||||
|
'name' => $network,
|
||||||
|
'external' => true
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $service;
|
||||||
|
});
|
||||||
|
return $topLevelNetworks->keys();
|
||||||
|
}
|
||||||
|
}
|
||||||
function parseDockerComposeFile(Service|Application $resource, bool $isNew = false)
|
function parseDockerComposeFile(Service|Application $resource, bool $isNew = false)
|
||||||
{
|
{
|
||||||
ray()->clearAll();
|
ray()->clearAll();
|
||||||
@@ -1010,7 +1093,7 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal
|
|||||||
$resource->docker_compose = Yaml::dump($finalServices, 10, 2);
|
$resource->docker_compose = Yaml::dump($finalServices, 10, 2);
|
||||||
$resource->save();
|
$resource->save();
|
||||||
$resource->saveComposeConfigs();
|
$resource->saveComposeConfigs();
|
||||||
return collect([]);
|
return $finalServices;
|
||||||
} else {
|
} else {
|
||||||
return collect([]);
|
return collect([]);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user