From af3c575d84dc2afd3db8ebf723e196acc739ba6b Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Mon, 26 Feb 2024 14:22:24 +0100 Subject: [PATCH] fix: server disabled --- .../CleanupApplicationDeploymentQueue.php | 25 +++++ app/Jobs/ApplicationDeploymentJob.php | 95 ++++++++++--------- app/Livewire/Dashboard.php | 4 +- app/Models/Server.php | 4 +- app/Traits/ExecuteRemoteCommand.php | 6 -- bootstrap/helpers/remoteProcess.php | 3 + 6 files changed, 81 insertions(+), 56 deletions(-) create mode 100644 app/Console/Commands/CleanupApplicationDeploymentQueue.php diff --git a/app/Console/Commands/CleanupApplicationDeploymentQueue.php b/app/Console/Commands/CleanupApplicationDeploymentQueue.php new file mode 100644 index 000000000..7c871d10b --- /dev/null +++ b/app/Console/Commands/CleanupApplicationDeploymentQueue.php @@ -0,0 +1,25 @@ +option('team-id'); + $servers = \App\Models\Server::where('team_id', $team_id)->get(); + foreach ($servers as $server) { + $deployments = ApplicationDeploymentQueue::whereIn("status", ["in_progress", "queued"])->where("server_id", $server->id)->get(); + foreach ($deployments as $deployment) { + $deployment->update(['status' => 'failed']); + instant_remote_process(['docker rm -f ' . $deployment->deployment_uuid], $server, false); + } + } + } +} diff --git a/app/Jobs/ApplicationDeploymentJob.php b/app/Jobs/ApplicationDeploymentJob.php index 0949ef5e6..48fba00df 100644 --- a/app/Jobs/ApplicationDeploymentJob.php +++ b/app/Jobs/ApplicationDeploymentJob.php @@ -172,60 +172,61 @@ class ApplicationDeploymentJob implements ShouldQueue, ShouldBeEncrypted public function handle(): void { - // Generate custom host<->ip mapping - $allContainers = instant_remote_process(["docker network inspect {$this->destination->network} -f '{{json .Containers}}' "], $this->server); - if (!is_null($allContainers)) { - $allContainers = format_docker_command_output_to_json($allContainers); - $ips = collect([]); - if (count($allContainers) > 0) { - $allContainers = $allContainers[0]; - $allContainers = collect($allContainers)->sort()->values(); - foreach ($allContainers as $container) { - $containerName = data_get($container, 'Name'); - if ($containerName === 'coolify-proxy') { - continue; - } - if (preg_match('/-(\d{12})/', $containerName)) { - continue; - } - $containerIp = data_get($container, 'IPv4Address'); - if ($containerName && $containerIp) { - $containerIp = str($containerIp)->before('/'); - $ips->put($containerName, $containerIp->value()); + try { + // Generate custom host<->ip mapping + $allContainers = instant_remote_process(["docker network inspect {$this->destination->network} -f '{{json .Containers}}' "], $this->server); + + if (!is_null($allContainers)) { + $allContainers = format_docker_command_output_to_json($allContainers); + $ips = collect([]); + if (count($allContainers) > 0) { + $allContainers = $allContainers[0]; + $allContainers = collect($allContainers)->sort()->values(); + foreach ($allContainers as $container) { + $containerName = data_get($container, 'Name'); + if ($containerName === 'coolify-proxy') { + continue; + } + if (preg_match('/-(\d{12})/', $containerName)) { + continue; + } + $containerIp = data_get($container, 'IPv4Address'); + if ($containerName && $containerIp) { + $containerIp = str($containerIp)->before('/'); + $ips->put($containerName, $containerIp->value()); + } } } + $this->addHosts = $ips->map(function ($ip, $name) { + return "--add-host $name:$ip"; + })->implode(' '); } - $this->addHosts = $ips->map(function ($ip, $name) { - return "--add-host $name:$ip"; - })->implode(' '); - } - if ($this->application->dockerfile_target_build) { - $this->buildTarget = " --target {$this->application->dockerfile_target_build} "; - } + if ($this->application->dockerfile_target_build) { + $this->buildTarget = " --target {$this->application->dockerfile_target_build} "; + } - // Check custom port - ['repository' => $this->customRepository, 'port' => $this->customPort] = $this->application->customRepository(); + // Check custom port + ['repository' => $this->customRepository, 'port' => $this->customPort] = $this->application->customRepository(); - if (data_get($this->application, 'settings.is_build_server_enabled')) { - $teamId = data_get($this->application, 'environment.project.team.id'); - $buildServers = Server::buildServers($teamId)->get(); - if ($buildServers->count() === 0) { - $this->application_deployment_queue->addLogEntry("Build server feature activated, but no suitable build server found. Using the deployment server."); + if (data_get($this->application, 'settings.is_build_server_enabled')) { + $teamId = data_get($this->application, 'environment.project.team.id'); + $buildServers = Server::buildServers($teamId)->get(); + if ($buildServers->count() === 0) { + $this->application_deployment_queue->addLogEntry("Build server feature activated, but no suitable build server found. Using the deployment server."); + $this->build_server = $this->server; + $this->original_server = $this->server; + } else { + $this->application_deployment_queue->addLogEntry("Build server feature activated and found a suitable build server. Using it to build your application - if needed."); + $this->build_server = $buildServers->random(); + $this->original_server = $this->server; + $this->use_build_server = true; + } + } else { + // Set build server & original_server to the same as deployment server $this->build_server = $this->server; $this->original_server = $this->server; - } else { - $this->application_deployment_queue->addLogEntry("Build server feature activated and found a suitable build server. Using it to build your application - if needed."); - $this->build_server = $buildServers->random(); - $this->original_server = $this->server; - $this->use_build_server = true; } - } else { - // Set build server & original_server to the same as deployment server - $this->build_server = $this->server; - $this->original_server = $this->server; - } - try { if ($this->restart_only && $this->application->build_pack !== 'dockerimage') { $this->just_restart(); if ($this->server->isProxyShouldRun()) { @@ -1660,6 +1661,8 @@ COPY ./nginx.conf /etc/nginx/conf.d/default.conf"); public function failed(Throwable $exception): void { + + $this->next(ApplicationDeploymentStatus::FAILED->value); $this->application_deployment_queue->addLogEntry("Oops something is not okay, are you okay? 😢", 'stderr'); if (str($exception->getMessage())->isNotEmpty()) { $this->application_deployment_queue->addLogEntry($exception->getMessage(), 'stderr'); @@ -1667,6 +1670,7 @@ COPY ./nginx.conf /etc/nginx/conf.d/default.conf"); if ($this->application->build_pack !== 'dockercompose') { $code = $exception->getCode(); + ray($code); if ($code !== 69420) { // 69420 means failed to push the image to the registry, so we don't need to remove the new version as it is the currently running one $this->application_deployment_queue->addLogEntry("Deployment failed. Removing the new version of your application.", 'stderr'); @@ -1675,6 +1679,5 @@ COPY ./nginx.conf /etc/nginx/conf.d/default.conf"); ); } } - $this->next(ApplicationDeploymentStatus::FAILED->value); } } diff --git a/app/Livewire/Dashboard.php b/app/Livewire/Dashboard.php index a44cd18af..632f14d65 100644 --- a/app/Livewire/Dashboard.php +++ b/app/Livewire/Dashboard.php @@ -23,8 +23,8 @@ class Dashboard extends Component public function cleanup_queue() { $this->dispatch('success', 'Cleanup started.'); - Artisan::queue('app:init', [ - '--cleanup-deployments' => 'true' + Artisan::queue('cleanup:application-deployment-queue', [ + '--team-id' => currentTeam()->id ]); } public function get_deployments() diff --git a/app/Models/Server.php b/app/Models/Server.php index fc400935a..73e10a587 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -147,11 +147,11 @@ class Server extends BaseModel public function skipServer() { if ($this->ip === '1.2.3.4') { - ray('skipping 1.2.3.4'); + // ray('skipping 1.2.3.4'); return true; } if ($this->settings->force_disabled === true) { - ray('force_disabled'); + // ray('force_disabled'); return true; } return false; diff --git a/app/Traits/ExecuteRemoteCommand.php b/app/Traits/ExecuteRemoteCommand.php index 9b34fabae..529dacd7a 100644 --- a/app/Traits/ExecuteRemoteCommand.php +++ b/app/Traits/ExecuteRemoteCommand.php @@ -24,12 +24,6 @@ trait ExecuteRemoteCommand if ($this->server instanceof Server === false) { throw new \RuntimeException('Server is not set or is not an instance of Server model'); } - if ($this->server->settings->force_disabled) { - $this->application_deployment_queue->update([ - 'status' => ApplicationDeploymentStatus::FAILED->value, - ]); - throw new \RuntimeException('Server is disabled'); - } $commandsText->each(function ($single_command) { $command = data_get($single_command, 'command') ?? $single_command[0] ?? null; if ($command === null) { diff --git a/bootstrap/helpers/remoteProcess.php b/bootstrap/helpers/remoteProcess.php index cec7e82aa..13905391e 100644 --- a/bootstrap/helpers/remoteProcess.php +++ b/bootstrap/helpers/remoteProcess.php @@ -110,6 +110,9 @@ function instant_scp(string $source, string $dest, Server $server, $throwError = } function generateSshCommand(Server $server, string $command) { + if ($server->settings->force_disabled) { + throw new \RuntimeException('Server is disabled.'); + } $user = $server->user; $port = $server->port; $privateKeyLocation = savePrivateKeyToFs($server);