2023-08-29 14:31:46 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Http\Livewire\Boarding;
|
2023-08-29 18:34:01 +00:00
|
|
|
|
2023-08-29 14:31:46 +00:00
|
|
|
use App\Actions\Server\InstallDocker;
|
|
|
|
use App\Models\PrivateKey;
|
|
|
|
use App\Models\Project;
|
|
|
|
use App\Models\Server;
|
2023-08-30 09:06:44 +00:00
|
|
|
use Illuminate\Support\Collection;
|
2023-08-29 14:31:46 +00:00
|
|
|
use Livewire\Component;
|
|
|
|
|
|
|
|
class Index extends Component
|
2023-08-29 18:34:01 +00:00
|
|
|
{
|
|
|
|
public string $currentState = 'welcome';
|
2023-08-29 14:31:46 +00:00
|
|
|
|
2023-08-29 18:34:01 +00:00
|
|
|
public ?Collection $privateKeys = null;
|
|
|
|
public ?int $selectedExistingPrivateKey = null;
|
2023-08-29 14:31:46 +00:00
|
|
|
public ?string $privateKeyType = null;
|
|
|
|
public ?string $privateKey = null;
|
|
|
|
public ?string $publicKey = null;
|
|
|
|
public ?string $privateKeyName = null;
|
|
|
|
public ?string $privateKeyDescription = null;
|
|
|
|
public ?PrivateKey $createdPrivateKey = null;
|
|
|
|
|
2023-08-30 09:06:44 +00:00
|
|
|
public ?Collection $servers = null;
|
|
|
|
public ?int $selectedExistingServer = null;
|
2023-08-29 14:31:46 +00:00
|
|
|
public ?string $remoteServerName = null;
|
|
|
|
public ?string $remoteServerDescription = null;
|
|
|
|
public ?string $remoteServerHost = null;
|
|
|
|
public ?int $remoteServerPort = 22;
|
|
|
|
public ?string $remoteServerUser = 'root';
|
|
|
|
public ?Server $createdServer = null;
|
|
|
|
|
2023-08-30 09:06:44 +00:00
|
|
|
public Collection|array $projects = [];
|
|
|
|
public ?int $selectedExistingProject = null;
|
2023-08-29 14:31:46 +00:00
|
|
|
public ?Project $createdProject = null;
|
|
|
|
|
|
|
|
public function mount()
|
|
|
|
{
|
|
|
|
$this->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';
|
|
|
|
}
|
|
|
|
}
|
2023-08-30 16:35:20 +00:00
|
|
|
public function welcome() {
|
2023-08-31 07:56:37 +00:00
|
|
|
if (isCloud()) {
|
2023-08-30 16:35:20 +00:00
|
|
|
return $this->setServerType('remote');
|
|
|
|
}
|
|
|
|
$this->currentState = 'select-server-type';
|
|
|
|
}
|
2023-08-29 14:31:46 +00:00
|
|
|
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');
|
|
|
|
}
|
2023-08-30 09:06:44 +00:00
|
|
|
|
|
|
|
public function setServerType(string $type)
|
2023-08-29 14:31:46 +00:00
|
|
|
{
|
|
|
|
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.');
|
|
|
|
}
|
2023-08-30 09:06:44 +00:00
|
|
|
return $this->validateServer();
|
2023-08-29 14:31:46 +00:00
|
|
|
} elseif ($type === 'remote') {
|
2023-08-30 09:06:44 +00:00
|
|
|
$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;
|
|
|
|
}
|
2023-08-29 14:31:46 +00:00
|
|
|
$this->currentState = 'private-key';
|
|
|
|
}
|
|
|
|
}
|
2023-08-30 09:06:44 +00:00
|
|
|
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();
|
|
|
|
}
|
2023-08-29 18:34:01 +00:00
|
|
|
public function selectExistingPrivateKey()
|
|
|
|
{
|
2023-08-30 09:06:44 +00:00
|
|
|
$this->currentState = 'create-server';
|
|
|
|
}
|
|
|
|
public function createNewServer()
|
|
|
|
{
|
|
|
|
$this->selectedExistingServer = null;
|
|
|
|
$this->currentState = 'private-key';
|
2023-08-29 18:34:01 +00:00
|
|
|
}
|
2023-08-29 14:31:46 +00:00
|
|
|
public function setPrivateKey(string $type)
|
|
|
|
{
|
2023-08-30 09:06:44 +00:00
|
|
|
$this->selectedExistingPrivateKey = null;
|
2023-08-29 14:31:46 +00:00
|
|
|
$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
|
|
|
|
]);
|
2023-08-30 09:06:44 +00:00
|
|
|
$this->validateServer();
|
|
|
|
}
|
|
|
|
public function validateServer() {
|
2023-08-29 14:31:46 +00:00
|
|
|
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.');
|
|
|
|
}
|
2023-08-30 09:06:44 +00:00
|
|
|
ray($dockerVersion, $uptime);
|
|
|
|
if (!$dockerVersion) {
|
2023-08-29 14:31:46 +00:00
|
|
|
$this->emit('error', 'Docker is not installed on the server.');
|
|
|
|
$this->currentState = 'install-docker';
|
|
|
|
return;
|
|
|
|
}
|
2023-08-30 09:06:44 +00:00
|
|
|
$this->getProxyType();
|
|
|
|
|
2023-08-29 14:31:46 +00:00
|
|
|
} 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) {
|
2023-08-30 09:06:44 +00:00
|
|
|
return $this->getProjects();
|
2023-08-29 14:31:46 +00:00
|
|
|
}
|
|
|
|
$this->createdServer->proxy->type = $proxyType;
|
|
|
|
$this->createdServer->proxy->status = 'exited';
|
|
|
|
$this->createdServer->save();
|
2023-08-30 09:06:44 +00:00
|
|
|
$this->getProjects();
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getProjects() {
|
|
|
|
$this->projects = Project::ownedByCurrentTeam(['name'])->get();
|
|
|
|
if ($this->projects->count() > 0) {
|
|
|
|
$this->selectedExistingProject = $this->projects->first()->id;
|
|
|
|
}
|
2023-08-29 14:31:46 +00:00
|
|
|
$this->currentState = 'create-project';
|
|
|
|
}
|
2023-08-30 09:06:44 +00:00
|
|
|
public function selectExistingProject() {
|
|
|
|
$this->createdProject = Project::find($this->selectedExistingProject);
|
|
|
|
$this->currentState = 'create-resource';
|
|
|
|
}
|
2023-08-29 14:31:46 +00:00
|
|
|
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',
|
2023-08-30 09:26:46 +00:00
|
|
|
'server'=> $this->createdServer->id,
|
2023-08-29 14:31:46 +00:00
|
|
|
]
|
|
|
|
);
|
|
|
|
}
|
|
|
|
private function createNewPrivateKey()
|
|
|
|
{
|
|
|
|
$this->privateKeyName = generate_random_name();
|
|
|
|
$this->privateKeyDescription = 'Created by Coolify';
|
2023-08-29 18:34:01 +00:00
|
|
|
['private' => $this->privateKey, 'public' => $this->publicKey] = generateSSHKey();
|
2023-08-29 14:31:46 +00:00
|
|
|
}
|
|
|
|
public function render()
|
|
|
|
{
|
|
|
|
return view('livewire.boarding.index')->layout('layouts.boarding');
|
|
|
|
}
|
|
|
|
}
|