deploy Wordpress sites via VitoDeploy (#83)

This commit is contained in:
Saeed Vaziry
2024-01-01 16:20:57 +01:00
committed by GitHub
parent 5e6d338bdc
commit 4cda14f4b8
31 changed files with 443 additions and 292 deletions

View File

@ -161,45 +161,7 @@ class="min-h-screen w-64 flex-none border-r border-gray-200 bg-white dark:border
<div class="flex items-center justify-center">
{{-- Search --}}
</div>
{{-- Dark Mode Toggle Button section --}}
<div class="flex items-center" x-data="{
isDarkMode: localStorage.theme,
toggleTheme() {
localStorage.theme = this.isDarkMode == 'dark' ? 'light' : 'dark';
if (localStorage.theme === 'dark') {
document.documentElement.classList.add('dark')
} else {
document.documentElement.classList.remove('dark')
}
this.isDarkMode = localStorage.theme
}
}" x-on:click="toggleTheme()">
<div class="flex items-center">
<div class="flex items-center justify-end">
<button id="theme-toggle" type="button" class="text-sm p-2"
:class="isDarkMode == 'dark' ? 'text-gray-300 border-gray-300' :
'text-gray-800 border-gray-800'">
<svg x-show="isDarkMode!='dark'" id="theme-toggle-dark-icon" class="w-5 h-5"
fill="currentColor" viewBox="0 0 20 20"
xmlns="http://www.w3.org/2000/svg">
<path
d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z">
</path>
</svg>
<svg x-show="isDarkMode=='dark'" id="theme-toggle-light-icon" class="w-5 h-5"
fill="currentColor" viewBox="0 0 20 20"
xmlns="http://www.w3.org/2000/svg">
<path
d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"
fillRule="evenodd" clipRule="evenodd"></path>
</svg>
</button>
</div>
</div>
</div>
{{-- End of Dark Mode Toggle Button section --}}
@include('layouts.partials.color-scheme')
<div class="ml-6 flex items-center">
<div class="relative ml-5">
<x-dropdown align="right" width="48">

View File

@ -0,0 +1,37 @@
<div class="flex items-center" x-data="{
isDarkMode: localStorage.theme,
toggleTheme() {
localStorage.theme = this.isDarkMode === 'dark' ? 'light' : 'dark';
if (localStorage.theme === 'dark') {
document.documentElement.classList.add('dark')
} else {
document.documentElement.classList.remove('dark')
}
this.isDarkMode = localStorage.theme
}
}" x-on:click="toggleTheme()">
<div class="flex items-center">
<div class="flex items-center justify-end">
<button id="theme-toggle" type="button" class="text-sm p-2"
:class="isDarkMode === 'dark' ? 'text-gray-300 border-gray-300' :
'text-gray-800 border-gray-800'">
<svg x-show="isDarkMode !== 'dark'" id="theme-toggle-dark-icon" class="w-5 h-5"
fill="currentColor" viewBox="0 0 20 20"
xmlns="http://www.w3.org/2000/svg">
<path
d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z">
</path>
</svg>
<svg x-show="isDarkMode === 'dark'" id="theme-toggle-light-icon" class="w-5 h-5"
fill="currentColor" viewBox="0 0 20 20"
xmlns="http://www.w3.org/2000/svg">
<path
d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z"
fillRule="evenodd" clipRule="evenodd"></path>
</svg>
</button>
</div>
</div>
</div>

View File

@ -1,3 +1,4 @@
@php use App\Enums\SiteFeature; @endphp
<x-app-layout :server="$site->server">
@if(isset($pageTitle))
<x-slot name="pageTitle">{{ $site->domain }} - {{ $pageTitle }}</x-slot>
@ -58,10 +59,12 @@
<x-secondary-sidebar-link :href="route('servers.sites.show', ['server' => $site->server, 'site' => $site])" :active="request()->routeIs('servers.sites.show')">
{{ __('Application') }}
</x-secondary-sidebar-link>
@if($site->status == \App\Enums\SiteStatus::READY)
@if($site->isReady() && $site->hasFeature(SiteFeature::SSL))
<x-secondary-sidebar-link :href="route('servers.sites.ssl', ['server' => $site->server, 'site' => $site])" :active="request()->routeIs('servers.sites.ssl')">
{{ __('SSL') }}
</x-secondary-sidebar-link>
@endif
@if($site->isReady() && $site->hasFeature(SiteFeature::QUEUES))
<x-secondary-sidebar-link :href="route('servers.sites.queues', ['server' => $site->server, 'site' => $site])" :active="request()->routeIs('servers.sites.queues')">
{{ __('Queues') }}
</x-secondary-sidebar-link>

View File

@ -1,3 +1,6 @@
<div>
<x-simple-card class="flex items-center justify-between">
<span>{{ __("Your Wordpress site is installed and ready to use! ") }}</span>
<x-secondary-button :href="$site->url" target="_blank">{{ __("Open Website") }}</x-secondary-button>
</x-simple-card>
</div>

View File

