2023-05-03 09:27:44 +01:00
< ? php
namespace App\Actions\Proxy ;
2023-09-18 09:58:13 +02:00
use App\Enums\ProxyStatus ;
use App\Enums\ProxyTypes ;
2023-05-03 09:27:44 +01:00
use App\Models\Server ;
2023-05-15 13:45:37 +02:00
use Illuminate\Support\Str ;
2023-09-18 12:29:50 +02:00
use Lorisleiva\Actions\Concerns\AsAction ;
2023-08-08 11:51:36 +02:00
use Spatie\Activitylog\Models\Activity ;
2023-05-03 09:27:44 +01:00
2023-07-14 13:38:24 +02:00
class StartProxy
2023-05-03 09:27:44 +01:00
{
2023-09-18 12:29:50 +02:00
use AsAction ;
public function handle ( Server $server , bool $async = true ) : Activity | string
2023-05-03 09:27:44 +01:00
{
2023-09-18 09:58:13 +02:00
$proxyType = data_get ( $server , 'proxy.type' );
if ( $proxyType === 'none' ) {
return 'OK' ;
}
if ( is_null ( $proxyType )) {
$server -> proxy -> type = ProxyTypes :: TRAEFIK_V2 -> value ;
$server -> proxy -> status = ProxyStatus :: EXITED -> value ;
$server -> save ();
}
2023-07-28 16:42:28 +02:00
$proxy_path = get_proxy_path ();
2023-05-15 13:45:37 +02:00
$networks = collect ( $server -> standaloneDockers ) -> map ( function ( $docker ) {
return $docker [ 'network' ];
}) -> unique ();
if ( $networks -> count () === 0 ) {
2023-05-15 15:13:34 +02:00
$networks = collect ([ 'coolify' ]);
2023-05-15 13:45:37 +02:00
}
2023-05-15 15:13:34 +02:00
$create_networks_command = $networks -> map ( function ( $network ) {
2023-05-15 13:45:37 +02:00
return " docker network ls --format ' { { .Name}}' | grep '^ $network $ ' >/dev/null 2>&1 || docker network create --attachable $network > /dev/null 2>&1 " ;
});
2023-09-18 12:18:45 +02:00
$configuration = CheckConfiguration :: run ( $server );
if ( ! $configuration ) {
throw new \Exception ( " Configuration is not synced " );
}
2023-05-15 13:45:37 +02:00
$docker_compose_yml_base64 = base64_encode ( $configuration );
2023-06-20 20:19:31 +02:00
$server -> proxy -> last_applied_settings = Str :: of ( $docker_compose_yml_base64 ) -> pipe ( 'md5' ) -> value ;
2023-05-15 13:45:37 +02:00
$server -> save ();
2023-09-14 12:45:50 +02:00
$commands = [
2023-09-15 15:34:25 +02:00
" command -v lsof >/dev/null || echo '####### Installing lsof...' " ,
" command -v lsof >/dev/null || apt-get update " ,
" command -v lsof >/dev/null || apt install -y lsof " ,
" command -v lsof >/dev/null || command -v fuser >/dev/null || apt install -y psmisc " ,
2023-09-09 15:30:46 +02:00
" echo '####### Creating required Docker networks...' " ,
2023-05-15 13:45:37 +02:00
... $create_networks_command ,
" cd $proxy_path " ,
2023-09-09 15:30:46 +02:00
" echo '####### Creating Docker Compose file...' " ,
" echo '####### Pulling docker image...' " ,
2023-09-18 13:14:05 +02:00
'docker compose pull || docker-compose pull' ,
2023-09-11 22:29:34 +02:00
" echo '####### Stopping existing coolify-proxy...' " ,
2023-09-18 13:14:05 +02:00
" docker compose down -v --remove-orphans > /dev/null 2>&1 || docker-compose down -v --remove-orphans > /dev/null 2>&1 || true " ,
2023-09-15 15:34:25 +02:00
" command -v fuser >/dev/null || command -v lsof >/dev/null || echo '####### Could not kill existing processes listening on port 80 & 443. Please stop the process holding these ports...' " ,
2023-09-18 09:58:13 +02:00
" command -v lsof >/dev/null && lsof -nt -i:80 | xargs -r kill -9 || true " ,
" command -v lsof >/dev/null && lsof -nt -i:443 | xargs -r kill -9 || true " ,
" command -v fuser >/dev/null && fuser -k 80/tcp || true " ,
" command -v fuser >/dev/null && fuser -k 443/tcp || true " ,
2023-09-11 22:29:34 +02:00
" systemctl disable nginx > /dev/null 2>&1 || true " ,
" systemctl disable apache2 > /dev/null 2>&1 || true " ,
" systemctl disable apache > /dev/null 2>&1 || true " ,
" echo '####### Starting coolify-proxy...' " ,
2023-09-18 13:14:05 +02:00
'docker compose up -d --remove-orphans || docker-compose up -d --remove-orphans' ,
2023-09-09 15:30:46 +02:00
" echo '####### Proxy installed successfully...' "
2023-09-14 12:45:50 +02:00
];
if ( ! $async ) {
instant_remote_process ( $commands , $server );
return 'OK' ;
} else {
$activity = remote_process ( $commands , $server );
return $activity ;
}
2023-05-03 09:27:44 +01:00
}
2023-08-08 11:51:36 +02:00
}