This commit is contained in:
Saeed Vaziry
2023-07-02 12:47:50 +02:00
commit 5c72f12490
825 changed files with 41659 additions and 0 deletions

View File

@ -0,0 +1,158 @@
<x-container x-data="">
<x-card>
<x-slot name="title">{{ __("Create new Server") }}</x-slot>
<x-slot name="description">{{ __("Use this form to create a new server") }}</x-slot>
<form id="create-server" wire:submit.prevent="submit" class="mt-6 space-y-6">
<div>
<x-input-label>{{ __("Select a server provider") }}</x-input-label>
<div class="grid grid-cols-6 gap-2 mt-1">
@foreach(config('core.server_providers') as $p)
<x-server-provider-item x-on:click="$wire.provider = '{{ $p }}'" :active="$provider === $p">
<div class="flex w-full flex-col items-center justify-center text-center">
<img src="{{ asset('static/images/' . $p . '.svg') }}" class="h-7" alt="Server">
<span class="md:text-normal mt-2 hidden text-sm md:block">{{ $p }}</span>
</div>
</x-server-provider-item>
@endforeach
</div>
@error('provider')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
@if($provider === 'custom')
@include('livewire.servers.partials.public-key')
@else
<div>
<x-input-label for="server_provider" value="Provider Profile" />
<div class="flex items-center mt-1">
<x-select-input wire:model="server_provider" id="server_provider" name="server_provider" class="w-full">
<option value="" disabled selected>{{ __("Select") }}</option>
@foreach($serverProviders as $sp)
<option value="{{ $sp->id }}" @if($sp->id === $server_provider) selected @endif>
{{ $sp->profile }}
</option>
@endforeach
</x-select-input>
<x-secondary-button :href="route('server-providers', ['provider' => $provider])" class="flex-none ml-2">{{ __('Connect') }}</x-secondary-button>
</div>
@error('server_provider')
<x-input-error class="mt-2" :messages="$message" />
@enderror
@if(count($serverProviders) == 0)
<x-input-error class="mt-2" :messages="__('You have not connected to any providers!')" />
@endif
</div>
@endif
<div>
<x-input-label for="name" :value="__('Name')" />
<x-text-input wire:model.defer="name" id="name" name="name" type="text" class="mt-1 block w-full" autocomplete="name" />
@error('name')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
@if($provider !== 'custom')
<div class="grid grid-cols-1 lg:grid-cols-2 gap-3">
<div>
<x-input-label for="plan" value="Plan" />
<x-select-input wire:model.defer="plan" id="plan" name="plan" class="mt-1 w-full">
<option value="" disabled selected>{{ __("Select") }}</option>
@foreach(config('serverproviders')[$provider]['plans'] as $value)
<option value="{{ $value['value'] }}" @if($value['value'] === $plan) selected @endif>{{ $value['title'] }}</option>
@endforeach
</x-select-input>
@error('plan')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div>
<x-input-label for="region" value="Region" />
<x-select-input wire:model.defer="region" id="region" name="region" class="mt-1 w-full">
<option value="" disabled selected>{{ __("Select") }}</option>
@foreach(config('serverproviders')[$provider]['regions'] as $key => $value)
<option value="{{ $value['value'] }}" @if($value['value'] === $plan) selected @endif>{{ $value['title'] }}</option>
@endforeach
</x-select-input>
@error('region')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
</div>
@endif
@if($provider === 'custom')
<div class="grid grid-cols-2 gap-3">
<div>
<x-input-label for="ip" :value="__('SSH IP Address')" />
<x-text-input wire:model.defer="ip" id="ip" name="ip" type="text" class="mt-1 block w-full" autocomplete="ip" />
@error('ip')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div>
<x-input-label for="port" :value="__('SSH Port')" />
<x-text-input wire:model.defer="port" id="port" name="port" type="text" class="mt-1 block w-full" autocomplete="port" />
@error('port')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
</div>
@endif
<div>
<x-input-label for="os" value="Operating System" />
<x-select-input wire:model.defer="os" id="os" name="os" class="mt-1 w-full">
@foreach(config('core.operating_systems') as $operatingSystem)
<option value="{{ $operatingSystem }}" @if($operatingSystem === $os) selected @endif>
{{ str($operatingSystem)->replace('_', ' ')->ucfirst() }} LTS
</option>
@endforeach
</x-select-input>
@error('os')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div class="grid grid-cols-1 lg:grid-cols-3 gap-3">
<div>
<x-input-label for="webserver" value="Webserver" />
<x-select-input wire:model.defer="webserver" id="webserver" name="webserver" class="mt-1 w-full">
@foreach(config('core.webservers') as $ws)
<option value="{{ $ws }}" @if($ws === $webserver) selected @endif>{{ $ws }}</option>
@endforeach
</x-select-input>
@error('webserver')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div>
<x-input-label for="database" value="Database" />
<x-select-input wire:model.defer="database" id="database" name="database" class="mt-1 w-full">
@foreach(config('core.databases') as $db)
<option value="{{ $db }}" @if($db === $database) selected @endif>{{ $db }}</option>
@endforeach
</x-select-input>
@error('database')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div>
<x-input-label for="php" value="PHP" />
<x-select-input wire:model.defer="php" id="php" name="php" class="mt-1 w-full">
@foreach(config('core.php_versions') as $p)
<option value="{{ $p }}" @if($p === $php) selected @endif>{{ $p }}</option>
@endforeach
</x-select-input>
@error('php')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
</div>
</form>
<x-slot name="actions">
<x-primary-button form="create-server" wire:loading.attr="disabled">{{ __('Create') }}</x-primary-button>
</x-slot>
</x-card>
</x-container>