@ -5,10 +5,10 @@
<form id="create-site" wire:submit.prevent="create" class="space-y-6">
<div>
<x-input-label>{{ __("Select site type") }}</x-input-label>
<x-select-input wire:model="type" id="type" name="type" class="mt-1 w-full">
<x-select-input wire:model="inputs.type" id="type" name="type" class="mt-1 w-full">
<option value="" selected disabled>{{ __("Select") }}</option>
@foreach(config('core.site_types') as $t)
<option value="{{ $t }}" @if($t === $type) selected @endif>
<option value="{{ $t }}" @if($t === $inputs['type']) selected @endif>
{{ $t }}
</option>
@endforeach
@ -20,7 +20,7 @@
<div>
<x-input-label for="domain" :value="__('Domain')" />
<x-text-input wire:model.defer="domain" id="domain" name="domain" type="text" class="mt-1 block w-full" autocomplete="domain" placeholder="example.com" />
<x-text-input wire:model.defer="inputs.domain" id="domain" name="domain" type="text" class="mt-1 block w-full" autocomplete="domain" placeholder="example.com" />
@error('domain')
<x-input-error class="mt-2" :messages="$message" />
@enderror
@ -28,75 +28,15 @@
<div>
<x-input-label for="alias" :value="__('Alias')" />
<x-text-input wire:model.defer="alias" id="alias" name="alias" type="text" class="mt-1 block w-full" autocomplete="alias" placeholder="www.example.com" />
<x-text-input wire:model.defer="inputs.alias" id="alias" name="alias" type="text" class="mt-1 block w-full" autocomplete="alias" placeholder="www.example.com" />
@error('alias')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div>
<x-input-label for="php_version" :value="__('PHP Version')" />
<x-select-input wire:model.defer="php_version" id="php_version" name="php_version" class="mt-1 w-full">
<option value="" selected disabled>{{ __("Select") }}</option>
@foreach($server->installedPHPVersions() as $version)
<option value="{{ $version }}" @if($version === $php_version) selected @endif>
PHP {{ $version }}
</option>
@endforeach
</x-select-input>
@error('php_version')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div>
<x-input-label for="web_directory" :value="__('Web Directory')" />
<x-text-input wire:model.defer="web_directory" id="web_directory" name="web_directory" type="text" class="mt-1 block w-full" autocomplete="web_directory" />
@error('web_directory')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div>
<x-input-label for="source_control" :value="__('Source Control')" />
<div class="flex items-center mt-1">
<x-select-input wire:model="source_control" id="source_control" name="source_control" class="mt-1 w-full">
<option value="" selected disabled>{{ __("Select") }}</option>
@foreach($sourceControls as $sourceControl)
<option value="{{ $sourceControl->id }}" @if($sourceControl->id === $source_control) selected @endif>
{{ $sourceControl->profile }} ({{ $sourceControl->provider }})
</option>
@endforeach
</x-select-input>
<x-secondary-button :href="route('source-controls', ['redirect' => request()->url()])" class="flex-none ml-2">{{ __('Connect') }}</x-secondary-button>
</div>
@error('source_control')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div>
<x-input-label for="repository" :value="__('Repository')" />
<x-text-input wire:model.defer="repository" id="repository" name="repository" type="text" class="mt-1 block w-full" autocomplete="repository" placeholder="organization/repository" />
@error('repository')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div>
<x-input-label for="branch" :value="__('Branch')" />
<x-text-input wire:model.defer="branch" id="branch" name="branch" type="text" class="mt-1 block w-full" autocomplete="branch" placeholder="main" />
@error('branch')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div class="mt-6">
<label for="composer" class="inline-flex items-center">
<input id="composer" wire:model.defer="composer" type="checkbox" class="rounded dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-indigo-600 shadow-sm focus:ring-indigo-500 dark:focus:ring-indigo-600 dark:focus:ring-offset-gray-800" name="composer">
<span class="ml-2 text-sm text-gray-600 dark:text-gray-400">{{ __('Run `composer install --no-dev`') }}</span>
</label>
</div>
@if (isset($inputs['type']) && $inputs['type'])
@include('livewire.sites.partials.create.' . $inputs['type'])
@endif
</form>
<x-slot name="actions">
<x-primary-button form="create-site" wire:loading.attr="disabled">{{ __('Create') }}</x-primary-button>

View File

@ -0,0 +1,7 @@
<div>
<x-input-label for="branch" :value="__('Branch')" />
<x-text-input wire:model.defer="inputs.branch" id="branch" name="branch" type="text" class="mt-1 block w-full" autocomplete="branch" placeholder="main" />
@error('branch')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>

View File

@ -0,0 +1,6 @@
<div class="mt-6">
<label for="composer" class="inline-flex items-center">
<input id="composer" wire:model.defer="inputs.composer" type="checkbox" class="rounded dark:bg-gray-900 border-gray-300 dark:border-gray-700 text-indigo-600 shadow-sm focus:ring-indigo-500 dark:focus:ring-indigo-600 dark:focus:ring-offset-gray-800" name="composer">
<span class="ml-2 text-sm text-gray-600 dark:text-gray-400">{{ __('Run `composer install --no-dev`') }}</span>
</label>
</div>

View File

@ -0,0 +1,17 @@
@php
/* @var \App\Models\Server $server */
@endphp
<div>
<x-input-label for="php_version" :value="__('PHP Version')" />
<x-select-input wire:model.defer="inputs.php_version" id="php_version" name="php_version" class="mt-1 w-full">
<option value="" selected>{{ __("Select") }}</option>
@foreach($server->installedPHPVersions() as $version)
<option value="{{ $version }}" @if($version === $inputs['php_version']) selected @endif>
PHP {{ $version }}
</option>
@endforeach
</x-select-input>
@error('php_version')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>

View File

@ -0,0 +1,7 @@
<div>
<x-input-label for="repository" :value="__('Repository')" />
<x-text-input wire:model.defer="inputs.repository" id="repository" name="repository" type="text" class="mt-1 block w-full" autocomplete="repository" placeholder="organization/repository" />
@error('repository')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>

View File

@ -0,0 +1,17 @@
<div>
<x-input-label for="source_control" :value="__('Source Control')" />
<div class="flex items-center mt-1">
<x-select-input wire:model="inputs.source_control" id="source_control" name="source_control" class="mt-1 w-full">
<option value="" selected>{{ __("Select") }}</option>
@foreach($sourceControls as $sourceControl)
<option value="{{ $sourceControl->id }}" @if($sourceControl->id === $inputs['source_control']) selected @endif>
{{ $sourceControl->profile }} ({{ $sourceControl->provider }})
</option>
@endforeach
</x-select-input>
<x-secondary-button :href="route('source-controls', ['redirect' => request()->url()])" class="flex-none ml-2">{{ __('Connect') }}</x-secondary-button>
</div>
@error('source_control')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>

View File

@ -0,0 +1,10 @@
<div>
<x-input-label for="web_directory" :value="__('Web Directory')" />
<x-text-input wire:model.defer="inputs.web_directory" id="web_directory" name="web_directory" type="text" class="mt-1 block w-full" autocomplete="web_directory" />
<x-input-help>
{{ __("For root, leave this blank") }}
</x-input-help>
@error('web_directory')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>

View File

@ -0,0 +1,11 @@
@include('livewire.sites.partials.create.fields.php-version')
@include('livewire.sites.partials.create.fields.web-directory')
@include('livewire.sites.partials.create.fields.source-control')
@include('livewire.sites.partials.create.fields.repository')
@include('livewire.sites.partials.create.fields.branch')
@include('livewire.sites.partials.create.fields.composer')

View File

@ -0,0 +1,11 @@
@include('livewire.sites.partials.create.fields.php-version')
@include('livewire.sites.partials.create.fields.web-directory')
@include('livewire.sites.partials.create.fields.source-control')
@include('livewire.sites.partials.create.fields.repository')
@include('livewire.sites.partials.create.fields.branch')
@include('livewire.sites.partials.create.fields.composer')

View File

@ -0,0 +1,63 @@
@include('livewire.sites.partials.create.fields.php-version')
<div>
<x-input-label for="title" :value="__('Title')" />
<x-text-input wire:model.defer="inputs.title" id="title" name="title" type="text" class="mt-1 block w-full" autocomplete="branch" />
@error('title')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div class="grid grid-cols-1 lg:grid-cols-3 gap-5">
<div>
<x-input-label for="email" :value="__('WP Admin Email')" />
<x-text-input wire:model.defer="inputs.email" id="email" name="email" type="email" class="mt-1 block w-full" autocomplete="email" />
@error('email')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div>
<x-input-label for="username" :value="__('WP Admin Username')" />
<x-text-input wire:model.defer="inputs.username" id="username" name="username" type="text" class="mt-1 block w-full" autocomplete="username" />
@error('username')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div>
<x-input-label for="password" :value="__('WP Admin Password')" />
<x-text-input wire:model.defer="inputs.password" id="password" name="password" type="text" class="mt-1 block w-full" />
@error('title')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
</div>
<div class="grid grid-cols-1 lg:grid-cols-3 gap-5">
<div>
<x-input-label for="database" :value="__('Database Name')" />
<x-text-input wire:model.defer="inputs.database" id="database" name="database" type="text" class="mt-1 block w-full" autocomplete="database" />
<x-input-help>{{ __("It will create a database with this name") }}</x-input-help>
@error('database')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div>
<x-input-label for="database" :value="__('Database User')" />
<x-text-input wire:model.defer="inputs.database_user" id="database_user" name="database_user" type="text" class="mt-1 block w-full" autocomplete="database_user" />
<x-input-help>{{ __("It will create a database user with this username") }}</x-input-help>
@error('database_user')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
<div>
<x-input-label for="password" :value="__('Database Password')" />
<x-text-input wire:model.defer="inputs.database_password" id="database_password" name="database_password" type="text" class="mt-1 block w-full" />
@error('database_password')
<x-input-error class="mt-2" :messages="$message" />
@enderror
</div>
</div>