2024-02-05 13:40:54 +00:00
< ? php
namespace App\Livewire\Server ;
2024-02-12 10:46:36 +00:00
use App\Actions\Proxy\StartProxy ;
2024-02-05 13:40:54 +00:00
use App\Models\Server ;
use Livewire\Component ;
class ValidateAndInstall extends Component
{
public Server $server ;
public int $number_of_tries = 0 ;
public int $max_tries = 1 ;
public bool $install = true ;
public $uptime = null ;
public $supported_os_type = null ;
public $docker_installed = null ;
2024-02-11 14:32:58 +00:00
public $docker_compose_installed = null ;
2024-02-05 13:40:54 +00:00
public $docker_version = null ;
2024-02-12 10:46:36 +00:00
public $proxy_started = false ;
2024-02-05 13:40:54 +00:00
public $error = null ;
2024-02-15 13:14:11 +00:00
public bool $ask = false ;
2024-02-05 13:40:54 +00:00
2024-02-05 14:13:39 +00:00
protected $listeners = [ 'validateServer' => 'init' , 'validateDockerEngine' , 'validateServerNow' => 'validateServer' ];
2024-02-05 13:40:54 +00:00
2024-02-05 14:13:39 +00:00
public function init ( bool $install = true )
2024-02-05 13:40:54 +00:00
{
$this -> install = $install ;
$this -> uptime = null ;
$this -> supported_os_type = null ;
$this -> docker_installed = null ;
$this -> docker_version = null ;
2024-02-12 10:46:36 +00:00
$this -> docker_compose_installed = null ;
$this -> proxy_started = null ;
2024-02-05 14:13:39 +00:00
$this -> error = null ;
$this -> number_of_tries = 0 ;
2024-02-15 13:14:11 +00:00
if ( ! $this -> ask ) {
$this -> dispatch ( 'validateServerNow' );
}
}
public function startValidatingAfterAsking () {
$this -> ask = false ;
$this -> init ();
2024-02-05 14:13:39 +00:00
}
public function validateServer ()
{
2024-02-05 13:40:54 +00:00
try {
$this -> validateConnection ();
$this -> validateOS ();
$this -> validateDockerEngine ();
if ( $this -> server -> isSwarm ()) {
$swarmInstalled = $this -> server -> validateDockerSwarm ();
if ( $swarmInstalled ) {
$this -> dispatch ( 'success' , 'Docker Swarm is initiated.' );
}
2024-02-12 10:46:36 +00:00
} else {
$proxy = StartProxy :: run ( $this -> server );
if ( $proxy ) {
$this -> proxy_started = true ;
}
2024-02-05 13:40:54 +00:00
}
} catch ( \Throwable $e ) {
return handleError ( $e , $this );
}
}
public function validateConnection ()
{
$this -> uptime = $this -> server -> validateConnection ();
if ( ! $this -> uptime ) {
2024-02-05 14:13:39 +00:00
$this -> error = 'Server is not reachable. Please validate your configuration and connection.<br><br>Check this <a target="_blank" class="underline" href="https://coolify.io/docs/server/openssh">documentation</a> for further help.' ;
2024-02-05 13:40:54 +00:00
return ;
}
}
public function validateOS ()
{
$this -> supported_os_type = $this -> server -> validateOS ();
if ( ! $this -> supported_os_type ) {
2024-02-05 14:13:39 +00:00
$this -> error = 'Server OS type is not supported. Please install Docker manually before continuing: <a target="_blank" class="underline" href="https://docs.docker.com/engine/install/#server">documentation</a>.' ;
2024-02-05 13:40:54 +00:00
return ;
}
}
public function validateDockerEngine ()
{
$this -> docker_installed = $this -> server -> validateDockerEngine ();
2024-02-11 14:32:58 +00:00
$this -> docker_compose_installed = $this -> server -> validateDockerCompose ();
if ( ! $this -> docker_installed || ! $this -> docker_compose_installed ) {
2024-02-05 13:40:54 +00:00
if ( $this -> install ) {
if ( $this -> number_of_tries == $this -> max_tries ) {
$this -> error = 'Docker Engine could not be installed. Please install Docker manually before continuing: <a target="_blank" class="underline" href="https://docs.docker.com/engine/install/#server">documentation</a>.' ;
2024-02-05 14:13:39 +00:00
return ;
2024-02-05 13:40:54 +00:00
} else {
$activity = $this -> server -> installDocker ();
$this -> number_of_tries ++ ;
$this -> dispatch ( 'newActivityMonitor' , $activity -> id , 'validateDockerEngine' );
return ;
}
} else {
2024-02-05 14:13:39 +00:00
$this -> error = 'Docker Engine is not installed. Please install Docker manually before continuing: <a target="_blank" class="underline" href="https://docs.docker.com/engine/install/#server">documentation</a>.' ;
2024-02-05 13:40:54 +00:00
return ;
}
} else {
$this -> validateDockerVersion ();
}
}
public function validateDockerVersion ()
{
$this -> docker_version = $this -> server -> validateDockerEngineVersion ();
if ( $this -> docker_version ) {
$this -> dispatch ( 'serverInstalled' );
$this -> dispatch ( 'success' , 'Server validated successfully.' );
} else {
2024-02-05 14:13:39 +00:00
$this -> error = 'Docker Engine version is not 22+. Please install Docker manually before continuing: <a target="_blank" class="underline" href="https://docs.docker.com/engine/install/#server">documentation</a>.' ;
2024-02-05 13:40:54 +00:00
return ;
}
}
public function render ()
{
return view ( 'livewire.server.validate-and-install' );
}
}