View File

@ -0,0 +1,9 @@
<div x-data="">
<x-danger-button x-on:click="$dispatch('open-modal', 'delete-server')">{{ __("Delete Server") }}</x-danger-button>
<x-confirm-modal
name="delete-server"
:title="__('Confirm')"
:description="__('Are you sure that you want to delete this server?')"
method="delete"
/>
</div>

View File

@ -0,0 +1,14 @@
<x-card>
<x-slot name="title">
<span class="text-red-600">{{ __("Installation Failed!") }}</span>
</x-slot>
<x-slot name="description">{{ __("Your server installation failed") }}</x-slot>
<div class="text-center">
{{ __("The installation has been failed on step:") }}
<span class="font-bold">{{ $server->progress_step }} ({{ $server->progress }}%)</span>
</div>
<div class="mt-5 flex items-center justify-center">
<x-secondary-button :href="route('servers.logs', ['server' => $server])" class="mr-2">{{ __("View Logs") }}</x-secondary-button>
<livewire:servers.delete-server :server="$server" />
</div>
</x-card>

View File

@ -0,0 +1,16 @@
<x-card>
<x-slot name="title">{{ __("Installing") }}</x-slot>
<x-slot name="description">{{ __("The server is being installed") }}</x-slot>
<div class="relative flex h-6 overflow-hidden rounded bg-primary-200 text-xs dark:bg-primary-500 dark:bg-opacity-10">
<div
style="width:{{ $server->progress }}%;"
class="flex flex-col justify-center whitespace-nowrap bg-primary-500 text-center text-white shadow-none"
></div>
<span class="absolute left-0 right-0 top-1 font-semibold text-center {{ $server->progress >= 40 ? 'text-white' : 'text-black dark:text-white' }}">
{{ $server->progress }}%
</span>
</div>
<div class="text-center mt-3">
<span class="font-bold">{{ $server->progress_step }}</span>
</div>
</x-card>

View File

@ -0,0 +1,24 @@
<div>
<div>
<div class="rounded-sm border-l-4 border-yellow-500 bg-yellow-100 py-3 px-4 text-yellow-700 dark:bg-yellow-500 dark:bg-opacity-10 dark:text-yellow-500">
Your server needs to have a new unused installation of supported operation systems and must have a root
user. To get started, add our public key to /root/.ssh/authorized_keys file by running the bellow command on
your server as root.
</div>
</div>
</div>
<div>
<div class="flex items-center justify-between">
<x-input-label for="pk">
{{ __("Run this command on your server as root user") }}
</x-input-label>
<x-input-label class="cursor-pointer" x-data="{ copied: false }" x-clipboard.raw="{{ config('core.ssh_public_key') }}">
<div x-show="copied" class="flex items-center">
{{ __("Copied") }}
<x-heroicon-m-check class="ml-1 w-4 text-green-700" />
</div>
<div x-show="!copied" x-on:click="copied = true; setTimeout(() => {copied = false}, 2000)">{{ __("Copy") }}</div>
</x-input-label>
</div>
<x-textarea id="pk" name="pk" class="mt-1" disabled>{{ config('core.ssh_public_key') }}</x-textarea>
</div>

View File

