feat: coolify init should cleanup stuck networks in proxy

This commit is contained in:
Andras Bacsai
2024-08-05 13:45:24 +02:00
parent 76c39a987c
commit b38a651a08
2 changed files with 50 additions and 4 deletions

View File

@@ -16,7 +16,7 @@ use Illuminate\Support\Facades\Http;
class Init extends Command class Init extends Command
{ {
protected $signature = 'app:init {--full-cleanup} {--cleanup-deployments}'; protected $signature = 'app:init {--full-cleanup} {--cleanup-deployments} {--cleanup-proxy-networks}';
protected $description = 'Cleanup instance related stuffs'; protected $description = 'Cleanup instance related stuffs';
@@ -36,7 +36,7 @@ class Init extends Command
$full_cleanup = $this->option('full-cleanup'); $full_cleanup = $this->option('full-cleanup');
$cleanup_deployments = $this->option('cleanup-deployments'); $cleanup_deployments = $this->option('cleanup-deployments');
$cleanup_proxy_networks = $this->option('cleanup-proxy-networks');
$this->replace_slash_in_environment_name(); $this->replace_slash_in_environment_name();
if ($cleanup_deployments) { if ($cleanup_deployments) {
echo "Running cleanup deployments.\n"; echo "Running cleanup deployments.\n";
@@ -44,9 +44,16 @@ class Init extends Command
return; return;
} }
if ($cleanup_proxy_networks) {
echo "Running cleanup proxy networks.\n";
$this->cleanup_unused_network_from_coolify_proxy();
return;
}
if ($full_cleanup) { if ($full_cleanup) {
// Required for falsely deleted coolify db // Required for falsely deleted coolify db
$this->restore_coolify_db_backup(); $this->restore_coolify_db_backup();
$this->cleanup_unused_network_from_coolify_proxy();
$this->cleanup_in_progress_application_deployments(); $this->cleanup_in_progress_application_deployments();
$this->cleanup_stucked_helper_containers(); $this->cleanup_stucked_helper_containers();
$this->call('cleanup:queue'); $this->call('cleanup:queue');
@@ -75,6 +82,34 @@ class Init extends Command
$this->call('cleanup:stucked-resources'); $this->call('cleanup:stucked-resources');
} }
private function cleanup_unused_network_from_coolify_proxy()
{
ray()->clearAll();
$servers = Server::all();
foreach ($servers as $server) {
if (! $server->isFunctional()) {
continue;
}
if (! $server->isProxyShouldRun()) {
continue;
}
['networks' => $networks, 'allNetworks' => $allNetworks] = collectDockerNetworksByServer($server);
$removeNetworks = $allNetworks->diff($networks);
$commands = collect();
foreach ($removeNetworks as $network) {
$out = instant_remote_process(["docker network inspect -f json $network | jq '.[].Containers | if . == {} then null else . end'"], $server, false);
if (empty($out)) {
$commands->push("docker network disconnect $network coolify-proxy >/dev/null 2>&1 || true");
$commands->push("docker network rm $network >/dev/null 2>&1 || true");
}
}
if ($commands->isNotEmpty()) {
echo "Cleaning up unused networks from coolify proxy\n";
instant_remote_process($commands, $server, false);
}
}
}
private function restore_coolify_db_backup() private function restore_coolify_db_backup()
{ {
try { try {

View File

@@ -24,6 +24,7 @@ function collectProxyDockerNetworksByServer(Server $server)
} }
function collectDockerNetworksByServer(Server $server) function collectDockerNetworksByServer(Server $server)
{ {
$allNetworks = collect([]);
if ($server->isSwarm()) { if ($server->isSwarm()) {
$networks = collect($server->swarmDockers)->map(function ($docker) { $networks = collect($server->swarmDockers)->map(function ($docker) {
return $docker['network']; return $docker['network'];
@@ -34,11 +35,13 @@ function collectDockerNetworksByServer(Server $server)
return $docker['network']; return $docker['network'];
}); });
} }
$allNetworks = $allNetworks->merge($networks);
// Service networks // Service networks
foreach ($server->services()->get() as $service) { foreach ($server->services()->get() as $service) {
if ($service->isRunning()) { if ($service->isRunning()) {
$networks->push($service->networks()); $networks->push($service->networks());
} }
$allNetworks->push($service->networks());
} }
// Docker compose based apps // Docker compose based apps
$docker_compose_apps = $server->dockerComposeBasedApplications(); $docker_compose_apps = $server->dockerComposeBasedApplications();
@@ -46,6 +49,7 @@ function collectDockerNetworksByServer(Server $server)
if ($app->isRunning()) { if ($app->isRunning()) {
$networks->push($app->uuid); $networks->push($app->uuid);
} }
$allNetworks->push($app->uuid);
} }
// Docker compose based preview deployments // Docker compose based preview deployments
$docker_compose_previews = $server->dockerComposeBasedPreviewDeployments(); $docker_compose_previews = $server->dockerComposeBasedPreviewDeployments();
@@ -61,23 +65,30 @@ function collectDockerNetworksByServer(Server $server)
} }
$network = "{$application->uuid}-{$pullRequestId}"; $network = "{$application->uuid}-{$pullRequestId}";
$networks->push($network); $networks->push($network);
$allNetworks->push($network);
} }
$networks = collect($networks)->flatten()->unique(); $networks = collect($networks)->flatten()->unique();
$allNetworks = $allNetworks->flatten()->unique();
if ($server->isSwarm()) { if ($server->isSwarm()) {
if ($networks->count() === 0) { if ($networks->count() === 0) {
$networks = collect(['coolify-overlay']); $networks = collect(['coolify-overlay']);
$allNetworks = collect(['coolify-overlay']);
} }
} else { } else {
if ($networks->count() === 0) { if ($networks->count() === 0) {
$networks = collect(['coolify']); $networks = collect(['coolify']);
$allNetworks = collect(['coolify']);
} }
} }
return $networks; return [
'networks' => $networks,
'allNetworks' => $allNetworks,
];
} }
function connectProxyToNetworks(Server $server) function connectProxyToNetworks(Server $server)
{ {
$networks = collectDockerNetworksByServer($server); ['networks' => $networks] = collectDockerNetworksByServer($server);
if ($server->isSwarm()) { if ($server->isSwarm()) {
$commands = $networks->map(function ($network) { $commands = $networks->map(function ($network) {
return [ return [