wip
This commit is contained in:
@@ -23,7 +23,7 @@ class StartService
|
|||||||
}
|
}
|
||||||
$commands[] = "docker compose pull";
|
$commands[] = "docker compose pull";
|
||||||
$commands[] = "docker compose up -d";
|
$commands[] = "docker compose up -d";
|
||||||
$commands[] = "docker network connect $service->uuid coolify-proxy";
|
$commands[] = "docker network connect $service->uuid coolify-proxy 2>/dev/null || true";
|
||||||
$activity = remote_process($commands, $service->server);
|
$activity = remote_process($commands, $service->server);
|
||||||
return $activity;
|
return $activity;
|
||||||
}
|
}
|
||||||
|
|||||||
25
app/Actions/Service/StopService.php
Normal file
25
app/Actions/Service/StopService.php
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Actions\Service;
|
||||||
|
|
||||||
|
use Lorisleiva\Actions\Concerns\AsAction;
|
||||||
|
use App\Models\Service;
|
||||||
|
|
||||||
|
class StopService
|
||||||
|
{
|
||||||
|
use AsAction;
|
||||||
|
public function handle(Service $service)
|
||||||
|
{
|
||||||
|
$applications = $service->applications()->get();
|
||||||
|
foreach ($applications as $application) {
|
||||||
|
instant_remote_process(["docker rm -f {$application->name}-{$service->uuid}"], $service->server);
|
||||||
|
$application->update(['status' => 'exited']);
|
||||||
|
}
|
||||||
|
$dbs = $service->databases()->get();
|
||||||
|
foreach ($dbs as $db) {
|
||||||
|
instant_remote_process(["docker rm -f {$db->name}-{$service->uuid}"], $service->server);
|
||||||
|
$db->update(['status' => 'exited']);
|
||||||
|
}
|
||||||
|
instant_remote_process(["docker network disconnect {$service->uuid} coolify-proxy 2>/dev/null"], $service->server);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
namespace App\Http\Livewire\Project\Service;
|
namespace App\Http\Livewire\Project\Service;
|
||||||
|
|
||||||
use App\Actions\Service\StartService;
|
use App\Actions\Service\StartService;
|
||||||
|
use App\Actions\Service\StopService;
|
||||||
use App\Jobs\ContainerStatusJob;
|
use App\Jobs\ContainerStatusJob;
|
||||||
use App\Models\Service;
|
use App\Models\Service;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
@@ -15,7 +16,7 @@ class Index extends Component
|
|||||||
public array $parameters;
|
public array $parameters;
|
||||||
public array $query;
|
public array $query;
|
||||||
public Collection $services;
|
public Collection $services;
|
||||||
|
protected $listeners = ['serviceStatusUpdated'];
|
||||||
protected $rules = [
|
protected $rules = [
|
||||||
'services.*.fqdn' => 'nullable',
|
'services.*.fqdn' => 'nullable',
|
||||||
];
|
];
|
||||||
@@ -39,11 +40,14 @@ class Index extends Component
|
|||||||
{
|
{
|
||||||
return view('livewire.project.service.index')->layout('layouts.app');
|
return view('livewire.project.service.index')->layout('layouts.app');
|
||||||
}
|
}
|
||||||
|
public function serviceStatusUpdated() {
|
||||||
|
ray('serviceStatusUpdated');
|
||||||
|
$this->check_status();
|
||||||
|
}
|
||||||
public function check_status()
|
public function check_status()
|
||||||
{
|
{
|
||||||
dispatch_sync(new ContainerStatusJob($this->service->server));
|
dispatch_sync(new ContainerStatusJob($this->service->server));
|
||||||
$this->service->refresh();
|
$this->service->refresh();
|
||||||
|
|
||||||
}
|
}
|
||||||
public function submit()
|
public function submit()
|
||||||
{
|
{
|
||||||
@@ -76,4 +80,8 @@ class Index extends Component
|
|||||||
$activity = StartService::run($this->service);
|
$activity = StartService::run($this->service);
|
||||||
$this->emit('newMonitorActivity', $activity->id);
|
$this->emit('newMonitorActivity', $activity->id);
|
||||||
}
|
}
|
||||||
|
public function stop() {
|
||||||
|
StopService::run($this->service);
|
||||||
|
$this->service->refresh();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
16
app/Http/Livewire/Project/Service/Modal.php
Normal file
16
app/Http/Livewire/Project/Service/Modal.php
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Livewire\Project\Service;
|
||||||
|
|
||||||
|
use Livewire\Component;
|
||||||
|
|
||||||
|
class Modal extends Component
|
||||||
|
{
|
||||||
|
public function serviceStatusUpdated() {
|
||||||
|
$this->emit('serviceStatusUpdated');
|
||||||
|
}
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
return view('livewire.project.service.modal');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -44,9 +44,12 @@ class EnvironmentVariable extends Model
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function get_environment_variables(string $environment_variable): string|null
|
private function get_environment_variables(?string $environment_variable = null): string|null
|
||||||
{
|
{
|
||||||
// $team_id = currentTeam()->id;
|
// $team_id = currentTeam()->id;
|
||||||
|
if (!$environment_variable) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
$environment_variable = trim(decrypt($environment_variable));
|
$environment_variable = trim(decrypt($environment_variable));
|
||||||
if (Str::startsWith($environment_variable, '{{') && Str::endsWith($environment_variable, '}}') && Str::contains($environment_variable, 'global.')) {
|
if (Str::startsWith($environment_variable, '{{') && Str::endsWith($environment_variable, '}}') && Str::contains($environment_variable, 'global.')) {
|
||||||
$variable = Str::after($environment_variable, 'global.');
|
$variable = Str::after($environment_variable, 'global.');
|
||||||
|
|||||||
@@ -16,31 +16,7 @@ class Services extends Component
|
|||||||
public Service $service,
|
public Service $service,
|
||||||
public string $complexStatus = 'exited',
|
public string $complexStatus = 'exited',
|
||||||
) {
|
) {
|
||||||
$foundRunning = false;
|
$this->complexStatus = serviceStatus($service);
|
||||||
$isDegraded = false;
|
|
||||||
$applications = $service->applications;
|
|
||||||
$databases = $service->databases;
|
|
||||||
foreach ($applications as $application) {
|
|
||||||
if ($application->status === 'running') {
|
|
||||||
$foundRunning = true;
|
|
||||||
} else {
|
|
||||||
$isDegraded = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach ($databases as $database) {
|
|
||||||
if ($database->status === 'running') {
|
|
||||||
$foundRunning = true;
|
|
||||||
} else {
|
|
||||||
$isDegraded = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($foundRunning && !$isDegraded) {
|
|
||||||
$this->complexStatus = 'running';
|
|
||||||
} else if ($foundRunning && $isDegraded) {
|
|
||||||
$this->complexStatus = 'degraded';
|
|
||||||
} else if (!$foundRunning && $isDegraded) {
|
|
||||||
$this->complexStatus = 'exited';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -208,3 +208,32 @@ function replaceVariables($variable)
|
|||||||
{
|
{
|
||||||
return $variable->replaceFirst('$', '')->replaceFirst('{', '')->replaceLast('}', '');
|
return $variable->replaceFirst('$', '')->replaceFirst('{', '')->replaceLast('}', '');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function serviceStatus(Service $service)
|
||||||
|
{
|
||||||
|
$foundRunning = false;
|
||||||
|
$isDegraded = false;
|
||||||
|
$applications = $service->applications;
|
||||||
|
$databases = $service->databases;
|
||||||
|
foreach ($applications as $application) {
|
||||||
|
if ($application->status === 'running') {
|
||||||
|
$foundRunning = true;
|
||||||
|
} else {
|
||||||
|
$isDegraded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach ($databases as $database) {
|
||||||
|
if ($database->status === 'running') {
|
||||||
|
$foundRunning = true;
|
||||||
|
} else {
|
||||||
|
$isDegraded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($foundRunning && !$isDegraded) {
|
||||||
|
return 'running';
|
||||||
|
} else if ($foundRunning && $isDegraded) {
|
||||||
|
return 'degraded';
|
||||||
|
} else if (!$foundRunning && $isDegraded) {
|
||||||
|
return 'exited';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
31
resources/views/components/services/navbar.blade.php
Normal file
31
resources/views/components/services/navbar.blade.php
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<div class="navbar-main">
|
||||||
|
<a class="{{ request()->routeIs('project.service') ? 'text-white' : '' }}"
|
||||||
|
href="{{ route('project.service', $parameters) }}">
|
||||||
|
<button>Configuration</button>
|
||||||
|
</a>
|
||||||
|
<div class="flex-1"></div>
|
||||||
|
{{-- <x-applications.links :application="$application" />
|
||||||
|
|
||||||
|
<x-applications.advanced :application="$application" /> --}}
|
||||||
|
@if (serviceStatus($service) !== 'exited')
|
||||||
|
<button wire:click='stop' class="flex items-center gap-2 cursor-pointer hover:text-white text-neutral-400">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5 text-error" viewBox="0 0 24 24" stroke-width="2"
|
||||||
|
stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||||
|
<path d="M6 5m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v12a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z"></path>
|
||||||
|
<path d="M14 5m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v12a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z"></path>
|
||||||
|
</svg>
|
||||||
|
Stop
|
||||||
|
</button>
|
||||||
|
@else
|
||||||
|
<button wire:click='deploy' onclick="startService.showModal()"
|
||||||
|
class="flex items-center gap-2 cursor-pointer hover:text-white text-neutral-400">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" class="w-5 h-5 text-warning" viewBox="0 0 24 24" stroke-width="1.5"
|
||||||
|
stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||||
|
<path d="M7 4v16l13 -8z" />
|
||||||
|
</svg>
|
||||||
|
Deploy
|
||||||
|
</button>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
@@ -1,16 +1,19 @@
|
|||||||
<div x-init="$wire.check_status">
|
<div x-init="$wire.check_status">
|
||||||
|
<livewire:project.service.modal />
|
||||||
<h1>Configuration</h1>
|
<h1>Configuration</h1>
|
||||||
<x-resources.breadcrumbs :resource="$service" :parameters="$parameters" />
|
<x-resources.breadcrumbs :resource="$service" :parameters="$parameters" />
|
||||||
|
<x-services.navbar :service="$service" :parameters="$parameters" />
|
||||||
<h3>Applications</h3>
|
<h3>Applications</h3>
|
||||||
@foreach ($service->applications as $application)
|
@foreach ($service->applications as $application)
|
||||||
<form wire:submit.prevent='submit'>
|
<form class="box" wire:submit.prevent='submit'>
|
||||||
<p>{{ $application->name }}</p>
|
<p>{{ $application->name }}</p>
|
||||||
<p>{{ $application->status }}</p>
|
<x-forms.input id="services.{{ $application->name }}.fqdn"></x-forms.input>
|
||||||
<x-forms.input id="services.{{$application->name}}.fqdn"></x-forms.input>
|
|
||||||
<x-forms.button type="submit">Save</x-forms.button>
|
<x-forms.button type="submit">Save</x-forms.button>
|
||||||
</form>
|
</form>
|
||||||
@endforeach
|
@endforeach
|
||||||
|
@if ($service->databases->count() > 0)
|
||||||
<h3>Databases</h3>
|
<h3>Databases</h3>
|
||||||
|
@endif
|
||||||
@foreach ($service->databases as $database)
|
@foreach ($service->databases as $database)
|
||||||
<p>{{ $database->name }}</p>
|
<p>{{ $database->name }}</p>
|
||||||
<p>{{ $database->status }}</p>
|
<p>{{ $database->status }}</p>
|
||||||
@@ -19,8 +22,4 @@
|
|||||||
@foreach ($service->environment_variables as $variable)
|
@foreach ($service->environment_variables as $variable)
|
||||||
<p>{{ $variable->key }}={{ $variable->value }}</p>
|
<p>{{ $variable->key }}={{ $variable->value }}</p>
|
||||||
@endforeach
|
@endforeach
|
||||||
<x-forms.button wire:click='deploy'>Deploy</x-forms.button>
|
|
||||||
<div class="container w-full py-10 mx-auto">
|
|
||||||
<livewire:activity-monitor header="Service Startup Logs" />
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
12
resources/views/livewire/project/service/modal.blade.php
Normal file
12
resources/views/livewire/project/service/modal.blade.php
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<div>
|
||||||
|
<x-modal submitWireAction="serviceStatusUpdated" modalId="startService">
|
||||||
|
<x-slot:modalBody>
|
||||||
|
<livewire:activity-monitor header="Service Startup Logs" />
|
||||||
|
</x-slot:modalBody>
|
||||||
|
<x-slot:modalSubmit>
|
||||||
|
<x-forms.button onclick="startService.close()" type="submit">
|
||||||
|
Close
|
||||||
|
</x-forms.button>
|
||||||
|
</x-slot:modalSubmit>
|
||||||
|
</x-modal>
|
||||||
|
</div>
|
||||||
Reference in New Issue
Block a user