2023-06-30 08:49:00 +00:00
< ? php
2023-12-07 18:06:32 +00:00
namespace App\Livewire\Project\Application ;
2023-06-30 08:49:00 +00:00
2023-10-14 12:22:07 +00:00
use App\Actions\Application\StopApplication ;
2024-02-07 13:55:06 +00:00
use App\Events\ApplicationStatusChanged ;
use App\Jobs\ComplexContainerStatusJob ;
2023-09-14 10:45:50 +00:00
use App\Jobs\ContainerStatusJob ;
2023-11-17 13:22:05 +00:00
use App\Jobs\ServerStatusJob ;
2023-06-30 08:49:00 +00:00
use App\Models\Application ;
use Livewire\Component ;
use Visus\Cuid2\Cuid2 ;
class Heading extends Component
{
public Application $application ;
public array $parameters ;
2023-12-04 20:37:30 +00:00
protected string $deploymentUuid ;
2023-12-11 12:43:16 +00:00
public function getListeners ()
{
$teamId = auth () -> user () -> currentTeam () -> id ;
return [
" echo-private:team. { $teamId } ,ApplicationStatusChanged " => 'check_status' ,
2024-04-12 08:28:40 +00:00
" compose_loaded " => '$refresh' ,
2023-12-11 12:43:16 +00:00
];
}
2023-06-30 08:49:00 +00:00
public function mount ()
{
2023-08-09 13:57:53 +00:00
$this -> parameters = get_route_parameters ();
2023-06-30 08:49:00 +00:00
}
2023-12-11 12:43:16 +00:00
public function check_status ( $showNotification = false )
2023-06-30 08:49:00 +00:00
{
2024-02-07 13:55:06 +00:00
if ( $this -> application -> destination -> server -> isFunctional ()) {
dispatch ( new ContainerStatusJob ( $this -> application -> destination -> server ));
} else {
dispatch ( new ServerStatusJob ( $this -> application -> destination -> server ));
2023-10-09 13:08:28 +00:00
}
2024-02-07 13:55:06 +00:00
2024-02-22 09:57:05 +00:00
if ( $showNotification ) $this -> dispatch ( 'success' , " Success " , " Application status updated. " );
2023-06-30 08:49:00 +00:00
}
2023-08-08 09:51:36 +00:00
public function force_deploy_without_cache ()
{
$this -> deploy ( force_rebuild : true );
}
2023-06-30 08:49:00 +00:00
public function deploy ( bool $force_rebuild = false )
{
2023-11-27 14:25:15 +00:00
if ( $this -> application -> build_pack === 'dockercompose' && is_null ( $this -> application -> docker_compose_raw )) {
2024-02-07 13:55:06 +00:00
$this -> dispatch ( 'error' , 'Failed to deploy' , 'Please load a Compose file first.' );
return ;
}
if ( $this -> application -> destination -> server -> isSwarm () && str ( $this -> application -> docker_registry_image_name ) -> isEmpty ()) {
2024-02-12 10:46:36 +00:00
$this -> dispatch ( 'error' , 'Failed to deploy.' , 'To deploy to a Swarm cluster you must set a Docker image name first.' );
2023-11-27 10:54:55 +00:00
return ;
}
2024-02-07 13:55:06 +00:00
if ( data_get ( $this -> application , 'settings.is_build_server_enabled' ) && str ( $this -> application -> docker_registry_image_name ) -> isEmpty ()) {
2024-03-27 10:07:29 +00:00
$this -> dispatch ( 'error' , 'Failed to deploy.' , 'To use a build server, you must first set a Docker image.<br>More information here: <a target="_blank" class="underline" href="https://coolify.io/docs/knowledge-base/server/build-server">documentation</a>' );
2024-01-16 14:19:14 +00:00
return ;
}
2024-02-07 13:55:06 +00:00
if ( $this -> application -> additional_servers -> count () > 0 && str ( $this -> application -> docker_registry_image_name ) -> isEmpty ()) {
2024-03-27 10:07:29 +00:00
$this -> dispatch ( 'error' , 'Failed to deploy.' , 'Before deploying to multiple servers, you must first set a Docker image in the General tab.<br>More information here: <a target="_blank" class="underline" href="https://coolify.io/docs/knowledge-base/server/multiple-servers">documentation</a>' );
2023-12-18 13:01:25 +00:00
return ;
}
2023-06-30 08:49:00 +00:00
$this -> setDeploymentUuid ();
queue_application_deployment (
2024-01-27 17:44:40 +00:00
application : $this -> application ,
2023-06-30 08:49:00 +00:00
deployment_uuid : $this -> deploymentUuid ,
force_rebuild : $force_rebuild ,
);
2024-01-07 15:23:41 +00:00
return redirect () -> route ( 'project.application.deployment.show' , [
2023-06-30 08:49:00 +00:00
'project_uuid' => $this -> parameters [ 'project_uuid' ],
'application_uuid' => $this -> parameters [ 'application_uuid' ],
'deployment_uuid' => $this -> deploymentUuid ,
'environment_name' => $this -> parameters [ 'environment_name' ],
2023-12-27 15:45:01 +00:00
]);
2023-06-30 08:49:00 +00:00
}
2023-08-08 09:51:36 +00:00
protected function setDeploymentUuid ()
2023-06-30 08:49:00 +00:00
{
2023-08-08 09:51:36 +00:00
$this -> deploymentUuid = new Cuid2 ( 7 );
$this -> parameters [ 'deployment_uuid' ] = $this -> deploymentUuid ;
2023-06-30 08:49:00 +00:00
}
2023-08-08 09:51:36 +00:00
2023-06-30 08:49:00 +00:00
public function stop ()
{
2023-10-14 12:22:07 +00:00
StopApplication :: run ( $this -> application );
$this -> application -> status = 'exited' ;
$this -> application -> save ();
2024-02-07 13:55:06 +00:00
if ( $this -> application -> additional_servers -> count () > 0 ) {
$this -> application -> additional_servers -> each ( function ( $server ) {
$server -> pivot -> status = " exited:unhealthy " ;
$server -> pivot -> save ();
});
}
ApplicationStatusChanged :: dispatch ( data_get ( $this -> application , 'environment.project.team.id' ));
2023-06-30 08:49:00 +00:00
}
2023-11-27 10:54:55 +00:00
public function restart ()
{
2024-02-07 13:55:06 +00:00
if ( $this -> application -> additional_servers -> count () > 0 && str ( $this -> application -> docker_registry_image_name ) -> isEmpty ()) {
2024-03-27 10:07:29 +00:00
$this -> dispatch ( 'error' , 'Failed to deploy' , 'Before deploying to multiple servers, you must first set a Docker image in the General tab.<br>More information here: <a target="_blank" class="underline" href="https://coolify.io/docs/knowledge-base/server/multiple-servers">documentation</a>' );
2024-02-07 13:55:06 +00:00
return ;
}
2023-11-01 11:19:08 +00:00
$this -> setDeploymentUuid ();
queue_application_deployment (
2024-01-27 17:44:40 +00:00
application : $this -> application ,
2023-11-01 11:19:08 +00:00
deployment_uuid : $this -> deploymentUuid ,
restart_only : true ,
);
2024-01-07 15:23:41 +00:00
return redirect () -> route ( 'project.application.deployment.show' , [
2023-11-01 11:19:08 +00:00
'project_uuid' => $this -> parameters [ 'project_uuid' ],
'application_uuid' => $this -> parameters [ 'application_uuid' ],
'deployment_uuid' => $this -> deploymentUuid ,
'environment_name' => $this -> parameters [ 'environment_name' ],
2023-12-27 15:45:01 +00:00
]);
2023-11-01 11:19:08 +00:00
}
2023-08-07 20:14:21 +00:00
}