2023-08-29 14:31:46 +00:00
|
|
|
<!DOCTYPE html>
|
2024-03-24 15:00:25 +00:00
|
|
|
<html data-theme="dark" lang="{{ str_replace('_', '-', app()->getLocale()) }}">
|
2023-11-21 11:07:06 +00:00
|
|
|
|
2023-08-29 14:31:46 +00:00
|
|
|
<head>
|
|
|
|
<meta charset="utf-8">
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
|
|
<link rel="preconnect" href="https://api.fonts.coollabs.io" crossorigin>
|
2024-03-04 12:34:20 +00:00
|
|
|
<link rel="dns-prefetch" href="https://api.fonts.coollabs.io" />
|
|
|
|
<link rel="preload" href="https://api.fonts.coollabs.io/css2?family=Inter&display=swap" as="style" />
|
|
|
|
<link rel="preload" href="https://cdn.fonts.coollabs.io/inter/normal/400.woff2" as="style" />
|
2023-08-29 14:31:46 +00:00
|
|
|
<link href="https://api.fonts.coollabs.io/css2?family=Inter&display=swap" rel="stylesheet">
|
2023-10-17 11:28:33 +00:00
|
|
|
<meta name="robots" content="noindex">
|
2023-08-29 14:31:46 +00:00
|
|
|
<title>Coolify</title>
|
|
|
|
@env('local')
|
|
|
|
<link rel="icon" href="{{ asset('favicon-dev.png') }}" type="image/x-icon" />
|
|
|
|
@else
|
|
|
|
<link rel="icon" href="{{ asset('coolify-transparent.png') }}" type="image/x-icon" />
|
|
|
|
@endenv
|
|
|
|
<meta name="csrf-token" content="{{ csrf_token() }}">
|
|
|
|
@vite(['resources/js/app.js', 'resources/css/app.css'])
|
|
|
|
<style>
|
|
|
|
[x-cloak] {
|
|
|
|
display: none !important;
|
|
|
|
}
|
|
|
|
</style>
|
2023-09-11 14:41:43 +00:00
|
|
|
@if (config('app.name') == 'Coolify Cloud')
|
|
|
|
<script defer data-domain="app.coolify.io" src="https://analytics.coollabs.io/js/plausible.js"></script>
|
|
|
|
@endif
|
2023-12-06 09:32:49 +00:00
|
|
|
@auth
|
2023-12-06 11:28:05 +00:00
|
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/laravel-echo/1.15.3/echo.iife.min.js"
|
|
|
|
integrity="sha512-aPAh2oRUr3ALz2MwVWkd6lmdgBQC0wSr0R++zclNjXZreT/JrwDPZQwA/p6R3wOCTcXKIHgA9pQGEQBWQmdLaA=="
|
|
|
|
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
|
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/pusher/8.3.0/pusher.min.js"
|
|
|
|
integrity="sha512-tXL5mrkSoP49uQf2jO0LbvzMyFgki//znmq0wYXGq94gVF6TU0QlrSbwGuPpKTeN1mIjReeqKZ4/NJPjHN1d2Q=="
|
|
|
|
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
2023-12-06 09:32:49 +00:00
|
|
|
@endauth
|
2023-08-29 14:31:46 +00:00
|
|
|
</head>
|
|
|
|
@section('body')
|
2023-11-21 11:07:06 +00:00
|
|
|
|
2023-08-29 14:31:46 +00:00
|
|
|
<body>
|
2024-01-25 10:57:47 +00:00
|
|
|
<x-toast />
|
2023-12-07 18:06:32 +00:00
|
|
|
<script data-navigate-once>
|
2024-03-26 09:24:53 +00:00
|
|
|
if (localStorage.theme === 'dark') {
|
2024-03-19 14:37:16 +00:00
|
|
|
document.documentElement.classList.add('dark')
|
2024-03-26 09:24:53 +00:00
|
|
|
} else if (localStorage.theme === 'light') {
|
2024-03-19 14:37:16 +00:00
|
|
|
document.documentElement.classList.remove('dark')
|
2024-03-26 09:24:53 +00:00
|
|
|
} else {
|
|
|
|
if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
2024-03-19 14:37:16 +00:00
|
|
|
document.documentElement.classList.add('dark')
|
2024-03-26 09:24:53 +00:00
|
|
|
} else {
|
|
|
|
document.documentElement.classList.remove('dark')
|
2024-03-19 14:37:16 +00:00
|
|
|
}
|
|
|
|
}
|
2023-12-10 14:57:46 +00:00
|
|
|
@auth
|
|
|
|
window.Pusher = Pusher;
|
|
|
|
window.Echo = new Echo({
|
|
|
|
broadcaster: 'pusher',
|
2023-12-11 17:06:29 +00:00
|
|
|
cluster: "{{ env('PUSHER_HOST') }}" || window.location.hostname,
|
2023-12-10 14:57:46 +00:00
|
|
|
key: "{{ env('PUSHER_APP_KEY') }}" || 'coolify',
|
2023-12-11 17:06:29 +00:00
|
|
|
wsHost: "{{ env('PUSHER_HOST') }}" || window.location.hostname,
|
2023-12-11 19:01:54 +00:00
|
|
|
wsPort: "{{ getRealtime() }}",
|
|
|
|
wssPort: "{{ getRealtime() }}",
|
2023-12-10 14:57:46 +00:00
|
|
|
forceTLS: false,
|
|
|
|
encrypted: true,
|
|
|
|
enableStats: false,
|
|
|
|
enableLogging: true,
|
|
|
|
enabledTransports: ['ws', 'wss'],
|
|
|
|
});
|
|
|
|
@endauth
|
2023-08-31 19:56:53 +00:00
|
|
|
let checkHealthInterval = null;
|
|
|
|
let checkIfIamDeadInterval = null;
|
2023-08-29 14:31:46 +00:00
|
|
|
|
2023-08-31 19:56:53 +00:00
|
|
|
function changePasswordFieldType(event) {
|
|
|
|
let element = event.target
|
|
|
|
for (let i = 0; i < 10; i++) {
|
|
|
|
if (element.className === "relative") {
|
|
|
|
break;
|
2023-08-29 14:31:46 +00:00
|
|
|
}
|
2023-08-31 19:56:53 +00:00
|
|
|
element = element.parentElement;
|
|
|
|
}
|
|
|
|
element = element.children[1];
|
2024-03-15 21:02:37 +00:00
|
|
|
if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
|
2023-08-31 19:56:53 +00:00
|
|
|
if (element.type === 'password') {
|
|
|
|
element.type = 'text';
|
2024-03-27 13:51:20 +00:00
|
|
|
if (element.disabled) return;
|
2024-03-22 10:34:15 +00:00
|
|
|
element.classList.add('truncate');
|
2024-03-15 21:02:37 +00:00
|
|
|
this.type = 'text';
|
2023-08-31 19:56:53 +00:00
|
|
|
} else {
|
|
|
|
element.type = 'password';
|
2024-03-27 13:51:20 +00:00
|
|
|
if (element.disabled) return;
|
2024-03-22 10:34:15 +00:00
|
|
|
element.classList.remove('truncate');
|
2024-03-15 21:02:37 +00:00
|
|
|
this.type = 'password';
|
2023-08-29 14:31:46 +00:00
|
|
|
}
|
|
|
|
}
|
2023-08-31 19:56:53 +00:00
|
|
|
}
|
2023-08-29 14:31:46 +00:00
|
|
|
|
2023-09-15 13:50:37 +00:00
|
|
|
function revive() {
|
|
|
|
if (checkHealthInterval) return true;
|
|
|
|
console.log('Checking server\'s health...')
|
|
|
|
checkHealthInterval = setInterval(() => {
|
|
|
|
fetch('/api/health')
|
|
|
|
.then(response => {
|
|
|
|
if (response.ok) {
|
2024-01-25 10:57:47 +00:00
|
|
|
window.toast('Coolify is back online. Reloading...', {
|
|
|
|
type: 'success',
|
|
|
|
})
|
2023-09-15 13:50:37 +00:00
|
|
|
if (checkHealthInterval) clearInterval(checkHealthInterval);
|
|
|
|
setTimeout(() => {
|
|
|
|
window.location.reload();
|
|
|
|
}, 5000)
|
|
|
|
} else {
|
|
|
|
console.log('Waiting for server to come back from dead...');
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}, 2000);
|
|
|
|
}
|
|
|
|
|
|
|
|
function upgrade() {
|
|
|
|
if (checkIfIamDeadInterval) return true;
|
|
|
|
console.log('Update initiated.')
|
|
|
|
checkIfIamDeadInterval = setInterval(() => {
|
|
|
|
fetch('/api/health')
|
|
|
|
.then(response => {
|
|
|
|
if (response.ok) {
|
|
|
|
console.log('It\'s alive. Waiting for server to be dead...');
|
|
|
|
} else {
|
2024-01-25 10:57:47 +00:00
|
|
|
window.toast('Update done, restarting Coolify!', {
|
|
|
|
type: 'success',
|
|
|
|
})
|
2023-09-15 13:50:37 +00:00
|
|
|
console.log('It\'s dead. Reviving... Standby... Bzz... Bzz...')
|
|
|
|
if (checkIfIamDeadInterval) clearInterval(checkIfIamDeadInterval);
|
|
|
|
revive();
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}, 2000);
|
|
|
|
}
|
2023-09-25 07:34:32 +00:00
|
|
|
|
2023-08-31 19:56:53 +00:00
|
|
|
function copyToClipboard(text) {
|
2023-12-11 09:23:10 +00:00
|
|
|
navigator?.clipboard?.writeText(text) && window.Livewire.dispatch('success', 'Copied to clipboard.');
|
2023-08-31 19:56:53 +00:00
|
|
|
}
|
2023-12-07 18:06:32 +00:00
|
|
|
document.addEventListener('livewire:init', () => {
|
|
|
|
window.Livewire.on('reloadWindow', (timeout) => {
|
|
|
|
if (timeout) {
|
|
|
|
setTimeout(() => {
|
|
|
|
window.location.reload();
|
|
|
|
}, timeout);
|
|
|
|
return;
|
|
|
|
} else {
|
2023-08-29 14:31:46 +00:00
|
|
|
window.location.reload();
|
2023-12-07 18:06:32 +00:00
|
|
|
}
|
|
|
|
})
|
|
|
|
window.Livewire.on('info', (message) => {
|
2024-03-21 11:44:32 +00:00
|
|
|
if (typeof message === 'string') {
|
|
|
|
window.toast('Info', {
|
|
|
|
type: 'info',
|
|
|
|
description: message,
|
|
|
|
})
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (message.length == 1) {
|
|
|
|
window.toast('Info', {
|
|
|
|
type: 'info',
|
|
|
|
description: message[0],
|
|
|
|
})
|
|
|
|
} else if (message.length == 2) {
|
2024-01-25 10:57:47 +00:00
|
|
|
window.toast(message[0], {
|
|
|
|
type: 'info',
|
|
|
|
description: message[1],
|
|
|
|
})
|
|
|
|
}
|
2023-12-07 18:06:32 +00:00
|
|
|
})
|
|
|
|
window.Livewire.on('error', (message) => {
|
2024-03-21 11:44:32 +00:00
|
|
|
if (typeof message === 'string') {
|
|
|
|
window.toast('Error', {
|
|
|
|
type: 'danger',
|
|
|
|
description: message,
|
|
|
|
})
|
|
|
|
return;
|
|
|
|
}
|
2024-02-22 13:53:42 +00:00
|
|
|
if (message.length == 1) {
|
|
|
|
window.toast('Error', {
|
|
|
|
type: 'danger',
|
|
|
|
description: message[0],
|
|
|
|
})
|
|
|
|
} else if (message.length == 2) {
|
2024-01-25 10:57:47 +00:00
|
|
|
window.toast(message[0], {
|
|
|
|
type: 'danger',
|
|
|
|
description: message[1],
|
|
|
|
})
|
|
|
|
}
|
2023-12-07 18:06:32 +00:00
|
|
|
})
|
|
|
|
window.Livewire.on('warning', (message) => {
|
2024-03-21 11:44:32 +00:00
|
|
|
if (typeof message === 'string') {
|
|
|
|
window.toast('Warning', {
|
|
|
|
type: 'warning',
|
|
|
|
description: message,
|
|
|
|
})
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (message.length == 1) {
|
|
|
|
window.toast('Warning', {
|
|
|
|
type: 'warning',
|
|
|
|
description: message[0],
|
|
|
|
})
|
|
|
|
} else if (message.length == 2) {
|
2024-01-25 10:57:47 +00:00
|
|
|
window.toast(message[0], {
|
|
|
|
type: 'warning',
|
|
|
|
description: message[1],
|
|
|
|
})
|
|
|
|
}
|
2023-12-07 18:06:32 +00:00
|
|
|
})
|
|
|
|
window.Livewire.on('success', (message) => {
|
2024-03-21 11:44:32 +00:00
|
|
|
if (typeof message === 'string') {
|
|
|
|
window.toast('Success', {
|
|
|
|
type: 'success',
|
|
|
|
description: message,
|
|
|
|
})
|
|
|
|
return;
|
|
|
|
}
|
2024-02-22 13:53:42 +00:00
|
|
|
if (message.length == 1) {
|
|
|
|
window.toast('Success', {
|
|
|
|
type: 'success',
|
|
|
|
description: message[0],
|
|
|
|
})
|
|
|
|
} else if (message.length == 2) {
|
2024-01-25 10:57:47 +00:00
|
|
|
window.toast(message[0], {
|
|
|
|
type: 'success',
|
|
|
|
description: message[1],
|
|
|
|
})
|
|
|
|
}
|
2023-12-07 18:06:32 +00:00
|
|
|
})
|
|
|
|
});
|
2023-08-31 19:56:53 +00:00
|
|
|
</script>
|
2023-08-29 14:31:46 +00:00
|
|
|
</body>
|
|
|
|
@show
|
|
|
|
|
|
|
|
</html>
|