This commit is contained in:
Andras Bacsai 2023-05-23 09:53:24 +02:00
parent c023fdae8b
commit ee515ff940
16 changed files with 69 additions and 32 deletions

View File

@ -3,6 +3,7 @@
namespace App\Http\Livewire\Project\Application;
use App\Enums\ActivityTypes;
use Illuminate\Support\Facades\Redis;
use Livewire\Component;
use Spatie\Activitylog\Models\Activity;
@ -14,7 +15,7 @@ class PollDeployment extends Component
public function polling()
{
if ( is_null($this->activity) && isset($this->deployment_uuid)) {
if (is_null($this->activity) && isset($this->deployment_uuid)) {
$this->activity = Activity::query()
->where('properties->type', '=', ActivityTypes::DEPLOYMENT->value)
->where('properties->type_uuid', '=', $this->deployment_uuid)
@ -23,7 +24,7 @@ public function polling()
$this->activity?->refresh();
}
if (data_get($this->activity, 'properties.status') == 'finished' || data_get($this->activity, 'properties.status') == 'failed' ) {
if (data_get($this->activity, 'properties.status') == 'finished' || data_get($this->activity, 'properties.status') == 'failed') {
$this->isKeepAliveOn = false;
}
}

View File

@ -5,13 +5,14 @@
use App\Models\Application;
use App\Models\Server;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
class ContainerStatusJob implements ShouldQueue
class ContainerStatusJob implements ShouldQueue, ShouldBeUnique
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
@ -19,6 +20,10 @@ public function __construct(
public string|null $container_id = null,
) {
}
public function uniqueId(): string
{
return $this->container_id;
}
public function handle(): void
{
try {

View File

@ -6,19 +6,18 @@
use App\Data\CoolifyTaskArgs;
use App\Enums\ActivityTypes;
use App\Models\Application;
use App\Models\InstanceSettings;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;
use Spatie\Activitylog\Models\Activity;
use Symfony\Component\Yaml\Yaml;
use Illuminate\Support\Str;
use Spatie\Url\Url;
use Illuminate\Queue\Middleware\WithoutOverlapping;
class DeployApplicationJob implements ShouldQueue
{
@ -35,9 +34,15 @@ class DeployApplicationJob implements ShouldQueue
protected $env_args;
public static int $batch_counter = 0;
public $timeout = 3600;
/**
* Create a new job instance.
*/
public function middleware(): array
{
return [new WithoutOverlapping($this->application_uuid)];
}
public function uniqueId(): string
{
return $this->application_uuid;
}
public function __construct(
public string $deployment_uuid,
public string $application_uuid,

View File

@ -31,7 +31,9 @@ textarea {
select {
@apply select select-sm disabled:opacity-40 font-normal placeholder:text-neutral-700 text-white rounded-none;
}
.breadcrumbs > ul > li::before {
@apply text-warning opacity-100;
}
button[type="button"] {
@apply btn btn-xs bg-coolgray-200 no-animation normal-case text-white rounded-none;
}

View File

@ -25,7 +25,7 @@ class="w-4 h-4 stroke-current">
</svg>
</label>
<div tabindex="0"
class="border rounded shadow border-warning/30 card compact dropdown-content bg-coolgray-200 w-96">
class="border rounded shadow border-coolgray-400 card compact dropdown-content bg-coolgray-200 w-96">
<div class="card-body">
{!! $helper !!}
</div>

View File

@ -31,7 +31,7 @@ class="w-4 h-4 stroke-current">
</svg>
</label>
<div tabindex="0"
class="border rounded shadow border-warning/30 card compact dropdown-content bg-coolgray-200 w-96">
class="border rounded shadow border-coolgray-400 card compact dropdown-content bg-coolgray-200 w-96">
<div class="card-body">
{!! $helper !!}
</div>

View File

@ -65,7 +65,7 @@ class="{{ request()->is('settings') ? 'absolute bottom-0 pb-4 text-warning' : 'a
<div class="dropdown dropdown-left">
<label tabindex="0" class="btn btn-ghost no-animation hover:bg-transparent">
<div class="flex items-center justify-center gap-2 avatar placeholder">
<div class="w-10 border border-dotted rounded-full border-neutral-600 text-warning">
<div class="w-10 border rounded-full border-neutral-600 text-warning">
<span class="text-xs">{{ Str::of(auth()->user()->name)->substr(0, 2)->upper() }}</span>
</div>
<x-chevron-down />

View File

@ -2,7 +2,7 @@
@if ($this->activity)
<div
class="flex flex-col-reverse w-full overflow-y-auto border border-solid rounded border-coolgray-300 max-h-[32rem] p-4 text-xs text-white">
<pre class="font-mono whitespace-pre-wrap" @if ($isPollingActive) wire:poll.750ms="polling" @endif>{{ \App\Actions\CoolifyTask\RunRemoteProcess::decodeOutput($this->activity) }}</pre>
<pre class="font-mono whitespace-pre-wrap" @if ($isPollingActive) wire:poll.2000ms="polling" @endif>{{ \App\Actions\CoolifyTask\RunRemoteProcess::decodeOutput($this->activity) }}</pre>
{{-- @else
<pre class="whitespace-pre-wrap">Output will be here...</pre> --}}
</div>

View File

@ -1,6 +1,18 @@
<div>
<a @if ($status === 'in_progress' || $status === 'queued') wire:poll='polling' @endif href="{{ url()->current() }}/{{ $deployment_uuid }}">
{{ $created_at }}
{{ $deployment_uuid }}</a>
<a @class([
'bg-coolgray-200 p-2 border-l border-dashed border-transparent transition-colors hover:no-underline',
'border-warning hover:bg-warning hover:text-black' =>
$status == 'in_progress' || $status == 'queued',
'border-error hover:bg-error' => $status == 'error',
'border-success hover:bg-success' => $status == 'finished',
]) @if ($status === 'in_progress' || $status === 'queued')
wire:poll.5000ms='polling'
@endif href="{{ url()->current() }}/{{ $deployment_uuid }}" class="hover:no-underline">
<div class="flex flex-col justify-start">
<div>
{{ $status }}
</div>
</div>
<div>
{{ $created_at }}
</div>
</div>
</a>

View File

@ -1,4 +1,4 @@
<div
class="flex flex-col-reverse w-full overflow-y-auto border border-solid rounded border-coolgray-300 max-h-[32rem] p-4 mt-4 text-xs text-white">
<pre class="font-mono whitespace-pre-wrap" @if ($isKeepAliveOn) wire:poll.1000ms="polling" @endif>{{ \App\Actions\CoolifyTask\RunRemoteProcess::decodeOutput($activity) }}</pre>
<pre class="font-mono whitespace-pre-wrap" @if ($isKeepAliveOn) wire:poll.2000ms="polling" @endif>{{ \App\Actions\CoolifyTask\RunRemoteProcess::decodeOutput($activity) }}</pre>
</div>

View File

@ -10,7 +10,7 @@
</x-inputs.button>
<x-inputs.button x-on:click.prevent="stopProxy = true">Stop
</x-inputs.button>
<div wire:poll="proxyStatus">
<div wire:poll.5000ms="proxyStatus">
@if (
$server->extra_attributes->last_applied_proxy_settings &&
$server->extra_attributes->last_saved_proxy_settings !== $server->extra_attributes->last_applied_proxy_settings)

View File

@ -2,8 +2,8 @@
<h1 class="pb-0">Configuration</h1>
<div class="pb-10 text-sm breadcrumbs">
<ul>
<li><a
href="{{ route('project.show', ['project_uuid' => request()->route('project_uuid')]) }}">{{ request()->route('project_uuid') }}</a>
<li><a href="{{ route('project.show', ['project_uuid' => request()->route('project_uuid')]) }}">
{{ $application->environment->project->name }}</a>
</li>
<li><a
href="{{ route('project.resources', ['environment_name' => request()->route('environment_name'), 'project_uuid' => request()->route('project_uuid')]) }}">{{ request()->route('environment_name') }}</a>

View File

@ -12,7 +12,7 @@
</ul>
</div>
<x-applications.navbar :application="$application" />
<div class="pt-2">
<div class="flex flex-col gap-2 pt-2">
@forelse ($deployments as $deployment)
<livewire:project.application.get-deployments :deployment_uuid="data_get($deployment->properties, 'type_uuid')" :created_at="data_get($deployment, 'created_at')" :status="data_get($deployment->properties, 'status')" />
@empty

View File

@ -6,18 +6,21 @@
</div>
<div class="pb-10 text-sm breadcrumbs">
<ul>
<li><a
href="{{ route('project.show', ['project_uuid' => request()->route('project_uuid')]) }}">{{ request()->route('project_uuid') }}</a>
<li>
<a href="{{ route('project.show', ['project_uuid' => request()->route('project_uuid')]) }}">
{{ $project->name }}
</a>
</li>
<li>
{{ request()->route('environment_name') }} </li>
{{ request()->route('environment_name') }}
</li>
</ul>
</div>
</div>
@if ($environment->applications->count() === 0)
<p>No resources yet.</p>
@endif
<div class="flex gap-2">
<div class="flex flex-col gap-2">
@foreach ($environment->applications->sortBy('name') as $application)
<a class="box"
href="{{ route('project.application.configuration', [$project->uuid, $environment->name, $application->uuid]) }}">

View File

@ -1,5 +1,10 @@
<x-layout>
<h1>Environments</h1>
<h1 class="pb-0">Environments</h1>
<div class="pb-10 text-sm breadcrumbs">
<ul>
<li>{{ $project->name }} </li>
</ul>
</div>
<div class="flex flex-col gap-2">
@foreach ($project->environments as $environment)
<a class="box" href="{{ route('project.resources', [$project->uuid, $environment->name]) }}">

View File

@ -1,7 +1,11 @@
<x-layout>
<h1 class="border-b-2 border-solid border-coolgray-200">Server <span
class="text-xs text-neutral-400">{{ $server->name }}</span></h1>
<div x-data="{ activeTab: window.location.hash ? window.location.hash.substring(1) : 'general' }" class="flex pt-6">
<h1 class="pb-0">Server</h1>
<div class="text-sm border-b-2 border-solid breadcrumbs border-coolgray-200">
<ul>
<li>{{ data_get($server, 'name') }}</li>
</ul>
</div>
<div x-data="{ activeTab: window.location.hash ? window.location.hash.substring(1) : 'general' }" class="flex pt-10">
<div class="flex flex-col gap-4 min-w-fit">
<a :class="activeTab === 'general' && 'text-white'"
@click.prevent="activeTab = 'general'; window.location.hash = 'general'" href="#">General</a>