110 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\Actions\Server;
 | 
						|
 | 
						|
use App\Models\Server;
 | 
						|
use App\Models\StandaloneDocker;
 | 
						|
use Lorisleiva\Actions\Concerns\AsAction;
 | 
						|
 | 
						|
class InstallDocker
 | 
						|
{
 | 
						|
    use AsAction;
 | 
						|
 | 
						|
    public function handle(Server $server)
 | 
						|
    {
 | 
						|
        $dockerVersion = config('constants.docker_install_version');
 | 
						|
        $supported_os_type = $server->validateOS();
 | 
						|
        if (! $supported_os_type) {
 | 
						|
            throw new \Exception('Server OS type is not supported for automated installation. Please install Docker manually before continuing: <a target="_blank" class="underline" href="https://coolify.io/docs/installation#manually">documentation</a>.');
 | 
						|
        }
 | 
						|
        $config = base64_encode('{
 | 
						|
            "log-driver": "json-file",
 | 
						|
            "log-opts": {
 | 
						|
              "max-size": "10m",
 | 
						|
              "max-file": "3"
 | 
						|
            }
 | 
						|
          }');
 | 
						|
        $found = StandaloneDocker::where('server_id', $server->id);
 | 
						|
        if ($found->count() == 0 && $server->id) {
 | 
						|
            StandaloneDocker::create([
 | 
						|
                'name' => 'coolify',
 | 
						|
                'network' => 'coolify',
 | 
						|
                'server_id' => $server->id,
 | 
						|
            ]);
 | 
						|
        }
 | 
						|
        $command = collect([]);
 | 
						|
        if (isDev() && $server->id === 0) {
 | 
						|
            $command = $command->merge([
 | 
						|
                "echo 'Installing Prerequisites...'",
 | 
						|
                'sleep 1',
 | 
						|
                "echo 'Installing Docker Engine...'",
 | 
						|
                "echo 'Configuring Docker Engine (merging existing configuration with the required)...'",
 | 
						|
                'sleep 4',
 | 
						|
                "echo 'Restarting Docker Engine...'",
 | 
						|
                'ls -l /tmp',
 | 
						|
            ]);
 | 
						|
 | 
						|
            return remote_process($command, $server);
 | 
						|
        } else {
 | 
						|
            if ($supported_os_type->contains('debian')) {
 | 
						|
                $command = $command->merge([
 | 
						|
                    "echo 'Installing Prerequisites...'",
 | 
						|
                    'apt-get update -y',
 | 
						|
                    'command -v curl >/dev/null || apt install -y curl',
 | 
						|
                    'command -v wget >/dev/null || apt install -y wget',
 | 
						|
                    'command -v git >/dev/null || apt install -y git',
 | 
						|
                    'command -v jq >/dev/null || apt install -y jq',
 | 
						|
                ]);
 | 
						|
            } elseif ($supported_os_type->contains('rhel')) {
 | 
						|
                $command = $command->merge([
 | 
						|
                    "echo 'Installing Prerequisites...'",
 | 
						|
                    'command -v curl >/dev/null || dnf install -y curl',
 | 
						|
                    'command -v wget >/dev/null || dnf install -y wget',
 | 
						|
                    'command -v git >/dev/null || dnf install -y git',
 | 
						|
                    'command -v jq >/dev/null || dnf install -y jq',
 | 
						|
                ]);
 | 
						|
            } elseif ($supported_os_type->contains('sles')) {
 | 
						|
                $command = $command->merge([
 | 
						|
                    "echo 'Installing Prerequisites...'",
 | 
						|
                    'zypper update -y',
 | 
						|
                    'command -v curl >/dev/null || zypper install -y curl',
 | 
						|
                    'command -v wget >/dev/null || zypper install -y wget',
 | 
						|
                    'command -v git >/dev/null || zypper install -y git',
 | 
						|
                    'command -v jq >/dev/null || zypper install -y jq',
 | 
						|
                ]);
 | 
						|
            } else {
 | 
						|
                throw new \Exception('Unsupported OS');
 | 
						|
            }
 | 
						|
            $command = $command->merge([
 | 
						|
                "echo 'Installing Docker Engine...'",
 | 
						|
                "curl https://releases.rancher.com/install-docker/{$dockerVersion}.sh | sh || curl https://get.docker.com | sh -s -- --version {$dockerVersion}",
 | 
						|
                "echo 'Configuring Docker Engine (merging existing configuration with the required)...'",
 | 
						|
                'test -s /etc/docker/daemon.json && cp /etc/docker/daemon.json "/etc/docker/daemon.json.original-$(date +"%Y%m%d-%H%M%S")"',
 | 
						|
                "test ! -s /etc/docker/daemon.json && echo '{$config}' | base64 -d | tee /etc/docker/daemon.json > /dev/null",
 | 
						|
                "echo '{$config}' | base64 -d | tee /etc/docker/daemon.json.coolify > /dev/null",
 | 
						|
                'jq . /etc/docker/daemon.json.coolify | tee /etc/docker/daemon.json.coolify.pretty > /dev/null',
 | 
						|
                'mv /etc/docker/daemon.json.coolify.pretty /etc/docker/daemon.json.coolify',
 | 
						|
                "jq -s '.[0] * .[1]' /etc/docker/daemon.json.coolify /etc/docker/daemon.json | tee /etc/docker/daemon.json.appended > /dev/null",
 | 
						|
                'mv /etc/docker/daemon.json.appended /etc/docker/daemon.json',
 | 
						|
                "echo 'Restarting Docker Engine...'",
 | 
						|
                'systemctl enable docker >/dev/null 2>&1 || true',
 | 
						|
                'systemctl restart docker',
 | 
						|
            ]);
 | 
						|
            if ($server->isSwarm()) {
 | 
						|
                $command = $command->merge([
 | 
						|
                    'docker network create --attachable --driver overlay coolify-overlay >/dev/null 2>&1 || true',
 | 
						|
                ]);
 | 
						|
            } else {
 | 
						|
                $command = $command->merge([
 | 
						|
                    'docker network create --attachable coolify >/dev/null 2>&1 || true',
 | 
						|
                ]);
 | 
						|
                $command = $command->merge([
 | 
						|
                    "echo 'Done!'",
 | 
						|
                ]);
 | 
						|
            }
 | 
						|
 | 
						|
            return remote_process($command, $server);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |