From 6205598b450b38909cafdcc7957cd66dbbfa1e8e Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Thu, 30 Mar 2023 09:47:04 +0200 Subject: [PATCH] fixes --- .../RemoteProcess/DispatchRemoteProcess.php | 2 + app/Http/Livewire/DeployApplication.php | 107 ++++++++++++------ app/Models/Application.php | 22 ++++ app/Providers/AppServiceProvider.php | 7 +- ...085020_create_standalone_dockers_table.php | 1 + database/seeders/StandaloneDockerSeeder.php | 1 + database/seeders/UserSeeder.php | 2 - 7 files changed, 104 insertions(+), 38 deletions(-) diff --git a/app/Actions/RemoteProcess/DispatchRemoteProcess.php b/app/Actions/RemoteProcess/DispatchRemoteProcess.php index ad3acc291..95a55bc91 100644 --- a/app/Actions/RemoteProcess/DispatchRemoteProcess.php +++ b/app/Actions/RemoteProcess/DispatchRemoteProcess.php @@ -20,10 +20,12 @@ class DispatchRemoteProcess $this->activity = activity() ->withProperties($properties) ->performedOn($remoteProcessArgs->model) + ->event($remoteProcessArgs->type) ->log(""); } else { $this->activity = activity() ->withProperties($remoteProcessArgs->toArray()) + ->event($remoteProcessArgs->type) ->log(""); } } diff --git a/app/Http/Livewire/DeployApplication.php b/app/Http/Livewire/DeployApplication.php index 251812c83..ff11c0e25 100644 --- a/app/Http/Livewire/DeployApplication.php +++ b/app/Http/Livewire/DeployApplication.php @@ -14,6 +14,8 @@ class DeployApplication extends Component public $activity; protected string $deployment_uuid; protected array $command = []; + protected Application $application; + protected $destination; private function execute_in_builder(string $command) { @@ -23,28 +25,70 @@ class DeployApplication extends Component { $this->command[] = "docker run --pull=always -d --name {$this->deployment_uuid} --rm -v /var/run/docker.sock:/var/run/docker.sock ghcr.io/coollabsio/coolify-builder >/dev/null 2>&1"; } - private function generate_docker_compose(mixed $application) + private function generate_docker_compose() { return Yaml::dump([ 'version' => '3.8', 'services' => [ - $application->uuid => [ - 'image' => "{$application->uuid}:TAG", - 'container_name' => $application->uuid, + $this->application->uuid => [ + 'image' => "{$this->application->uuid}:TAG", + 'expose' => $this->application->ports_exposes, + 'container_name' => $this->application->uuid, 'restart' => 'always', + 'networks' => [ + $this->destination->network, + ], + 'healthcheck' => [ + 'test' => [ + 'CMD-SHELL', + $this->generate_healthcheck_commands() + ], + 'interval' => $this->application->health_check_interval . 's', + 'timeout' => $this->application->health_check_timeout . 's', + 'retries' => $this->application->health_check_retries, + 'start_period' => $this->application->health_check_start_period . 's' + ], + ] + ], + 'networks' => [ + $this->destination->network => [ + 'external' => false, + 'name' => $this->destination->network, + 'attachable' => true, ] ] ]); } + private function generate_healthcheck_commands() + { + if (!$this->application->health_check_port) { + $this->application->health_check_port = $this->application->ports_exposes[0]; + } + if ($this->application->health_check_path) { + $generated_healthchecks_commands = [ + "curl -X {$this->application->health_check_method} -f {$this->application->health_check_scheme}://{$this->application->health_check_host}:{$this->application->health_check_port}{$this->application->health_check_path}" + ]; + } else { + $generated_healthchecks_commands = []; + foreach ($this->application->ports_exposes as $key => $port) { + $generated_healthchecks_commands = [ + "curl -X {$this->application->health_check_method} -f {$this->application->health_check_scheme}://{$this->application->health_check_host}:{$port}/" + ]; + if (count($this->application->ports_exposes) != $key + 1) { + $generated_healthchecks_commands[] = '&&'; + } + } + } + return implode(' ', $generated_healthchecks_commands); + } public function deploy() { $coolify_instance_settings = CoolifyInstanceSettings::find(1); - $application = Application::where('uuid', $this->application_uuid)->first(); - $destination = $application->destination->getMorphClass()::where('id', $application->destination->id)->first(); - $source = $application->source->getMorphClass()::where('id', $application->source->id)->first(); - + $this->application = Application::where('uuid', $this->application_uuid)->first(); + $this->destination = $this->application->destination->getMorphClass()::where('id', $this->application->destination->id)->first(); + $source = $this->application->source->getMorphClass()::where('id', $this->application->source->id)->first(); // Get Wildcard Domain - $project_wildcard_domain = data_get($application, 'environment.project.settings.wildcard_domain'); + $project_wildcard_domain = data_get($this->application, 'environment.project.settings.wildcard_domain'); $global_wildcard_domain = data_get($coolify_instance_settings, 'wildcard_domain'); $wildcard_domain = $project_wildcard_domain ?? $global_wildcard_domain ?? null; @@ -52,49 +96,51 @@ class DeployApplication extends Component $this->deployment_uuid = new Cuid2(7); // Set wildcard domain - if (!$application->settings->is_bot && !$application->fqdn && $wildcard_domain) { - $application->fqdn = $application->uuid . '.' . $wildcard_domain; - $application->save(); + if (!$this->application->settings->is_bot && !$this->application->fqdn && $wildcard_domain) { + $this->application->fqdn = $this->application->uuid . '.' . $wildcard_domain; + $this->application->save(); } $workdir = "/artifacts/{$this->deployment_uuid}"; // Start build process - $docker_compose_base64 = base64_encode($this->generate_docker_compose($application)); - $this->command[] = "echo 'Starting deployment of {$application->name} ({$application->uuid})'"; + $docker_compose_base64 = base64_encode($this->generate_docker_compose($this->application)); + $this->command[] = "echo 'Starting deployment of {$this->application->name} ({$this->application->uuid})'"; $this->start_builder_container(); - $this->execute_in_builder("git clone -b {$application->git_branch} {$source->html_url}/{$application->git_repository}.git {$workdir}"); + $this->execute_in_builder("git clone -b {$this->application->git_branch} {$source->html_url}/{$this->application->git_repository}.git {$workdir}"); // Export git commit to a file $this->execute_in_builder("cd {$workdir} && git rev-parse HEAD > {$workdir}/.git-commit"); + $this->execute_in_builder("rm -fr {$workdir}/.git"); // Create docker-compose.yml $this->execute_in_builder("echo '{$docker_compose_base64}' | base64 -d > {$workdir}/docker-compose.yml"); // Set TAG in docker-compose.yml $this->execute_in_builder("sed -i \"s/TAG/$(cat {$workdir}/.git-commit)/g\" {$workdir}/docker-compose.yml"); - if (str_starts_with($application->base_image, 'apache') || str_starts_with($application->base_image, 'nginx')) { + if (str_starts_with($this->application->base_image, 'apache') || str_starts_with($this->application->base_image, 'nginx')) { // @TODO: Add static site builds } else { $nixpacks_command = "nixpacks build -o {$workdir} --no-error-without-start"; - if ($application->install_command) { - $nixpacks_command .= " --install-cmd '{$application->install_command}'"; + if ($this->application->install_command) { + $nixpacks_command .= " --install-cmd '{$this->application->install_command}'"; } - if ($application->build_command) { - $nixpacks_command .= " --build-cmd '{$application->build_command}'"; + if ($this->application->build_command) { + $nixpacks_command .= " --build-cmd '{$this->application->build_command}'"; } - if ($application->start_command) { - $nixpacks_command .= " --start-cmd '{$application->start_command}'"; + if ($this->application->start_command) { + $nixpacks_command .= " --start-cmd '{$this->application->start_command}'"; } $nixpacks_command .= " {$workdir}"; $this->execute_in_builder($nixpacks_command); $this->execute_in_builder("cp {$workdir}/.nixpacks/Dockerfile {$workdir}/Dockerfile"); $this->execute_in_builder("rm -f {$workdir}/.nixpacks/Dockerfile"); } - $this->execute_in_builder("docker build -f {$workdir}/Dockerfile --build-arg SOURCE_COMMIT=$(cat {$workdir}/.git-commit) --progress plain -t {$application->uuid}:$(cat {$workdir}/.git-commit) {$workdir}"); - $this->execute_in_builder("test -z \"$(docker ps --format '{{.State}}' --filter 'name={$application->uuid}')\" && docker rm -f {$application->uuid} >/dev/null 2>&1"); - $this->execute_in_builder("docker compose --project-directory {$workdir} up -d >/dev/null 2>&1"); + + $this->execute_in_builder("docker build -f {$workdir}/Dockerfile --build-arg SOURCE_COMMIT=$(cat {$workdir}/.git-commit) --progress plain -t {$this->application->uuid}:$(cat {$workdir}/.git-commit) {$workdir}"); + $this->execute_in_builder("test -z \"$(docker ps --format '{{.State}}' --filter 'name={$this->application->uuid}')\" && docker rm -f {$this->application->uuid}"); + $this->execute_in_builder("docker compose --project-directory {$workdir} up -d"); $this->command[] = "docker stop -t 0 {$this->deployment_uuid} >/dev/null"; - $this->activity = remoteProcess($this->command, $destination->server, $this->deployment_uuid, $application); + $this->activity = remoteProcess($this->command, $this->destination->server, $this->deployment_uuid, $this->application); $currentUrl = url()->previous(); $deploymentUrl = "$currentUrl/deployment/$this->deployment_uuid"; @@ -102,15 +148,6 @@ class DeployApplication extends Component } public function cancel() { - // dd($this->deployment_uuid); - // $jobs = DB::table('jobs')->get(); - // foreach ($jobs as $job) { - // // Decode the job payload - // $jobPayload = json_decode($job->payload, true); - // if (str_contains($jobPayload['data']['command'], $this->deployment_uuid)) { - // dd($jobPayload['data']['command']); - // } - // } } public function render() { diff --git a/app/Models/Application.php b/app/Models/Application.php index c6bacd941..c0fa88067 100644 --- a/app/Models/Application.php +++ b/app/Models/Application.php @@ -2,6 +2,7 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Casts\Attribute; use Spatie\Activitylog\Models\Activity; class Application extends BaseModel @@ -22,6 +23,27 @@ class Application extends BaseModel { return $this->morphTo(); } + + public function portsMappings(): Attribute + { + return Attribute::make( + get: fn (string|null $portsMappings) => + is_null($portsMappings) + ? [] + : explode(',', $portsMappings) + + ); + } + public function portsExposes(): Attribute + { + return Attribute::make( + get: fn (string|null $portsExposes) => + is_null($portsExposes) + ? [] + : explode(',', $portsExposes) + + ); + } public function deployments() { return Activity::where('subject_id', $this->id)->where('properties->deployment_uuid', '!=', null)->orderBy('created_at', 'desc')->get(); diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 452e6b65b..3487238e9 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,8 @@ namespace App\Providers; +use Illuminate\Queue\Events\JobProcessed; +use Illuminate\Support\Facades\Queue; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider @@ -19,6 +21,9 @@ class AppServiceProvider extends ServiceProvider */ public function boot(): void { - // + // @TODO: Should remove builder container here + // Queue::after(function (JobProcessed $event) { + // dd($event->job->resolveName()); + // }); } } diff --git a/database/migrations/2023_03_27_085020_create_standalone_dockers_table.php b/database/migrations/2023_03_27_085020_create_standalone_dockers_table.php index 184d1e3e2..814d3eee3 100644 --- a/database/migrations/2023_03_27_085020_create_standalone_dockers_table.php +++ b/database/migrations/2023_03_27_085020_create_standalone_dockers_table.php @@ -14,6 +14,7 @@ return new class extends Migration Schema::create('standalone_dockers', function (Blueprint $table) { $table->id(); $table->string('uuid')->unique(); + $table->string('network'); $table->foreignId('server_id'); $table->timestamps(); diff --git a/database/seeders/StandaloneDockerSeeder.php b/database/seeders/StandaloneDockerSeeder.php index 082e2647c..9dd27f063 100644 --- a/database/seeders/StandaloneDockerSeeder.php +++ b/database/seeders/StandaloneDockerSeeder.php @@ -18,6 +18,7 @@ class StandaloneDockerSeeder extends Seeder $server_3 = Server::find(3); StandaloneDocker::create([ 'id' => 1, + 'network' => 'coolify', 'server_id' => $server_3->id, ]); } diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php index a92626d45..63301e35c 100644 --- a/database/seeders/UserSeeder.php +++ b/database/seeders/UserSeeder.php @@ -2,10 +2,8 @@ namespace Database\Seeders; -use App\Models\Team; use App\Models\User; use Illuminate\Database\Seeder; -use Illuminate\Support\Facades\DB; class UserSeeder extends Seeder {