fix: terminal
This commit is contained in:
parent
35f23cfb96
commit
f71fb7266d
14 changed files with 118 additions and 59 deletions
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
class ExecuteContainerCommand extends Component
|
class ExecuteContainerCommand extends Component
|
||||||
{
|
{
|
||||||
public string $container;
|
public $container;
|
||||||
|
|
||||||
public Collection $containers;
|
public Collection $containers;
|
||||||
|
|
||||||
|
|
@ -57,24 +57,13 @@ public function mount()
|
||||||
if ($this->resource->destination->server->isFunctional()) {
|
if ($this->resource->destination->server->isFunctional()) {
|
||||||
$this->servers = $this->servers->push($this->resource->destination->server);
|
$this->servers = $this->servers->push($this->resource->destination->server);
|
||||||
}
|
}
|
||||||
$this->container = $this->resource->uuid;
|
|
||||||
$this->containers->push($this->container);
|
|
||||||
} elseif (data_get($this->parameters, 'service_uuid')) {
|
} elseif (data_get($this->parameters, 'service_uuid')) {
|
||||||
$this->type = 'service';
|
$this->type = 'service';
|
||||||
$this->resource = Service::where('uuid', $this->parameters['service_uuid'])->firstOrFail();
|
$this->resource = Service::where('uuid', $this->parameters['service_uuid'])->firstOrFail();
|
||||||
$this->resource->applications()->get()->each(function ($application) {
|
|
||||||
$this->containers->push(data_get($application, 'name').'-'.data_get($this->resource, 'uuid'));
|
|
||||||
});
|
|
||||||
$this->resource->databases()->get()->each(function ($database) {
|
|
||||||
$this->containers->push(data_get($database, 'name').'-'.data_get($this->resource, 'uuid'));
|
|
||||||
});
|
|
||||||
if ($this->resource->server->isFunctional()) {
|
if ($this->resource->server->isFunctional()) {
|
||||||
$this->servers = $this->servers->push($this->resource->server);
|
$this->servers = $this->servers->push($this->resource->server);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($this->containers->count() > 0) {
|
|
||||||
$this->container = $this->containers->first();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function loadContainers()
|
public function loadContainers()
|
||||||
|
|
@ -97,19 +86,45 @@ public function loadContainers()
|
||||||
];
|
];
|
||||||
$this->containers = $this->containers->push($payload);
|
$this->containers = $this->containers->push($payload);
|
||||||
}
|
}
|
||||||
|
} elseif (data_get($this->parameters, 'database_uuid')) {
|
||||||
|
if ($this->resource->isRunning()) {
|
||||||
|
$this->containers = $this->containers->push([
|
||||||
|
'server' => $server,
|
||||||
|
'container' => [
|
||||||
|
'Names' => $this->resource->uuid,
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
} elseif (data_get($this->parameters, 'service_uuid')) {
|
||||||
|
$this->resource->applications()->get()->each(function ($application) {
|
||||||
|
ray($application);
|
||||||
|
if ($application->isRunning()) {
|
||||||
|
$this->containers->push([
|
||||||
|
'server' => $this->resource->server,
|
||||||
|
'container' => [
|
||||||
|
'Names' => data_get($application, 'name').'-'.data_get($this->resource, 'uuid'),
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$this->resource->databases()->get()->each(function ($database) {
|
||||||
|
if ($database->isRunning()) {
|
||||||
|
$this->containers->push([
|
||||||
|
'server' => $this->resource->server,
|
||||||
|
'container' => [
|
||||||
|
'Names' => data_get($database, 'name').'-'.data_get($this->resource, 'uuid'),
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if ($this->containers->count() > 0) {
|
if ($this->containers->count() > 0) {
|
||||||
if (data_get($this->parameters, 'application_uuid')) {
|
$this->container = $this->containers->first();
|
||||||
$this->container = data_get($this->containers->first(), 'container.Names');
|
}
|
||||||
} elseif (data_get($this->parameters, 'database_uuid')) {
|
if ($this->containers->count() === 1) {
|
||||||
$this->container = $this->containers->first();
|
$this->dispatch('connectToContainer');
|
||||||
} elseif (data_get($this->parameters, 'service_uuid')) {
|
|
||||||
$this->container = $this->containers->first();
|
|
||||||
}
|
|
||||||
if ($this->containers->count() === 1) {
|
|
||||||
$this->dispatch('connectToContainer');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -117,17 +132,13 @@ public function loadContainers()
|
||||||
public function connectToContainer()
|
public function connectToContainer()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
if (data_get($this->parameters, 'application_uuid')) {
|
$container_name = data_get($this->container, 'container.Names');
|
||||||
$container = $this->containers->where('container.Names', $this->container)->first();
|
ray($this->container);
|
||||||
$container_name = data_get($container, 'container.Names');
|
if (is_null($container_name)) {
|
||||||
if (is_null($container)) {
|
throw new \RuntimeException('Container not found.');
|
||||||
throw new \RuntimeException('Container not found.');
|
|
||||||
}
|
|
||||||
$server = data_get($container, 'server');
|
|
||||||
} else {
|
|
||||||
$container_name = $this->container;
|
|
||||||
$server = $this->servers->first();
|
|
||||||
}
|
}
|
||||||
|
$server = data_get($this->container, 'server');
|
||||||
|
|
||||||
if ($server->isForceDisabled()) {
|
if ($server->isForceDisabled()) {
|
||||||
throw new \RuntimeException('Server is disabled.');
|
throw new \RuntimeException('Server is disabled.');
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ public function sendTerminalCommand($isContainer, $identifier, $serverUuid)
|
||||||
if ($isContainer) {
|
if ($isContainer) {
|
||||||
$status = getContainerStatus($server, $identifier);
|
$status = getContainerStatus($server, $identifier);
|
||||||
if ($status !== 'running') {
|
if ($status !== 'running') {
|
||||||
return handleError(new \Exception('Container is not running'), $this);
|
return;
|
||||||
}
|
}
|
||||||
$command = generateSshCommand($server, "docker exec -it {$identifier} sh -c 'if [ -f ~/.profile ]; then . ~/.profile; fi; if [ -n \"\$SHELL\" ]; then exec \$SHELL; else sh; fi'");
|
$command = generateSshCommand($server, "docker exec -it {$identifier} sh -c 'if [ -f ~/.profile ]; then . ~/.profile; fi; if [ -n \"\$SHELL\" ]; then exec \$SHELL; else sh; fi'");
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,16 @@ public static function ownedByCurrentTeamAPI(int $teamId)
|
||||||
return ServiceApplication::whereRelation('service.environment.project.team', 'id', $teamId)->orderBy('name');
|
return ServiceApplication::whereRelation('service.environment.project.team', 'id', $teamId)->orderBy('name');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isRunning()
|
||||||
|
{
|
||||||
|
return str($this->status)->contains('running');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isExited()
|
||||||
|
{
|
||||||
|
return str($this->status)->contains('exited');
|
||||||
|
}
|
||||||
|
|
||||||
public function isLogDrainEnabled()
|
public function isLogDrainEnabled()
|
||||||
{
|
{
|
||||||
return data_get($this, 'is_log_drain_enabled', false);
|
return data_get($this, 'is_log_drain_enabled', false);
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,16 @@ public function restart()
|
||||||
remote_process(["docker restart {$container_id}"], $this->service->server);
|
remote_process(["docker restart {$container_id}"], $this->service->server);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isRunning()
|
||||||
|
{
|
||||||
|
return str($this->status)->contains('running');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isExited()
|
||||||
|
{
|
||||||
|
return str($this->status)->contains('exited');
|
||||||
|
}
|
||||||
|
|
||||||
public function isLogDrainEnabled()
|
public function isLogDrainEnabled()
|
||||||
{
|
{
|
||||||
return data_get($this, 'is_log_drain_enabled', false);
|
return data_get($this, 'is_log_drain_enabled', false);
|
||||||
|
|
|
||||||
|
|
@ -75,6 +75,11 @@ public function isConfigurationChanged(bool $save = false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isRunning()
|
||||||
|
{
|
||||||
|
return (bool) str($this->status)->contains('running');
|
||||||
|
}
|
||||||
|
|
||||||
public function isExited()
|
public function isExited()
|
||||||
{
|
{
|
||||||
return (bool) str($this->status)->startsWith('exited');
|
return (bool) str($this->status)->startsWith('exited');
|
||||||
|
|
|
||||||
|
|
@ -75,6 +75,11 @@ public function isConfigurationChanged(bool $save = false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isRunning()
|
||||||
|
{
|
||||||
|
return (bool) str($this->status)->contains('running');
|
||||||
|
}
|
||||||
|
|
||||||
public function isExited()
|
public function isExited()
|
||||||
{
|
{
|
||||||
return (bool) str($this->status)->startsWith('exited');
|
return (bool) str($this->status)->startsWith('exited');
|
||||||
|
|
|
||||||
|
|
@ -75,6 +75,11 @@ public function isConfigurationChanged(bool $save = false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isRunning()
|
||||||
|
{
|
||||||
|
return (bool) str($this->status)->contains('running');
|
||||||
|
}
|
||||||
|
|
||||||
public function isExited()
|
public function isExited()
|
||||||
{
|
{
|
||||||
return (bool) str($this->status)->startsWith('exited');
|
return (bool) str($this->status)->startsWith('exited');
|
||||||
|
|
|
||||||
|
|
@ -75,6 +75,11 @@ public function isConfigurationChanged(bool $save = false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isRunning()
|
||||||
|
{
|
||||||
|
return (bool) str($this->status)->contains('running');
|
||||||
|
}
|
||||||
|
|
||||||
public function isExited()
|
public function isExited()
|
||||||
{
|
{
|
||||||
return (bool) str($this->status)->startsWith('exited');
|
return (bool) str($this->status)->startsWith('exited');
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,11 @@ public function isConfigurationChanged(bool $save = false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isRunning()
|
||||||
|
{
|
||||||
|
return (bool) str($this->status)->contains('running');
|
||||||
|
}
|
||||||
|
|
||||||
public function isExited()
|
public function isExited()
|
||||||
{
|
{
|
||||||
return (bool) str($this->status)->startsWith('exited');
|
return (bool) str($this->status)->startsWith('exited');
|
||||||
|
|
|
||||||
|
|
@ -76,6 +76,11 @@ public function isConfigurationChanged(bool $save = false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isRunning()
|
||||||
|
{
|
||||||
|
return (bool) str($this->status)->contains('running');
|
||||||
|
}
|
||||||
|
|
||||||
public function isExited()
|
public function isExited()
|
||||||
{
|
{
|
||||||
return (bool) str($this->status)->startsWith('exited');
|
return (bool) str($this->status)->startsWith('exited');
|
||||||
|
|
|
||||||
|
|
@ -102,6 +102,11 @@ public function isConfigurationChanged(bool $save = false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isRunning()
|
||||||
|
{
|
||||||
|
return (bool) str($this->status)->contains('running');
|
||||||
|
}
|
||||||
|
|
||||||
public function isExited()
|
public function isExited()
|
||||||
{
|
{
|
||||||
return (bool) str($this->status)->startsWith('exited');
|
return (bool) str($this->status)->startsWith('exited');
|
||||||
|
|
|
||||||
|
|
@ -71,6 +71,11 @@ public function isConfigurationChanged(bool $save = false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isRunning()
|
||||||
|
{
|
||||||
|
return (bool) str($this->status)->contains('running');
|
||||||
|
}
|
||||||
|
|
||||||
public function isExited()
|
public function isExited()
|
||||||
{
|
{
|
||||||
return (bool) str($this->status)->startsWith('exited');
|
return (bool) str($this->status)->startsWith('exited');
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@
|
||||||
{{ data_get_str($service, 'name')->limit(10) }} > Configuration | Coolify
|
{{ data_get_str($service, 'name')->limit(10) }} > Configuration | Coolify
|
||||||
</x-slot>
|
</x-slot>
|
||||||
<livewire:project.service.navbar :service="$service" :parameters="$parameters" :query="$query" />
|
<livewire:project.service.navbar :service="$service" :parameters="$parameters" :query="$query" />
|
||||||
<div class="flex flex-col h-full gap-8 pt-6 sm:flex-row">
|
<div class="flex flex-col gap-8 pt-6 h-full sm:flex-row">
|
||||||
<div class="flex flex-col items-start gap-2 min-w-fit">
|
<div class="flex flex-col gap-2 items-start min-w-fit">
|
||||||
<a class="menu-item sm:min-w-fit" target="_blank" href="{{ $service->documentation() }}">Documentation
|
<a class="menu-item sm:min-w-fit" target="_blank" href="{{ $service->documentation() }}">Documentation
|
||||||
<x-external-link /></a>
|
<x-external-link /></a>
|
||||||
<a class="menu-item sm:min-w-fit" :class="activeTab === 'service-stack' && 'menu-item-active'"
|
<a class="menu-item sm:min-w-fit" :class="activeTab === 'service-stack' && 'menu-item-active'"
|
||||||
|
|
@ -23,10 +23,10 @@
|
||||||
@click.prevent="activeTab = 'scheduled-tasks'; window.location.hash = 'scheduled-tasks'"
|
@click.prevent="activeTab = 'scheduled-tasks'; window.location.hash = 'scheduled-tasks'"
|
||||||
href="#">Scheduled Tasks
|
href="#">Scheduled Tasks
|
||||||
</a>
|
</a>
|
||||||
<a class="menu-item sm:min-w-fit" :class="activeTab === 'execute-command' && 'menu-item-active'"
|
<a class="menu-item sm:min-w-fit" :class="activeTab === 'terminal' && 'menu-item-active'"
|
||||||
@click.prevent="activeTab = 'execute-command';
|
@click.prevent="activeTab = 'terminal';
|
||||||
window.location.hash = 'execute-command'"
|
window.location.hash = 'terminal'"
|
||||||
href="#">Execute Command</a>
|
href="#">Terminal</a>
|
||||||
<a class="menu-item sm:min-w-fit" :class="activeTab === 'logs' && 'menu-item-active'"
|
<a class="menu-item sm:min-w-fit" :class="activeTab === 'logs' && 'menu-item-active'"
|
||||||
@click.prevent="activeTab = 'logs';
|
@click.prevent="activeTab = 'logs';
|
||||||
window.location.hash = 'logs'"
|
window.location.hash = 'logs'"
|
||||||
|
|
@ -168,7 +168,7 @@ class="w-4 h-4 dark:text-warning text-coollabs"
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'storages'">
|
<div x-cloak x-show="activeTab === 'storages'">
|
||||||
<div class="flex items-center gap-2">
|
<div class="flex gap-2 items-center">
|
||||||
<h2>Storages</h2>
|
<h2>Storages</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="pb-4">Persistent storage to preserve data between deployments.</div>
|
<div class="pb-4">Persistent storage to preserve data between deployments.</div>
|
||||||
|
|
@ -191,7 +191,7 @@ class="w-4 h-4 dark:text-warning text-coollabs"
|
||||||
<div x-cloak x-show="activeTab === 'logs'">
|
<div x-cloak x-show="activeTab === 'logs'">
|
||||||
<livewire:project.shared.logs :resource="$service" />
|
<livewire:project.shared.logs :resource="$service" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'execute-command'">
|
<div x-cloak x-show="activeTab === 'terminal'">
|
||||||
<livewire:project.shared.execute-container-command :resource="$service" />
|
<livewire:project.shared.execute-container-command :resource="$service" />
|
||||||
</div>
|
</div>
|
||||||
<div x-cloak x-show="activeTab === 'environment-variables'">
|
<div x-cloak x-show="activeTab === 'environment-variables'">
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
@endif
|
@endif
|
||||||
<div x-init="$wire.loadContainers">
|
<div x-init="$wire.loadContainers">
|
||||||
<div class="pt-4" wire:loading wire:target='loadContainers'>
|
<div class="pt-4" wire:loading wire:target='loadContainers'>
|
||||||
Loading containers...
|
Loading resources...
|
||||||
</div>
|
</div>
|
||||||
<div wire:loading.remove wire:target='loadContainers'>
|
<div wire:loading.remove wire:target='loadContainers'>
|
||||||
@if (count($containers) > 0)
|
@if (count($containers) > 0)
|
||||||
|
|
@ -22,24 +22,12 @@
|
||||||
wire:submit="$dispatchSelf('connectToContainer')">
|
wire:submit="$dispatchSelf('connectToContainer')">
|
||||||
<x-forms.select label="Container" id="container" required>
|
<x-forms.select label="Container" id="container" required>
|
||||||
<option disabled selected>Select container</option>
|
<option disabled selected>Select container</option>
|
||||||
@if (data_get($this->parameters, 'application_uuid'))
|
@foreach ($containers as $container)
|
||||||
@foreach ($containers as $container)
|
<option value="{{ data_get($container, 'container.Names') }}">
|
||||||
<option value="{{ data_get($container, 'container.Names') }}">
|
{{ data_get($container, 'container.Names') }}
|
||||||
{{ data_get($container, 'container.Names') }}
|
({{ data_get($container, 'server.name') }})
|
||||||
({{ data_get($container, 'server.name') }})
|
|
||||||
</option>
|
|
||||||
@endforeach
|
|
||||||
@elseif(data_get($this->parameters, 'service_uuid'))
|
|
||||||
@foreach ($containers as $container)
|
|
||||||
<option value="{{ $container }}">
|
|
||||||
{{ $container }} ({{ data_get($servers, '0.name') }})
|
|
||||||
</option>
|
|
||||||
@endforeach
|
|
||||||
@else
|
|
||||||
<option value="{{ $container }}">
|
|
||||||
{{ $container }} ({{ data_get($servers, '0.name') }})
|
|
||||||
</option>
|
</option>
|
||||||
@endif
|
@endforeach
|
||||||
</x-forms.select>
|
</x-forms.select>
|
||||||
<x-forms.button type="submit">Connect</x-forms.button>
|
<x-forms.button type="submit">Connect</x-forms.button>
|
||||||
</form>
|
</form>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue