privateKeyName = generate_random_name(); $this->remoteServerName = generate_random_name(); if (isDev()) { $this->privateKey = '-----BEGIN OPENSSH PRIVATE KEY----- b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW QyNTUxOQAAACBbhpqHhqv6aI67Mj9abM3DVbmcfYhZAhC7ca4d9UCevAAAAJi/QySHv0Mk hwAAAAtzc2gtZWQyNTUxOQAAACBbhpqHhqv6aI67Mj9abM3DVbmcfYhZAhC7ca4d9UCevA AAAECBQw4jg1WRT2IGHMncCiZhURCts2s24HoDS0thHnnRKVuGmoeGq/pojrsyP1pszcNV uZx9iFkCELtxrh31QJ68AAAAEXNhaWxANzZmZjY2ZDJlMmRkAQIDBA== -----END OPENSSH PRIVATE KEY-----'; $this->privateKeyDescription = 'Created by Coolify'; $this->remoteServerDescription = 'Created by Coolify'; $this->remoteServerHost = 'coolify-testing-host'; } } public function welcome() { if (isCloud()) { return $this->setServerType('remote'); } $this->currentState = 'select-server-type'; } public function restartBoarding() { if ($this->createdServer) { $this->createdServer->delete(); } if ($this->createdPrivateKey) { $this->createdPrivateKey->delete(); } return redirect()->route('boarding'); } public function skipBoarding() { currentTeam()->update([ 'show_boarding' => false ]); refreshSession(); return redirect()->route('dashboard'); } public function setServerType(string $type) { if ($type === 'localhost') { $this->createdServer = Server::find(0); if (!$this->createdServer) { return $this->emit('error', 'Localhost server is not found. Something went wrong during installation. Please try to reinstall or contact support.'); } return $this->validateServer(); } elseif ($type === 'remote') { $this->privateKeys = PrivateKey::ownedByCurrentTeam(['name'])->where('id', '!=', 0)->get(); if ($this->privateKeys->count() > 0) { $this->selectedExistingPrivateKey = $this->privateKeys->first()->id; } $this->servers = Server::ownedByCurrentTeam(['name'])->where('id', '!=', 0)->get(); if ($this->servers->count() > 0) { $this->selectedExistingServer = $this->servers->first()->id; $this->currentState = 'select-existing-server'; return; } $this->currentState = 'private-key'; } } public function selectExistingServer() { $this->createdServer = Server::find($this->selectedExistingServer); if (!$this->createdServer) { $this->emit('error', 'Server is not found.'); $this->currentState = 'private-key'; return; } $this->selectedExistingPrivateKey = $this->createdServer->privateKey->id; $this->validateServer(); $this->getProxyType(); $this->getProjects(); } public function getProxyType() { $proxyTypeSet = $this->createdServer->proxy->type; if (!$proxyTypeSet) { $this->currentState = 'select-proxy'; return; } $this->getProjects(); } public function selectExistingPrivateKey() { $this->currentState = 'create-server'; } public function createNewServer() { $this->selectedExistingServer = null; $this->currentState = 'private-key'; } public function setPrivateKey(string $type) { $this->selectedExistingPrivateKey = null; $this->privateKeyType = $type; if ($type === 'create' && !isDev()) { $this->createNewPrivateKey(); } $this->currentState = 'create-private-key'; } public function savePrivateKey() { $this->validate([ 'privateKeyName' => 'required', 'privateKey' => 'required', ]); $this->currentState = 'create-server'; } public function saveServer() { $this->validate([ 'remoteServerName' => 'required', 'remoteServerHost' => 'required', 'remoteServerPort' => 'required', 'remoteServerUser' => 'required', ]); $this->privateKey = formatPrivateKey($this->privateKey); $this->createdPrivateKey = PrivateKey::create([ 'name' => $this->privateKeyName, 'description' => $this->privateKeyDescription, 'private_key' => $this->privateKey, 'team_id' => currentTeam()->id ]); $this->createdServer = Server::create([ 'name' => $this->remoteServerName, 'ip' => $this->remoteServerHost, 'port' => $this->remoteServerPort, 'user' => $this->remoteServerUser, 'description' => $this->remoteServerDescription, 'private_key_id' => $this->createdPrivateKey->id, 'team_id' => currentTeam()->id ]); $this->validateServer(); } public function validateServer() { try { ['uptime' => $uptime, 'dockerVersion' => $dockerVersion] = validateServer($this->createdServer); if (!$uptime) { throw new \Exception('Server is not reachable.'); } else { $this->createdServer->settings->update([ 'is_reachable' => true, ]); $this->emit('success', 'Server is reachable.'); } ray($dockerVersion, $uptime); if (!$dockerVersion) { $this->emit('error', 'Docker is not installed on the server.'); $this->currentState = 'install-docker'; return; } $this->getProxyType(); } catch (\Exception $e) { return general_error_handler(customErrorMessage: "Server is not reachable. Reason: {$e->getMessage()}", that: $this); } } public function installDocker() { $activity = resolve(InstallDocker::class)($this->createdServer, currentTeam()); $this->emit('newMonitorActivity', $activity->id); $this->currentState = 'select-proxy'; } public function selectProxy(string|null $proxyType = null) { if (!$proxyType) { return $this->getProjects(); } $this->createdServer->proxy->type = $proxyType; $this->createdServer->proxy->status = 'exited'; $this->createdServer->save(); $this->getProjects(); } public function getProjects() { $this->projects = Project::ownedByCurrentTeam(['name'])->get(); if ($this->projects->count() > 0) { $this->selectedExistingProject = $this->projects->first()->id; } $this->currentState = 'create-project'; } public function selectExistingProject() { $this->createdProject = Project::find($this->selectedExistingProject); $this->currentState = 'create-resource'; } public function createNewProject() { $this->createdProject = Project::create([ 'name' => "My first project", 'team_id' => currentTeam()->id ]); $this->currentState = 'create-resource'; } public function showNewResource() { $this->skipBoarding(); return redirect()->route( 'project.resources.new', [ 'project_uuid' => $this->createdProject->uuid, 'environment_name' => 'production', 'server'=> $this->createdServer->id, ] ); } private function createNewPrivateKey() { $this->privateKeyName = generate_random_name(); $this->privateKeyDescription = 'Created by Coolify'; ['private' => $this->privateKey, 'public' => $this->publicKey] = generateSSHKey(); } public function render() { return view('livewire.boarding.index')->layout('layouts.boarding'); } }