2025-06-06 12:47:54 +00:00
< ? php
namespace App\Livewire\Server ;
use App\Actions\Server\ConfigureCloudflared ;
use App\Models\Server ;
2025-08-22 11:02:11 +00:00
use Illuminate\Foundation\Auth\Access\AuthorizesRequests ;
2025-06-06 12:47:54 +00:00
use Livewire\Attributes\Validate ;
use Livewire\Component ;
class CloudflareTunnel extends Component
{
2025-08-22 11:02:11 +00:00
use AuthorizesRequests ;
2025-06-06 12:47:54 +00:00
public Server $server ;
#[Validate(['required', 'string'])]
public string $cloudflare_token ;
#[Validate(['required', 'string'])]
public string $ssh_domain ;
#[Validate(['required', 'boolean'])]
public bool $isCloudflareTunnelsEnabled ;
public function getListeners ()
{
$teamId = auth () -> user () -> currentTeam () -> id ;
return [
" echo-private:team. { $teamId } ,CloudflareTunnelConfigured " => 'refresh' ,
];
}
public function refresh ()
{
2025-06-10 09:47:29 +00:00
$this -> server -> refresh ();
$this -> isCloudflareTunnelsEnabled = $this -> server -> settings -> is_cloudflare_tunnel ;
2025-06-06 12:47:54 +00:00
}
public function mount ( string $server_uuid )
{
try {
$this -> server = Server :: ownedByCurrentTeam () -> whereUuid ( $server_uuid ) -> firstOrFail ();
if ( $this -> server -> isLocalhost ()) {
return redirect () -> route ( 'server.show' , [ 'server_uuid' => $server_uuid ]);
}
$this -> isCloudflareTunnelsEnabled = $this -> server -> settings -> is_cloudflare_tunnel ;
} catch ( \Throwable $e ) {
return handleError ( $e , $this );
}
}
public function toggleCloudflareTunnels ()
{
try {
2025-08-22 11:02:11 +00:00
$this -> authorize ( 'update' , $this -> server );
2025-06-06 12:47:54 +00:00
remote_process ([ 'docker rm -f coolify-cloudflared' ], $this -> server , false , 10 );
$this -> isCloudflareTunnelsEnabled = false ;
$this -> server -> settings -> is_cloudflare_tunnel = false ;
$this -> server -> settings -> save ();
if ( $this -> server -> ip_previous ) {
$this -> server -> update ([ 'ip' => $this -> server -> ip_previous ]);
$this -> dispatch ( 'success' , 'Cloudflare Tunnel disabled.<br><br>Manually updated the server IP address to its previous IP address.' );
} else {
2025-06-10 09:47:29 +00:00
$this -> dispatch ( 'warning' , 'Cloudflare Tunnel disabled. Action required: Update the server IP address to its real IP address in the Advanced settings.' );
2025-06-06 12:47:54 +00:00
}
} catch ( \Throwable $e ) {
return handleError ( $e , $this );
}
}
public function manualCloudflareConfig ()
{
2025-08-22 11:02:11 +00:00
$this -> authorize ( 'update' , $this -> server );
2025-06-06 12:47:54 +00:00
$this -> isCloudflareTunnelsEnabled = true ;
$this -> server -> settings -> is_cloudflare_tunnel = true ;
$this -> server -> settings -> save ();
$this -> server -> refresh ();
$this -> dispatch ( 'success' , 'Cloudflare Tunnel enabled.' );
}
public function automatedCloudflareConfig ()
{
try {
2025-08-22 11:02:11 +00:00
$this -> authorize ( 'update' , $this -> server );
2025-06-06 12:47:54 +00:00
if ( str ( $this -> ssh_domain ) -> contains ( 'https://' )) {
$this -> ssh_domain = str ( $this -> ssh_domain ) -> replace ( 'https://' , '' ) -> replace ( 'http://' , '' ) -> trim ();
$this -> ssh_domain = str ( $this -> ssh_domain ) -> replace ( '/' , '' );
}
$activity = ConfigureCloudflared :: run ( $this -> server , $this -> cloudflare_token , $this -> ssh_domain );
$this -> dispatch ( 'activityMonitor' , $activity -> id );
} catch ( \Throwable $e ) {
return handleError ( $e , $this );
}
}
public function render ()
{
return view ( 'livewire.server.cloudflare-tunnel' );
}
}