fix: able to change localhost's private key
This commit is contained in:
parent
341f64839b
commit
6cd29ad7e4
@ -41,7 +41,7 @@ public function changePrivateKey()
|
||||
$this->private_key->private_key .= "\n";
|
||||
}
|
||||
$this->private_key->save();
|
||||
session('currentTeam')->privateKeys = PrivateKey::where('team_id', session('currentTeam')->id)->get();
|
||||
refreshPrivateKey($this->private_key);
|
||||
} catch (\Exception $e) {
|
||||
return general_error_handler(err: $e, that: $this);
|
||||
}
|
||||
|
@ -49,26 +49,15 @@ public function installDocker()
|
||||
public function validateServer()
|
||||
{
|
||||
try {
|
||||
$this->uptime = instant_remote_process(['uptime'], $this->server);
|
||||
if ($this->uptime) {
|
||||
$this->server->settings->is_reachable = true;
|
||||
$this->server->settings->save();
|
||||
} else {
|
||||
$this->uptime = 'Server not reachable.';
|
||||
throw new \Exception('Server not reachable.');
|
||||
['uptime' => $uptime, 'dockerVersion' => $dockerVersion] = validateServer($this->server);
|
||||
if ($uptime) {
|
||||
$this->uptime = $uptime;
|
||||
}
|
||||
$this->dockerVersion = instant_remote_process(['docker version|head -2|grep -i version'], $this->server, false);
|
||||
if (!$this->dockerVersion) {
|
||||
$this->dockerVersion = 'Not installed.';
|
||||
} else {
|
||||
$this->server->settings->is_usable = true;
|
||||
$this->server->settings->save();
|
||||
if ($dockerVersion) {
|
||||
$this->dockerVersion = $dockerVersion;
|
||||
$this->emit('proxyStatusUpdated');
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
$this->server->settings->is_reachable = false;
|
||||
$this->server->settings->is_usable = false;
|
||||
$this->server->settings->save();
|
||||
return general_error_handler(customErrorMessage: "Server is not reachable. Reason: {$e->getMessage()}", that: $this);
|
||||
}
|
||||
}
|
||||
|
@ -16,16 +16,14 @@ class PrivateKey extends Component
|
||||
public function checkConnection()
|
||||
{
|
||||
try {
|
||||
$uptime = instant_remote_process(['uptime'], $this->server);
|
||||
['uptime' => $uptime, 'dockerVersion' => $dockerVersion] = validateServer($this->server);
|
||||
if ($uptime) {
|
||||
Toaster::success('Server is reachable with this private key.');
|
||||
$this->server->settings->is_reachable = true;
|
||||
$this->server->settings->is_usable = true;
|
||||
}
|
||||
if ($dockerVersion) {
|
||||
Toaster::success('Server is usable for Coolify.');
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
$this->server->settings->is_reachable = false;
|
||||
$this->server->settings->is_usable = false;
|
||||
$this->server->settings->save();
|
||||
return general_error_handler(customErrorMessage: "Server is not reachable. Reason: {$e->getMessage()}", that: $this);
|
||||
}
|
||||
}
|
||||
@ -34,9 +32,7 @@ public function setPrivateKey($private_key_id)
|
||||
$this->server->update([
|
||||
'private_key_id' => $private_key_id
|
||||
]);
|
||||
|
||||
// Delete the old ssh mux file to force a new one to be created
|
||||
Storage::disk('ssh-mux')->delete($this->server->muxFilename());
|
||||
refreshPrivateKey($this->server->privateKey);
|
||||
$this->server->refresh();
|
||||
$this->checkConnection();
|
||||
}
|
||||
|
@ -5,6 +5,7 @@
|
||||
use App\Enums\ActivityTypes;
|
||||
use App\Models\Application;
|
||||
use App\Models\ApplicationDeploymentQueue;
|
||||
use App\Models\PrivateKey;
|
||||
use App\Models\Server;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
@ -148,3 +149,44 @@ function decode_remote_command_output(?ApplicationDeploymentQueue $application_d
|
||||
|
||||
return $formatted;
|
||||
}
|
||||
|
||||
function refreshPrivateKey(PrivateKey $private_key)
|
||||
{
|
||||
foreach ($private_key->servers as $server) {
|
||||
// Delete the old ssh mux file to force a new one to be created
|
||||
Storage::disk('ssh-mux')->delete($server->muxFilename());
|
||||
if (session('currentTeam')->id) {
|
||||
session('currentTeam')->privateKeys = PrivateKey::where('team_id', session('currentTeam')->id)->get();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function validateServer(Server $server)
|
||||
{
|
||||
try {
|
||||
refreshPrivateKey($server->privateKey);
|
||||
$uptime = instant_remote_process(['uptime'], $server);
|
||||
if (!$uptime) {
|
||||
$uptime = 'Server not reachable.';
|
||||
throw new \Exception('Server not reachable.');
|
||||
}
|
||||
$server->settings->is_reachable = true;
|
||||
|
||||
$dockerVersion = instant_remote_process(['docker version|head -2|grep -i version'], $server, false);
|
||||
if (!$dockerVersion) {
|
||||
$dockerVersion = 'Not installed.';
|
||||
throw new \Exception('Docker not installed.');
|
||||
}
|
||||
$server->settings->is_usable = true;
|
||||
return [
|
||||
"uptime" => $uptime,
|
||||
"dockerVersion" => $dockerVersion,
|
||||
];
|
||||
} catch (\Exception $e) {
|
||||
$server->settings->is_reachable = false;
|
||||
$server->settings->is_usable = false;
|
||||
throw $e;
|
||||
} finally {
|
||||
$server->settings->save();
|
||||
}
|
||||
}
|
||||
|
@ -8,18 +8,18 @@
|
||||
]) }}">
|
||||
<button>General</button>
|
||||
</a>
|
||||
<a class="{{ request()->routeIs('server.proxy') ? 'text-white' : '' }}"
|
||||
href="{{ route('server.proxy', [
|
||||
'server_uuid' => Route::current()->parameters()['server_uuid'],
|
||||
]) }}">
|
||||
<button>Proxy</button>
|
||||
</a>
|
||||
<a class="{{ request()->routeIs('server.private-key') ? 'text-white' : '' }}"
|
||||
href="{{ route('server.private-key', [
|
||||
'server_uuid' => Route::current()->parameters()['server_uuid'],
|
||||
]) }}">
|
||||
<button>Private Key</button>
|
||||
</a>
|
||||
<a class="{{ request()->routeIs('server.proxy') ? 'text-white' : '' }}"
|
||||
href="{{ route('server.proxy', [
|
||||
'server_uuid' => Route::current()->parameters()['server_uuid'],
|
||||
]) }}">
|
||||
<button>Proxy</button>
|
||||
</a>
|
||||
<a class="{{ request()->routeIs('server.destinations') ? 'text-white' : '' }}"
|
||||
href="{{ route('server.destinations', [
|
||||
'server_uuid' => Route::current()->parameters()['server_uuid'],
|
||||
|
@ -4,10 +4,10 @@
|
||||
<form class="flex flex-col gap-2" wire:submit.prevent='changePrivateKey'>
|
||||
<div class="flex items-end gap-2">
|
||||
<h1>Private Key</h1>
|
||||
<x-forms.button type="submit">
|
||||
Save
|
||||
</x-forms.button>
|
||||
@if ($private_key->id > 0)
|
||||
<x-forms.button type="submit">
|
||||
Save
|
||||
</x-forms.button>
|
||||
<x-forms.button x-on:click.prevent="deletePrivateKey = true">
|
||||
Delete
|
||||
</x-forms.button>
|
||||
@ -21,7 +21,7 @@
|
||||
<div class="pl-1 ">Private Key <span class='text-helper'>*</span></div>
|
||||
<div class="text-xs text-white underline cursor-pointer" x-cloak x-show="!showPrivateKey"
|
||||
x-on:click="showPrivateKey = true">
|
||||
Show
|
||||
Edit
|
||||
</div>
|
||||
<div class="text-xs text-white underline cursor-pointer" x-cloak x-show="showPrivateKey"
|
||||
x-on:click="showPrivateKey = false">
|
||||
@ -38,11 +38,7 @@
|
||||
disabled />
|
||||
</div>
|
||||
<div x-cloak x-show="showPrivateKey">
|
||||
@if ($private_key->id === 0)
|
||||
<x-forms.textarea rows="10" id="private_key.private_key" disabled />
|
||||
@else
|
||||
<x-forms.textarea rows="10" id="private_key.private_key" required />
|
||||
@endif
|
||||
<x-forms.textarea rows="10" id="private_key.private_key" required />
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
@ -1,48 +1,48 @@
|
||||
<div x-data="{ changeLocalhost: false }">
|
||||
<x-modal yesOrNo modalId="{{ $modalId }}" modalTitle="Delete Server">
|
||||
<x-slot:modalBody>
|
||||
<p>This server will be deleted. It is not reversible. <br>Please think again..</p>
|
||||
</x-slot:modalBody>
|
||||
</x-modal>
|
||||
<x-naked-modal show="changeLocalhost" action="submit" title="Change localhost"
|
||||
message='You could lost a lot of functionalities if you change the server details of the server where Coolify is running on.<br>Please think again.' />
|
||||
<form wire:submit.prevent='submit' class="flex flex-col">
|
||||
<div class="flex gap-2">
|
||||
<h2>General</h2>
|
||||
@if ($server->id === 0)
|
||||
<x-forms.button x-on:click.prevent="changeLocalhost = true">Save</x-forms.button>
|
||||
@else
|
||||
<x-forms.button type="submit">Save</x-forms.button>
|
||||
@endif
|
||||
</div>
|
||||
<div class="flex flex-col gap-2 ">
|
||||
<div class="flex flex-col w-full gap-2 lg:flex-row">
|
||||
<x-forms.input id="server.name" label="Name" required />
|
||||
<x-forms.input id="server.description" label="Description" />
|
||||
<x-forms.input placeholder="https://example.com" id="wildcard_domain" label="Wildcard Domain"
|
||||
helper="Wildcard domain for your applications. If you set this, you will get a random generated domain for your new applications.<br><span class='font-bold text-white'>Example</span>In case you set:<span class='text-helper'>https://example.com</span>your applications will get: <span class='text-helper'>https://randomId.example.com</span>" />
|
||||
{{-- <x-forms.checkbox disabled type="checkbox" id="server.settings.is_part_of_swarm"
|
||||
label="Is it part of a Swarm cluster?" /> --}}
|
||||
</div>
|
||||
<div class="flex flex-col w-full gap-2 lg:flex-row">
|
||||
@if ($server->settings->is_reachable)
|
||||
<x-modal yesOrNo modalId="{{ $modalId }}" modalTitle="Delete Server">
|
||||
<x-slot:modalBody>
|
||||
<p>This server will be deleted. It is not reversible. <br>Please think again..</p>
|
||||
</x-slot:modalBody>
|
||||
</x-modal>
|
||||
<x-naked-modal show="changeLocalhost" action="submit" title="Change localhost"
|
||||
message='You could lost a lot of functionalities if you change the server details of the server where Coolify is running on.<br>Please think again.' />
|
||||
<form wire:submit.prevent='submit' class="flex flex-col">
|
||||
<div class="flex gap-2">
|
||||
<h2>General</h2>
|
||||
@if ($server->id === 0)
|
||||
<x-forms.input id="server.ip" label="IP Address" required />
|
||||
<x-forms.button x-on:click.prevent="changeLocalhost = true">Save</x-forms.button>
|
||||
@else
|
||||
<x-forms.input id="server.ip" label="IP Address" readonly required />
|
||||
<x-forms.button type="submit">Save</x-forms.button>
|
||||
@endif
|
||||
<div class="flex gap-2">
|
||||
<x-forms.input id="server.user" label="User" required />
|
||||
<x-forms.input type="number" id="server.port" label="Port" required />
|
||||
</div>
|
||||
<div class="flex flex-col gap-2 ">
|
||||
<div class="flex flex-col w-full gap-2 lg:flex-row">
|
||||
<x-forms.input id="server.name" label="Name" required />
|
||||
<x-forms.input id="server.description" label="Description" />
|
||||
<x-forms.input placeholder="https://example.com" id="wildcard_domain" label="Wildcard Domain"
|
||||
helper="Wildcard domain for your applications. If you set this, you will get a random generated domain for your new applications.<br><span class='font-bold text-white'>Example</span>In case you set:<span class='text-helper'>https://example.com</span>your applications will get: <span class='text-helper'>https://randomId.example.com</span>" />
|
||||
{{-- <x-forms.checkbox disabled type="checkbox" id="server.settings.is_part_of_swarm"
|
||||
label="Is it part of a Swarm cluster?" /> --}}
|
||||
</div>
|
||||
<div class="flex flex-col w-full gap-2 lg:flex-row">
|
||||
@if ($server->id === 0)
|
||||
<x-forms.input id="server.ip" label="IP Address" required />
|
||||
@else
|
||||
<x-forms.input id="server.ip" label="IP Address" readonly required />
|
||||
@endif
|
||||
<div class="flex gap-2">
|
||||
<x-forms.input id="server.user" label="User" required />
|
||||
<x-forms.input type="number" id="server.port" label="Port" required />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<h3 class="py-4">Settings</h3>
|
||||
<div class="flex items-center w-64 gap-2">
|
||||
<x-forms.input id="cleanup_after_percentage" label="Disk Cleanup threshold (%)" required
|
||||
helper="Disk cleanup job will be executed if disk usage is more than this number." />
|
||||
</div>
|
||||
<h3 class="py-4">Actions</h3>
|
||||
@if ($server->settings->is_reachable)
|
||||
<h3 class="py-4">Settings</h3>
|
||||
<div class="flex items-center w-64 gap-2">
|
||||
<x-forms.input id="cleanup_after_percentage" label="Disk Cleanup threshold (%)" required
|
||||
helper="Disk cleanup job will be executed if disk usage is more than this number." />
|
||||
</div>
|
||||
<h3 class="py-4">Actions</h3>
|
||||
<div class="flex items-center gap-2">
|
||||
<x-forms.button wire:click.prevent='validateServer'>
|
||||
Check Server Details
|
||||
@ -57,35 +57,35 @@
|
||||
</x-forms.button>
|
||||
@endif
|
||||
</div>
|
||||
@else
|
||||
<div class="w-full">
|
||||
<x-forms.button isHighlighted wire:click.prevent='validateServer'>
|
||||
Validate Server
|
||||
</x-forms.button>
|
||||
<div class="container w-full py-4 mx-auto">
|
||||
<livewire:activity-monitor :header="true" />
|
||||
</div>
|
||||
@endif
|
||||
<div class="container w-full py-4 mx-auto">
|
||||
<livewire:activity-monitor :header="true" />
|
||||
@isset($uptime)
|
||||
<h3 class="pb-3">Server Info</h3>
|
||||
<div class="py-2 pb-4">
|
||||
<p>Uptime: {{ $uptime }}</p>
|
||||
@isset($dockerVersion)
|
||||
<p>Docker Engine {{ $dockerVersion }}</p>
|
||||
@endisset
|
||||
</div>
|
||||
@endisset
|
||||
</form>
|
||||
<h3>Danger Zone</h3>
|
||||
<div class="">Woah. I hope you know what are you doing.</div>
|
||||
<h4 class="pt-4">Delete Server</h4>
|
||||
<div class="pb-4">This will remove this server from Coolify. Beware! There is no coming
|
||||
back!
|
||||
</div>
|
||||
@isset($uptime)
|
||||
<h3 class="pb-3">Server Info</h3>
|
||||
<div class="py-2 pb-4">
|
||||
<p>Uptime: {{ $uptime }}</p>
|
||||
@isset($dockerVersion)
|
||||
<p>Docker Engine {{ $dockerVersion }}</p>
|
||||
@endisset
|
||||
@if ($server->id !== 0 || isDev())
|
||||
<x-forms.button isError isModal modalId="{{ $modalId }}">
|
||||
Delete
|
||||
</x-forms.button>
|
||||
@endif
|
||||
@else
|
||||
<div class="w-full">
|
||||
<div class="cursor-pointer box" wire:click.prevent='validateServer'>
|
||||
Validate Server
|
||||
</div>
|
||||
@endisset
|
||||
</form>
|
||||
<h3>Danger Zone</h3>
|
||||
<div class="">Woah. I hope you know what are you doing.</div>
|
||||
<h4 class="pt-4">Delete Server</h4>
|
||||
<div class="pb-4">This will remove this server from Coolify. Beware! There is no coming
|
||||
back!
|
||||
</div>
|
||||
@if ($server->id !== 0 || isDev())
|
||||
<x-forms.button isError isModal modalId="{{ $modalId }}">
|
||||
Delete
|
||||
</x-forms.button>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
@ -22,17 +22,15 @@
|
||||
@endif
|
||||
|
||||
</div>
|
||||
@if ($server->id !== 0)
|
||||
<h3 class="pb-4">Select a different Private Key</h3>
|
||||
<div class="grid gap-2">
|
||||
@forelse ($privateKeys as $private_key)
|
||||
<x-forms.button wire:click='setPrivateKey({{ $private_key->id }})'>{{ $private_key->name }}
|
||||
</x-forms.button>
|
||||
@empty
|
||||
<div>No private keys found.
|
||||
<x-use-magic-bar />
|
||||
</div>
|
||||
@endforelse
|
||||
</div>
|
||||
@endif
|
||||
<h3 class="pb-4">Select a different Private Key</h3>
|
||||
<div class="grid gap-2">
|
||||
@forelse ($privateKeys as $private_key)
|
||||
<div class="cursor-pointer box" wire:click='setPrivateKey({{ $private_key->id }})'>{{ $private_key->name }}
|
||||
</div>
|
||||
@empty
|
||||
<div>No private keys found.
|
||||
<x-use-magic-bar />
|
||||
</div>
|
||||
@endforelse
|
||||
</div>
|
||||
</div>
|
||||
|
@ -74,7 +74,7 @@
|
||||
]))->name('server.proxy');
|
||||
Route::get('/server/{server_uuid}/private-key', fn () => view('server.private-key', [
|
||||
'server' => Server::ownedByCurrentTeam()->whereUuid(request()->server_uuid)->firstOrFail(),
|
||||
'privateKeys' => PrivateKey::ownedByCurrentTeam()->where('id', '!=', 0)->get(),
|
||||
'privateKeys' => PrivateKey::ownedByCurrentTeam()->get(),
|
||||
]))->name('server.private-key');
|
||||
Route::get('/server/{server_uuid}/destinations', fn () => view('server.destinations', [
|
||||
'server' => Server::ownedByCurrentTeam(['name'])->whereUuid(request()->server_uuid)->firstOrFail()
|
||||
|
Loading…
Reference in New Issue
Block a user