2023-05-04 07:11:11 +00:00
< ? php
namespace App\Actions\Server ;
2023-10-09 09:00:18 +00:00
use Lorisleiva\Actions\Concerns\AsAction ;
2023-05-04 07:11:11 +00:00
use App\Models\Server ;
2023-06-23 07:58:15 +00:00
use App\Models\StandaloneDocker ;
2023-05-04 07:11:11 +00:00
class InstallDocker
{
2023-10-09 09:00:18 +00:00
use AsAction ;
2023-11-21 11:07:06 +00:00
public function handle ( Server $server )
2023-05-04 07:11:11 +00:00
{
2023-11-21 11:07:06 +00:00
$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/servers#install-docker-engine-manually">documentation</a>.' );
}
2023-11-28 12:12:25 +00:00
ray ( 'Installing Docker on server: ' . $server -> name . ' (' . $server -> ip . ')' . ' with OS type: ' . $supported_os_type );
2023-09-05 13:43:56 +00:00
$dockerVersion = '24.0' ;
$config = base64_encode ( ' {
" log-driver " : " json-file " ,
" log-opts " : {
" max-size " : " 10m " ,
" max-file " : " 3 "
}
} ' );
2023-09-09 13:30:46 +00:00
$found = StandaloneDocker :: where ( 'server_id' , $server -> id );
2023-09-18 08:44:32 +00:00
if ( $found -> count () == 0 && $server -> id ) {
2023-09-09 13:30:46 +00:00
StandaloneDocker :: create ([
'name' => 'coolify' ,
'network' => 'coolify' ,
'server_id' => $server -> id ,
]);
}
2023-11-21 10:39:19 +00:00
$command = collect ([]);
2023-09-18 09:21:10 +00:00
if ( isDev () && $server -> id === 0 ) {
2023-11-21 10:39:19 +00:00
$command = $command -> merge ([
" echo 'Installing Prerequisites...' " ,
2023-09-09 13:30:46 +00:00
" sleep 1 " ,
2023-11-21 10:39:19 +00:00
" echo 'Installing Docker Engine...' " ,
" echo 'Configuring Docker Engine (merging existing configuration with the required)...' " ,
2023-09-09 13:30:46 +00:00
" sleep 4 " ,
2023-11-21 10:39:19 +00:00
" echo 'Restarting Docker Engine...' " ,
2023-09-09 13:30:46 +00:00
" ls -l /tmp "
2023-11-21 10:39:19 +00:00
]);
2024-02-05 13:40:54 +00:00
return remote_process ( $command , $server );
2023-08-23 08:14:39 +00:00
} else {
2023-11-28 12:12:25 +00:00
if ( $supported_os_type -> contains ( 'debian' )) {
2023-11-21 10:39:19 +00:00
$command = $command -> merge ([
" echo 'Installing Prerequisites...' " ,
2023-11-28 12:12:25 +00:00
" command -v jq >/dev/null || apt-get update -y " ,
2023-11-28 12:28:15 +00:00
" command -v jq >/dev/null || apt install -y curl wget git jq " ,
2023-11-21 10:39:19 +00:00
]);
2023-11-28 12:12:25 +00:00
} else if ( $supported_os_type -> contains ( 'rhel' )) {
2023-11-21 10:39:19 +00:00
$command = $command -> merge ([
" echo 'Installing Prerequisites...' " ,
2023-11-28 12:28:15 +00:00
" command -v jq >/dev/null || dnf install -y curl wget git jq " ,
2023-11-21 10:39:19 +00:00
]);
2023-11-28 12:12:25 +00:00
} else if ( $supported_os_type -> contains ( 'sles' )) {
$command = $command -> merge ([
" echo 'Installing Prerequisites...' " ,
" command -v jq >/dev/null || zypper update -y " ,
2023-11-28 12:28:15 +00:00
" command -v jq >/dev/null || zypper install -y curl wget git jq " ,
2023-11-28 12:12:25 +00:00
]);
2023-11-21 10:39:19 +00:00
} else {
throw new \Exception ( 'Unsupported OS' );
}
$command = $command -> merge ([
" echo 'Installing Docker Engine...' " ,
2023-12-01 13:02:11 +00:00
" curl https://releases.rancher.com/install-docker/ { $dockerVersion } .sh | sh || curl https://get.docker.com | sh -s -- --version { $dockerVersion } " ,
2023-11-21 10:39:19 +00:00
" echo 'Configuring Docker Engine (merging existing configuration with the required)...' " ,
2023-08-23 08:14:39 +00:00
" test -s /etc/docker/daemon.json && cp /etc/docker/daemon.json \" /etc/docker/daemon.json.original-`date + \" %Y%m%d-%H%M%S \" ` \" || echo ' { $config } ' | base64 -d > /etc/docker/daemon.json " ,
" echo ' { $config } ' | base64 -d > /etc/docker/daemon.json.coolify " ,
" cat <<< $ (jq . /etc/docker/daemon.json.coolify) > /etc/docker/daemon.json.coolify " ,
" cat <<< $ (jq -s '.[0] * .[1]' /etc/docker/daemon.json /etc/docker/daemon.json.coolify) > /etc/docker/daemon.json " ,
2023-11-21 10:39:19 +00:00
" echo 'Restarting Docker Engine...' " ,
2023-11-21 12:06:05 +00:00
" systemctl enable docker >/dev/null 2>&1 || true " ,
2023-08-23 08:14:39 +00:00
" systemctl restart docker " ,
2023-11-21 10:39:19 +00:00
]);
2023-11-29 09:06:52 +00:00
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!' " ,
]);
}
2023-11-21 10:39:19 +00:00
return remote_process ( $command , $server );
2023-09-18 09:21:10 +00:00
}
2023-05-04 07:11:11 +00:00
}
}