diff --git a/app/Actions/RemoteProcess/DispatchRemoteProcess.php b/app/Actions/RemoteProcess/DispatchRemoteProcess.php index 21e40d3a0..ad3acc291 100644 --- a/app/Actions/RemoteProcess/DispatchRemoteProcess.php +++ b/app/Actions/RemoteProcess/DispatchRemoteProcess.php @@ -3,6 +3,7 @@ namespace App\Actions\RemoteProcess; use App\Data\RemoteProcessArgs; +use App\Jobs\DeployRemoteProcess; use App\Jobs\ExecuteRemoteProcess; use Spatie\Activitylog\Models\Activity; @@ -30,11 +31,8 @@ public function __construct(RemoteProcessArgs $remoteProcessArgs) public function __invoke(): Activity { $job = new ExecuteRemoteProcess($this->activity); - dispatch($job); - $this->activity->refresh(); - return $this->activity; } } diff --git a/app/Http/Livewire/DeployApplication.php b/app/Http/Livewire/DeployApplication.php index 95cc1b30b..66c79ebef 100644 --- a/app/Http/Livewire/DeployApplication.php +++ b/app/Http/Livewire/DeployApplication.php @@ -4,8 +4,8 @@ use App\Models\Application; use App\Models\CoolifyInstanceSettings; -use App\Models\Deployment; use Livewire\Component; +use Symfony\Component\Yaml\Yaml; use Visus\Cuid2\Cuid2; class DeployApplication extends Component @@ -17,12 +17,25 @@ class DeployApplication extends Component private function execute_in_builder(string $command) { - return $this->command[] = "docker exec {$this->deployment_uuid} sh -c '{$command}'"; + return $this->command[] = "docker exec {$this->deployment_uuid} bash -c '{$command}'"; } private function start_builder_container() { $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) + { + return Yaml::dump([ + 'version' => '3.8', + 'services' => [ + $application->uuid => [ + 'image' => "{$application->uuid}:TAG", + 'container_name' => $application->uuid, + 'restart' => 'always', + ] + ] + ]); + } public function deploy() { $coolify_instance_settings = CoolifyInstanceSettings::find(1); @@ -37,14 +50,48 @@ public function deploy() // Create Deployment ID $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(); + } $workdir = "/artifacts/{$this->deployment_uuid}"; // Start build process + $docker_compose = $this->generate_docker_compose($application); $this->command[] = "echo 'Starting deployment of {$application->name} ({$application->uuid})'"; $this->start_builder_container(); - // $this->execute_in_builder('hostname'); $this->execute_in_builder("git clone -b {$application->git_branch} {$source->html_url}/{$application->git_repository}.git {$workdir}"); - $this->execute_in_builder("ls -l {$workdir}"); + + // Export git commit to a file + $this->execute_in_builder("cd {$workdir} && git rev-parse HEAD > {$workdir}/.git-commit"); + + // Set TAG in docker-compose.yml + $this->execute_in_builder("echo -e '{$docker_compose}' > {$workdir}/docker-compose.yml"); + $this->execute_in_builder("sed -i \"s/TAG/$(cat {$workdir}/.git-commit)/g\" {$workdir}/docker-compose.yml"); + $this->execute_in_builder("cat {$workdir}/docker-compose.yml"); + + if (str_starts_with($application->base_image, 'apache') || str_starts_with($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 ($application->build_command) { + $nixpacks_command .= " --build-cmd '{$application->build_command}'"; + } + if ($application->start_command) { + $nixpacks_command .= " --start-cmd '{$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("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); @@ -52,6 +99,18 @@ public function deploy() $deploymentUrl = "$currentUrl/deployment/$this->deployment_uuid"; return redirect($deploymentUrl); } + 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() { return view('livewire.deploy-application'); diff --git a/resources/views/livewire/deploy-application.blade.php b/resources/views/livewire/deploy-application.blade.php index 14d29bd9c..27d01c442 100644 --- a/resources/views/livewire/deploy-application.blade.php +++ b/resources/views/livewire/deploy-application.blade.php @@ -1,3 +1,4 @@
+