@ -0,0 +1,34 @@
<div>
<x-card-header>
<x-slot name="title">
{{ __("Server Overview") }}
</x-slot>
<x-slot name="description">{{ __("You can see an overview about your server here") }}</x-slot>
<x-slot name="aside">
@include('livewire.servers.partials.status', ['status' => $server->status])
</x-slot>
</x-card-header>
<div class="mx-auto grid grid-cols-3 rounded-md bg-white border border-gray-200 dark:border-gray-700 dark:bg-gray-800">
<div class="p-5">
<div class="flex items-center justify-center md:justify-start">
<x-heroicon-o-globe-alt class="w-8 h-8 text-primary-500" />
<div class="ml-2 hidden md:block">{{ __("Sites") }}</div>
</div>
<div class="mt-3 text-center text-3xl font-bold text-gray-600 dark:text-gray-400 md:text-left">{{ $server->sites()->count() }}</div>
</div>
<div class="border-l border-r border-gray-200 p-5 dark:border-gray-900">
<div class="flex items-center justify-center md:justify-start">
<x-heroicon-o-circle-stack class="w-8 h-8 text-primary-500" />
<div class="ml-2 hidden md:block">{{ __("Databases") }}</div>
</div>
<div class="mt-3 text-center text-3xl font-bold text-gray-600 dark:text-gray-400 md:text-left">{{ $server->databases()->count() }}</div>
</div>
<div class="p-5">
<div class="flex items-center justify-center md:justify-start">
<x-heroicon-o-briefcase class="w-8 h-8 text-primary-500" />
<div class="ml-2 hidden md:block">{{ __("Cron Jobs") }}</div>
</div>
<div class="mt-3 text-center text-3xl font-bold text-gray-600 dark:text-gray-400 md:text-left">{{ $server->cronJobs()->count() }}</div>
</div>
</div>
</div>

View File

@ -0,0 +1,12 @@
@if($status == \App\Enums\ServerStatus::READY)
<x-status status="success">{{ $status }}</x-status>
@endif
@if($status == \App\Enums\ServerStatus::INSTALLING)
<x-status status="warning">{{ $status }}</x-status>
@endif
@if($status == \App\Enums\ServerStatus::DISCONNECTED)
<x-status status="disabled">{{ $status }}</x-status>
@endif
@if($status == \App\Enums\ServerStatus::INSTALLATION_FAILED)
<x-status status="danger">{{ $status }}</x-status>
@endif

View File

@ -0,0 +1,42 @@
<x-container>
<x-card-header>
<x-slot name="title">Servers</x-slot>
<x-slot name="description">Here you can see your servers list and manage them</x-slot>
<x-slot name="aside">
<x-primary-button :href="route('servers.create')">
{{ __('Create a Server') }}
</x-primary-button>
</x-slot>
</x-card-header>
@if(count($servers) > 0)
<div class="space-y-3">
@foreach($servers as $server)
<a href="{{ route('servers.show', ['server' => $server]) }}" class="block">
<x-item-card>
<div class="flex-none">
<img src="{{ asset('static/images/' . $server->provider . '.svg') }}" class="h-10 w-10" alt="">
</div>
<div class="ml-3 flex flex-grow flex-col items-start justify-center">
<span class="mb-1">{{ $server->name }}</span>
<span class="text-sm text-gray-400">
{{ $server->ip }}
</span>
</div>
<div class="flex items-center">
<div class="inline">
@include('livewire.servers.partials.status', ['status' => $server->status])
</div>
</div>
</x-item-card>
</a>
@endforeach
</div>
@else
<x-simple-card>
<div class="text-center">
{{ __("You don't have any servers yet!") }}
</div>
</x-simple-card>
@endif
</x-container>

View File

@ -0,0 +1,16 @@
<div>
@if($server->status === \App\Enums\ServerStatus::INSTALLING)
@include('livewire.servers.partials.installing', ['server' => $server])
<livewire:server-logs.logs-list :server="$server" />
@endif
@if($server->status === \App\Enums\ServerStatus::INSTALLATION_FAILED)
@include('livewire.servers.partials.installation-failed', ['server' => $server])
<livewire:server-logs.logs-list :server="$server" />
@endif
@if(in_array($server->status, [\App\Enums\ServerStatus::READY, \App\Enums\ServerStatus::DISCONNECTED]))
<div class="space-y-10">
@include('livewire.servers.partials.server-overview', ['server' => $server])
<livewire:server-logs.logs-list :server="$server" :count="10" />
</div>
@endif
</div>