fix: ui + subscription

This commit is contained in:
Andras Bacsai 2023-08-14 14:00:10 +02:00
parent 619d395331
commit b941f35812
32 changed files with 185 additions and 114 deletions

View File

@ -14,6 +14,9 @@ public function __invoke()
$settings->update([ $settings->update([
'is_resale_license_active' => false, 'is_resale_license_active' => false,
]); ]);
if (is_dev()) {
return;
}
if (!$settings->resale_license) { if (!$settings->resale_license) {
return; return;
} }

View File

@ -14,8 +14,8 @@ class Backup extends Component
{ {
public InstanceSettings $settings; public InstanceSettings $settings;
public $s3s; public $s3s;
public StandalonePostgresql|null $database = null; public StandalonePostgresql|null|array $database = [];
public ScheduledDatabaseBackup|null $backup = null; public ScheduledDatabaseBackup|null|array $backup = [];
public $executions = []; public $executions = [];
protected $rules = [ protected $rules = [
@ -36,8 +36,8 @@ class Backup extends Component
public function mount() public function mount()
{ {
$this->backup = $this->database->scheduledBackups->first(); $this->backup = $this->database?->scheduledBackups->first() ?? [];
$this->executions = $this->backup->executions; $this->executions = $this->backup?->executions ?? [];
} }
public function add_coolify_database() public function add_coolify_database()
{ {

View File

@ -2,9 +2,9 @@
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
function getSubscriptionLink($id) function getSubscriptionLink($type)
{ {
$checkout_id = config("coolify.lemon_squeezy_checkout_id_$id"); $checkout_id = config("coolify.lemon_squeezy_checkout_id_$type");
if (!$checkout_id) { if (!$checkout_id) {
return null; return null;
} }

View File

@ -4,9 +4,8 @@
'self_hosted' => env('SELF_HOSTED', true), 'self_hosted' => env('SELF_HOSTED', true),
'license_url' => 'https://license.coolify.io', 'license_url' => 'https://license.coolify.io',
'lemon_squeezy_webhook_secret' => env('LEMON_SQUEEZY_WEBHOOK_SECRET'), 'lemon_squeezy_webhook_secret' => env('LEMON_SQUEEZY_WEBHOOK_SECRET'),
'lemon_squeezy_checkout_id_1' => env('LEMON_SQUEEZY_CHECKOUT_ID_1'), 'lemon_squeezy_checkout_id_monthly' => env('LEMON_SQUEEZY_CHECKOUT_ID_MONTHLY'),
'lemon_squeezy_checkout_id_2' => env('LEMON_SQUEEZY_CHECKOUT_ID_2'), 'lemon_squeezy_checkout_id_yearly' => env('LEMON_SQUEEZY_CHECKOUT_ID_YEARLY'),
'lemon_squeezy_checkout_id_3' => env('LEMON_SQUEEZY_CHECKOUT_ID_3'),
'mux_enabled' => env('MUX_ENABLED', true), 'mux_enabled' => env('MUX_ENABLED', true),
'dev_webhook' => env('SERVEO_URL'), 'dev_webhook' => env('SERVEO_URL'),
'base_config_path' => env('BASE_CONFIG_PATH', '/_data/coolify'), 'base_config_path' => env('BASE_CONFIG_PATH', '/_data/coolify'),

View File

@ -34,9 +34,8 @@ services:
- PHP_PM_MAX_SPARE_SERVERS=10 - PHP_PM_MAX_SPARE_SERVERS=10
- SELF_HOSTED - SELF_HOSTED
- LEMON_SQUEEZY_WEBHOOK_SECRET - LEMON_SQUEEZY_WEBHOOK_SECRET
- LEMON_SQUEEZY_CHECKOUT_ID_1 - LEMON_SQUEEZY_CHECKOUT_ID_MONTHLY
- LEMON_SQUEEZY_CHECKOUT_ID_2 - LEMON_SQUEEZY_CHECKOUT_ID_YEARLY
- LEMON_SQUEEZY_CHECKOUT_ID_3
ports: ports:
- "${APP_PORT:-8000}:80" - "${APP_PORT:-8000}:80"
expose: expose:

View File

@ -111,5 +111,8 @@ tr td:first-child {
} }
.buyme { .buyme {
@apply block px-3 py-2 mt-10 text-sm font-semibold leading-6 text-center text-white rounded-md shadow-sm bg-coolgray-200 hover:bg-coolgray-300 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-coolgray-200; @apply block px-3 py-2 mt-10 text-sm font-semibold leading-6 text-center text-white rounded-md shadow-sm bg-coolgray-200 hover:bg-coolgray-300 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-coolgray-200 hover:no-underline;
}
.subtitle {
@apply pt-2 pb-10;
} }

View File

@ -1,12 +1,12 @@
<x-layout> <x-layout>
<h1>Command Center</h1> <h1>Command Center</h1>
<div class="pt-2 pb-10">Execute commands on your servers without leaving the browser.</div> <div class="subtitle">Execute commands on your servers without leaving the browser.</div>
@if ($servers->count() > 0) @if ($servers->count() > 0)
<livewire:run-command :servers="$servers" /> <livewire:run-command :servers="$servers" />
@else @else
<div> <div>
<div>No validated servers found.</div> <div>No servers found. Without a server, you won't be able to do much.</div>
<x-use-magic-bar /> <x-use-magic-bar link="/server/new" />
</div> </div>
@endif @endif
</x-layout> </x-layout>

View File

@ -38,49 +38,48 @@ class="{{ request()->is('project/*') || request()->is('projects') ? 'text-warnin
</svg> </svg>
</a> </a>
</li> </li>
<li title="Command Center">
<a class="hover:bg-transparent" @if (!request()->is('command-center')) href="/command-center" @endif>
<svg xmlns="http://www.w3.org/2000/svg"
class="{{ request()->is('command-center') ? 'text-warning icon' : 'icon' }}" 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="M5 7l5 5l-5 5" />
<path d="M12 19l7 0" />
</svg>
</a>
</li>
<div class="flex-1"></div>
@if (auth()->user()->isInstanceAdmin()) @if (auth()->user()->isInstanceAdmin())
<li title="Command Center">
<a class="hover:bg-transparent" @if (!request()->is('command-center')) href="/command-center" @endif>
<svg xmlns="http://www.w3.org/2000/svg"
class="{{ request()->is('command-center') ? 'text-warning icon' : 'icon' }}" 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="M5 7l5 5l-5 5" />
<path d="M12 19l7 0" />
</svg>
</a>
</li>
<li title="Profile">
<a class="hover:bg-transparent" @if (!request()->is('profile')) href="/profile" @endif>
<svg xmlns="http://www.w3.org/2000/svg" class="icon" 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="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" />
<path d="M12 10m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0" />
<path d="M6.168 18.849a4 4 0 0 1 3.832 -2.849h4a4 4 0 0 1 3.834 2.855" />
</svg>
</a>
</li>
<li title="Teams">
<a class="hover:bg-transparent" href="{{ route('team.show') }}">
<svg xmlns="http://www.w3.org/2000/svg" class="icon" 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="M10 13a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M8 21v-1a2 2 0 0 1 2 -2h4a2 2 0 0 1 2 2v1" />
<path d="M15 5a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M17 10h2a2 2 0 0 1 2 2v1" />
<path d="M5 5a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M3 13v-1a2 2 0 0 1 2 -2h2" />
</svg>
</a>
</li>
<livewire:upgrade /> <livewire:upgrade />
<div class="flex-1"></div> @endif
<li title="Profile">
<a class="hover:bg-transparent" @if (!request()->is('profile')) href="/profile" @endif>
<svg xmlns="http://www.w3.org/2000/svg" class="icon" 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="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" />
<path d="M12 10m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0" />
<path d="M6.168 18.849a4 4 0 0 1 3.832 -2.849h4a4 4 0 0 1 3.834 2.855" />
</svg>
</a>
</li>
<li title="Teams">
<a class="hover:bg-transparent" href="{{ route('team.show') }}">
<svg xmlns="http://www.w3.org/2000/svg" class="icon" 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="M10 13a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M8 21v-1a2 2 0 0 1 2 -2h4a2 2 0 0 1 2 2v1" />
<path d="M15 5a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M17 10h2a2 2 0 0 1 2 2v1" />
<path d="M5 5a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path d="M3 13v-1a2 2 0 0 1 2 -2h2" />
</svg>
</a>
</li>
@if (auth()->user()->isInstanceAdmin())
<li title="Settings" class="mt-auto"> <li title="Settings" class="mt-auto">
<a class="hover:bg-transparent" @if (!request()->is('settings')) href="/settings" @endif> <a class="hover:bg-transparent" @if (!request()->is('settings')) href="/settings" @endif>
<svg xmlns="http://www.w3.org/2000/svg" <svg xmlns="http://www.w3.org/2000/svg"
@ -95,7 +94,6 @@ class="{{ request()->is('settings*') ? 'text-warning icon' : 'icon' }}" viewBox=
</a> </a>
</li> </li>
@endif @endif
<li class="pb-6" title="Logout"> <li class="pb-6" title="Logout">
<form action="/logout" method="POST" class=" hover:bg-transparent"> <form action="/logout" method="POST" class=" hover:bg-transparent">
@csrf @csrf

View File

@ -19,8 +19,7 @@ class="sr-only">
</fieldset> </fieldset>
</div> </div>
<div x-show="selected === 'monthly'" class="flex justify-center h-10 mt-3 text-sm leading-6 "> <div x-show="selected === 'monthly'" class="flex justify-center h-10 mt-3 text-sm leading-6 ">
<div>Save <span class="text-2xl font-bold text-warning">20%</span> with the <div>Save <span class="font-bold text-warning">10% </span> annually with the yearly plan.
yearly plan
</div> </div>
</div> </div>
<div x-show="selected === 'yearly'" class="flex justify-center h-10 mt-3 text-sm leading-6 "> <div x-show="selected === 'yearly'" class="flex justify-center h-10 mt-3 text-sm leading-6 ">
@ -31,18 +30,20 @@ class="sr-only">
<div <div
class="grid max-w-sm grid-cols-1 -mt-16 divide-y divide-coolgray-500 isolate gap-y-16 sm:mx-auto lg:-mx-8 lg:mt-0 lg:max-w-none lg:grid-cols-4 lg:divide-x lg:divide-y-0 xl:-mx-4"> class="grid max-w-sm grid-cols-1 -mt-16 divide-y divide-coolgray-500 isolate gap-y-16 sm:mx-auto lg:-mx-8 lg:mt-0 lg:max-w-none lg:grid-cols-4 lg:divide-x lg:divide-y-0 xl:-mx-4">
<div class="px-8 pt-16 lg:pt-0"> <div class="px-8 pt-16 lg:pt-0">
<h3 id="tier-basic" class="text-base font-semibold leading-7 text-white">Unlimited Trial</h3> <h3 id="tier-trial" class="text-base font-semibold leading-7 text-white">Unlimited Trial</h3>
<p class="flex items-baseline mt-6 gap-x-1"> <p class="flex items-baseline mt-6 gap-x-1">
<span x-show="selected === 'monthly'" x-cloak> <span x-show="selected === 'monthly'" x-cloak>
<span class="text-5xl font-bold tracking-tight text-white">Free</span> <span class="text-4xl font-bold tracking-tight text-white">Free</span>
</span> </span>
<span x-show="selected === 'yearly'" x-cloak> <span x-show="selected === 'yearly'" x-cloak>
<span class="text-5xl font-bold tracking-tight text-white">Still Free </span> <span class="text-4xl font-bold tracking-tight text-white">Still Free </span>
</span> </span>
</p> </p>
<a href="https://github.com/coollabsio/coolify" aria-describedby="tier-basic" class="buyme">Get <span x-show="selected === 'yearly'" x-cloak class="text-warning">(save $?)</span>
<a href="https://github.com/coollabsio/coolify" aria-describedby="tier-trial" class="buyme">Get
Started</a> Started</a>
<p class="pb-6 mt-10 text-sm leading-6 text-white">Start self-hosting without limits with our OSS <p class="mt-10 text-sm leading-6 text-white h-[6.5rem]">Start self-hosting without limits with our
OSS
version.</p> version.</p>
<ul role="list" class="space-y-3 text-sm leading-6 "> <ul role="list" class="space-y-3 text-sm leading-6 ">
<li class="flex gap-x-3"> <li class="flex gap-x-3">
@ -61,7 +62,7 @@ class="grid max-w-sm grid-cols-1 -mt-16 divide-y divide-coolgray-500 isolate gap
d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z"
clip-rule="evenodd" /> clip-rule="evenodd" />
</svg> </svg>
You need to take care of everything Managed by you
</li> </li>
<li class="flex gap-x-3"> <li class="flex gap-x-3">
<svg class="flex-none w-5 h-6 text-warning" viewBox="0 0 20 20" fill="currentColor" <svg class="flex-none w-5 h-6 text-warning" viewBox="0 0 20 20" fill="currentColor"
@ -70,7 +71,7 @@ class="grid max-w-sm grid-cols-1 -mt-16 divide-y divide-coolgray-500 isolate gap
d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z"
clip-rule="evenodd" /> clip-rule="evenodd" />
</svg> </svg>
If you brave enough, you can do it! If you brave enough
</li> </li>
<li class="flex gap-x-3"> <li class="flex gap-x-3">
<svg class="flex-none w-5 h-6 text-warning" viewBox="0 0 20 20" fill="currentColor" <svg class="flex-none w-5 h-6 text-warning" viewBox="0 0 20 20" fill="currentColor"
@ -81,22 +82,42 @@ class="grid max-w-sm grid-cols-1 -mt-16 divide-y divide-coolgray-500 isolate gap
</svg> </svg>
Community Support Community Support
</li> </li>
<li class="flex font-bold text-white gap-x-3">
<svg width="512" height="512" class="flex-none w-5 h-6 text-green-600"
viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"
stroke-width="2">
<path
d="M4 13a8 8 0 0 1 7 7a6 6 0 0 0 3-5a9 9 0 0 0 6-8a3 3 0 0 0-3-3a9 9 0 0 0-8 6a6 6 0 0 0-5 3" />
<path d="M7 14a6 6 0 0 0-3 6a6 6 0 0 0 6-3m4-8a1 1 0 1 0 2 0a1 1 0 1 0-2 0" />
</g>
</svg>
+ All upcoming features
</li>
</ul> </ul>
</div> </div>
<div class="pt-16 lg:px-8 lg:pt-0 xl:px-14"> <div class="pt-16 lg:px-8 lg:pt-0 xl:px-14">
<h3 id="tier-basic" class="text-base font-semibold leading-7 text-white">Basic</h3> <h3 id="tier-basic" class="text-base font-semibold leading-7 text-white">Basic</h3>
<p class="flex items-baseline mt-6 gap-x-1"> <p class="flex items-baseline mt-6 gap-x-1">
<span x-show="selected === 'monthly'" x-cloak> <span x-show="selected === 'monthly'" x-cloak>
<span class="text-5xl font-bold tracking-tight text-white">$15</span> <span class="text-4xl font-bold tracking-tight text-white">$5</span>
<span class="text-sm font-semibold leading-6 ">/monthly</span> <span class="text-sm font-semibold leading-6 ">/monthly</span>
</span> </span>
<span x-show="selected === 'yearly'" x-cloak> <span x-show="selected === 'yearly'" x-cloak>
<span class="text-5xl font-bold tracking-tight text-white">$144</span> <span class="text-4xl font-bold tracking-tight text-white">$54</span>
<span class="text-sm font-semibold leading-6 ">/yearly</span> <span class="text-sm font-semibold leading-6 ">/yearly</span>
</span> </span>
</p> </p>
<a href="{{ getSubscriptionLink(1) }}" aria-describedby="tier-basic" class="buyme">Subscribe</a> <span x-show="selected === 'yearly'" x-cloak class="text-warning">(save $6)</span>
<p class="pb-6 mt-10 text-sm leading-6 text-white">Start self-hosting in the cloud with a single
<a x-show="selected === 'monthly'" x-cloak aria-describedby="tier-basic" class="buyme"
href="{{ getSubscriptionLink('monthly') }}">Subscribe</a>
<a x-show="selected === 'yearly'" x-cloak aria-describedby="tier-basic" class="buyme"
href="{{ getSubscriptionLink('yearly') }}">Subscribe</a>
<p class="mt-10 text-sm leading-6 text-white h-[6.5rem]">Start self-hosting in
the cloud
with a
single
server. server.
</p> </p>
<ul role="list" class="space-y-3 text-sm leading-6 "> <ul role="list" class="space-y-3 text-sm leading-6 ">
@ -125,7 +146,7 @@ class="grid max-w-sm grid-cols-1 -mt-16 divide-y divide-coolgray-500 isolate gap
d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z"
clip-rule="evenodd" /> clip-rule="evenodd" />
</svg> </svg>
30 days of backups Bring your own S3
</li> </li>
<li class="flex gap-x-3"> <li class="flex gap-x-3">
<svg class="flex-none w-5 h-6 text-warning" viewBox="0 0 20 20" fill="currentColor" <svg class="flex-none w-5 h-6 text-warning" viewBox="0 0 20 20" fill="currentColor"
@ -136,23 +157,39 @@ class="grid max-w-sm grid-cols-1 -mt-16 divide-y divide-coolgray-500 isolate gap
</svg> </svg>
Basic Support Basic Support
</li> </li>
<li class="flex font-bold text-white gap-x-3">
<svg width="512" height="512" class="flex-none w-5 h-6 text-green-600"
viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="currentColor" stroke-linecap="round"
stroke-linejoin="round" stroke-width="2">
<path
d="M4 13a8 8 0 0 1 7 7a6 6 0 0 0 3-5a9 9 0 0 0 6-8a3 3 0 0 0-3-3a9 9 0 0 0-8 6a6 6 0 0 0-5 3" />
<path d="M7 14a6 6 0 0 0-3 6a6 6 0 0 0 6-3m4-8a1 1 0 1 0 2 0a1 1 0 1 0-2 0" />
</g>
</svg>
+ All upcoming features
</li>
</ul> </ul>
</div> </div>
<div class="pt-16 lg:px-8 lg:pt-0 xl:px-14"> <div class="pt-16 lg:px-8 lg:pt-0 xl:px-14">
<h3 id="tier-essential" class="text-base font-semibold leading-7 text-white">Essential</h3> <h3 id="tier-essential" class="text-base font-semibold leading-7 text-white">Essential</h3>
<p class="flex items-baseline mt-6 gap-x-1"> <p class="flex items-baseline mt-6 gap-x-1">
<span x-show="selected === 'monthly'" x-cloak> <span x-show="selected === 'monthly'" x-cloak>
<span class="text-5xl font-bold tracking-tight text-white">$30</span> <span class="text-4xl font-bold tracking-tight text-white">$29</span>
<span class="text-sm font-semibold leading-6 ">/monthly</span> <span class="text-sm font-semibold leading-6 ">/monthly</span>
</span> </span>
<span x-show="selected === 'yearly'" x-cloak> <span x-show="selected === 'yearly'" x-cloak>
<span class="text-5xl font-bold tracking-tight text-white">$288</span> <span class="text-4xl font-bold tracking-tight text-white">$319</span>
<span class="text-sm font-semibold leading-6 ">/yearly</span> <span class="text-sm font-semibold leading-6 ">/yearly</span>
</span> </span>
</p> </p>
<a href="{{ getSubscriptionLink(2) }}" aria-describedby="tier-essential" <span x-show="selected === 'yearly'" x-cloak class="text-warning">(save $29)</span>
class="buyme">Subscribe</a> <a x-show="selected === 'monthly'" x-cloak aria-describedby="tier-essential" class="buyme"
<p class="mt-10 text-sm leading-6 text-white">Scale your business or self-hosting environment.</p> href="{{ getSubscriptionLink('monthly') }}">Subscribe</a>
<a x-show="selected === 'yearly'" x-cloak aria-describedby="tier-essential" class="buyme"
href="{{ getSubscriptionLink('yearly') }}">Subscribe</a>
<p class="h-20 mt-10 text-sm leading-6 text-white">Scale your business or self-hosting environment.
</p>
<ul role="list" class="mt-6 space-y-3 text-sm leading-6 "> <ul role="list" class="mt-6 space-y-3 text-sm leading-6 ">
<li class="flex gap-x-3"> <li class="flex gap-x-3">
<svg class="flex-none w-5 h-6 text-warning" viewBox="0 0 20 20" fill="currentColor" <svg class="flex-none w-5 h-6 text-warning" viewBox="0 0 20 20" fill="currentColor"
@ -179,7 +216,7 @@ class="buyme">Subscribe</a>
d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z"
clip-rule="evenodd" /> clip-rule="evenodd" />
</svg> </svg>
30 days of backups Provided (optional) S3
</li> </li>
<li class="flex gap-x-3"> <li class="flex gap-x-3">
<svg class="flex-none w-5 h-6 text-warning" viewBox="0 0 20 20" fill="currentColor" <svg class="flex-none w-5 h-6 text-warning" viewBox="0 0 20 20" fill="currentColor"
@ -190,24 +227,38 @@ class="buyme">Subscribe</a>
</svg> </svg>
Basic Support Basic Support
</li> </li>
<li class="flex font-bold text-white gap-x-3">
<svg width="512" height="512" class="flex-none w-5 h-6 text-green-600"
viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="currentColor" stroke-linecap="round"
stroke-linejoin="round" stroke-width="2">
<path
d="M4 13a8 8 0 0 1 7 7a6 6 0 0 0 3-5a9 9 0 0 0 6-8a3 3 0 0 0-3-3a9 9 0 0 0-8 6a6 6 0 0 0-5 3" />
<path d="M7 14a6 6 0 0 0-3 6a6 6 0 0 0 6-3m4-8a1 1 0 1 0 2 0a1 1 0 1 0-2 0" />
</g>
</svg>
+ All upcoming features
</li>
</ul> </ul>
</div> </div>
<div class="pt-16 lg:px-8 lg:pt-0 xl:px-14"> <div class="pt-16 lg:px-8 lg:pt-0 xl:px-14">
<h3 id="tier-growth" class="text-base font-semibold leading-7 text-white">Growth</h3> <h3 id="tier-growth" class="text-base font-semibold leading-7 text-white">Growth</h3>
<p class="flex items-baseline mt-6 gap-x-1"> <p class="flex items-baseline mt-6 gap-x-1">
<span x-show="selected === 'monthly'" x-cloak> <span x-show="selected === 'monthly'" x-cloak>
<span class="text-5xl font-bold tracking-tight text-white">$60</span> <span class="text-4xl font-bold tracking-tight text-white">$49</span>
<span class="text-sm font-semibold leading-6 ">/monthly</span> <span class="text-sm font-semibold leading-6 ">/monthly</span>
</span> </span>
<span x-show="selected === 'yearly'" x-cloak> <span x-show="selected === 'yearly'" x-cloak>
<span class="text-5xl font-bold tracking-tight text-white">$576</span> <span class="text-4xl font-bold tracking-tight text-white">$539</span>
<span class="text-sm font-semibold leading-6 ">/yearly</span> <span class="text-sm font-semibold leading-6 ">/yearly</span>
</span> </span>
</p> </p>
<span x-show="selected === 'yearly'" x-cloak class="text-warning">(save $69)</span>
<a href="{{ getSubscriptionLink(3) }}" aria-describedby="tier-growth" <a x-show="selected === 'monthly'" x-cloak aria-describedby="tier-growth" class="buyme"
class="buyme">Subscribe</a> href="{{ getSubscriptionLink('monthly') }}">Subscribe</a>
<p class="mt-10 text-sm leading-6 text-white">Deploy complex infrastuctures and <a x-show="selected === 'yearly'" x-cloak aria-describedby="tier-growth" class="buyme"
href="{{ getSubscriptionLink('yearly') }}">Subscribe</a>
<p class="h-20 mt-10 text-sm leading-6 text-white">Deploy complex infrastuctures and
manage them easily in one place.</p> manage them easily in one place.</p>
<ul role="list" class="mt-6 space-y-3 text-sm leading-6 "> <ul role="list" class="mt-6 space-y-3 text-sm leading-6 ">
<li class="flex gap-x-3"> <li class="flex gap-x-3">
@ -235,7 +286,7 @@ class="buyme">Subscribe</a>
d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z"
clip-rule="evenodd" /> clip-rule="evenodd" />
</svg> </svg>
30 days of backups Provided (optional) S3
</li> </li>
<li class="flex font-bold text-white gap-x-3"> <li class="flex font-bold text-white gap-x-3">
<svg class="flex-none w-5 h-6 text-warning" viewBox="0 0 20 20" fill="currentColor" <svg class="flex-none w-5 h-6 text-warning" viewBox="0 0 20 20" fill="currentColor"
@ -246,6 +297,18 @@ class="buyme">Subscribe</a>
</svg> </svg>
Priority Support Priority Support
</li> </li>
<li class="flex font-bold text-white gap-x-3">
<svg width="512" height="512" class="flex-none w-5 h-6 text-green-600"
viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<g fill="none" stroke="currentColor" stroke-linecap="round"
stroke-linejoin="round" stroke-width="2">
<path
d="M4 13a8 8 0 0 1 7 7a6 6 0 0 0 3-5a9 9 0 0 0 6-8a3 3 0 0 0-3-3a9 9 0 0 0-8 6a6 6 0 0 0-5 3" />
<path d="M7 14a6 6 0 0 0-3 6a6 6 0 0 0 6-3m4-8a1 1 0 1 0 2 0a1 1 0 1 0-2 0" />
</g>
</svg>
+ All upcoming features
</li>
</ul> </ul>
</div> </div>
</div> </div>

View File

@ -3,7 +3,7 @@
<h1>Server</h1> <h1>Server</h1>
<livewire:server.proxy.status :server="$server" /> <livewire:server.proxy.status :server="$server" />
</div> </div>
<div class="pt-2 pb-10 ">{{ data_get($server, 'name') }}</div> <div class="subtitle ">{{ data_get($server, 'name') }}</div>
<nav class="navbar-main"> <nav class="navbar-main">
<a class="{{ request()->routeIs('server.show') ? 'text-white' : '' }}" <a class="{{ request()->routeIs('server.show') ? 'text-white' : '' }}"
href="{{ route('server.show', [ href="{{ route('server.show', [

View File

@ -1,6 +1,6 @@
<div class="pb-5"> <div class="pb-5">
<h1>Settings</h1> <h1>Settings</h1>
<div class="pt-2 pb-10">Instance wide settings for Coolify.</div> <div class="subtitle">Instance wide settings for Coolify.</div>
<nav class="navbar-main"> <nav class="navbar-main">
<a class="{{ request()->routeIs('settings.configuration') ? 'text-white' : '' }}" <a class="{{ request()->routeIs('settings.configuration') ? 'text-white' : '' }}"
href="{{ route('settings.configuration') }}"> href="{{ route('settings.configuration') }}">

View File

@ -3,8 +3,8 @@
Use the magic Use the magic
bar (press <span class="kbd-custom">/</span>) to create a new one or bar (press <span class="kbd-custom">/</span>) to create a new one or
<a href="{{ $link }}" class="underline text-warning"> <a href="{{ $link }}" class="underline text-warning">
click here click here.
</a>. </a>
@else @else
Use the magic Use the magic
bar (press <span class="kbd-custom">/</span>) to create a new one. bar (press <span class="kbd-custom">/</span>) to create a new one.

View File

@ -1,6 +1,6 @@
<x-layout> <x-layout>
<h1>Dashboard</h1> <h1>Dashboard</h1>
<div class="pt-2 pb-10">Something <span class="text-warning">(more)</span> useful will be here.</div> <div class="subtitle">Something <span class="text-warning">(more)</span> useful will be here.</div>
<div class="w-full rounded stats stats-vertical lg:stats-horizontal"> <div class="w-full rounded stats stats-vertical lg:stats-horizontal">
<div class="stat"> <div class="stat">
<div class="stat-title">Servers</div> <div class="stat-title">Servers</div>

View File

@ -1,6 +1,6 @@
<x-layout> <x-layout>
<h1>Destinations</h1> <h1>Destinations</h1>
<div class="pt-2 pb-10 ">All Destinations</div> <div class="subtitle ">All Destinations</div>
<div class="grid gap-2 lg:grid-cols-2"> <div class="grid gap-2 lg:grid-cols-2">
@forelse ($destinations as $destination) @forelse ($destinations as $destination)
@if ($destination->getMorphClass() === 'App\Models\StandaloneDocker') @if ($destination->getMorphClass() === 'App\Models\StandaloneDocker')

View File

@ -18,9 +18,9 @@
</div> </div>
@if ($destination->getMorphClass() === 'App\Models\StandaloneDocker') @if ($destination->getMorphClass() === 'App\Models\StandaloneDocker')
<div class="pt-2 pb-10 ">A Docker network in a non-swarm environment</div> <div class="subtitle ">A Docker network in a non-swarm environment</div>
@else @else
<div class="pt-2 pb-10 ">Your swarm docker network. WIP</div> <div class="subtitle ">Your swarm docker network. WIP</div>
@endif @endif
<div class="flex gap-2"> <div class="flex gap-2">
<x-forms.input id="destination.name" label="Name" /> <x-forms.input id="destination.name" label="Name" />

View File

@ -1,6 +1,6 @@
<div> <div>
<h1>Create a new Destination</h1> <h1>Create a new Destination</h1>
<div class="pt-2 pb-10 ">Destinations are used to segregate resources by network.</div> <div class="subtitle ">Destinations are used to segregate resources by network.</div>
<form class="flex flex-col gap-4" wire:submit.prevent='submit'> <form class="flex flex-col gap-4" wire:submit.prevent='submit'>
<div class="flex gap-2"> <div class="flex gap-2">
<x-forms.input id="name" label="Name" required /> <x-forms.input id="name" label="Name" required />

View File

@ -1,6 +1,6 @@
<div> <div>
<h1>Create a new Server</h1> <h1>Create a new Server</h1>
<div class="pt-2 pb-10 ">Servers are the main blocks of your infrastructure.</div> <div class="subtitle ">Servers are the main blocks of your infrastructure.</div>
<form class="flex flex-col gap-2" wire:submit.prevent='submit'> <form class="flex flex-col gap-2" wire:submit.prevent='submit'>
<div class="flex gap-2"> <div class="flex gap-2">
<x-forms.input id="name" label="Name" required /> <x-forms.input id="name" label="Name" required />

View File

@ -44,7 +44,7 @@
@else @else
<div> <div>
<h2>Proxy</h2> <h2>Proxy</h2>
<div class="pt-2 pb-10 ">Select a proxy you would like to use on this server.</div> <div class="subtitle ">Select a proxy you would like to use on this server.</div>
<div class="flex gap-2"> <div class="flex gap-2">
<x-forms.button class="w-32 box" wire:click="select_proxy('{{ ProxyTypes::TRAEFIK_V2 }}')"> <x-forms.button class="w-32 box" wire:click="select_proxy('{{ ProxyTypes::TRAEFIK_V2 }}')">
Traefik Traefik

View File

@ -30,7 +30,7 @@
</x-forms.button> </x-forms.button>
</div> </div>
</div> </div>
<div class="pt-2 pb-10 ">Your Private GitHub App for private repositories.</div> <div class="subtitle ">Your Private GitHub App for private repositories.</div>
@if ($github_app->app_id) @if ($github_app->app_id)
<div class="w-48"> <div class="w-48">
<x-forms.checkbox label="System Wide?" <x-forms.checkbox label="System Wide?"

View File

@ -1,6 +1,6 @@
<div> <div>
<h1>Create a new S3 Storage</h1> <h1>Create a new S3 Storage</h1>
<div class="pt-2 pb-10 ">S3 Storage used to save backups / files</div> <div class="subtitle ">S3 Storage used to save backups / files</div>
<form class="flex flex-col gap-2" wire:submit.prevent='submit'> <form class="flex flex-col gap-2" wire:submit.prevent='submit'>
<div class="flex gap-2"> <div class="flex gap-2">
<x-forms.input label="Name" id="name" /> <x-forms.input label="Name" id="name" />

View File

@ -1,6 +1,6 @@
<x-layout> <x-layout>
<h1>Private Keys</h1> <h1>Private Keys</h1>
<div class="pt-2 pb-10 ">All Private Keys</div> <div class="subtitle ">All Private Keys</div>
<div class="grid gap-2 lg:grid-cols-2"> <div class="grid gap-2 lg:grid-cols-2">
@forelse ($privateKeys as $key) @forelse ($privateKeys as $key)
<a class="text-center hover:no-underline box group" <a class="text-center hover:no-underline box group"

View File

@ -1,5 +1,5 @@
<x-layout> <x-layout>
<h1>Create a new Private Key</h1> <h1>Create a new Private Key</h1>
<div class="pt-2 pb-10 ">Private Keys are used for connection to servers.</div> <div class="subtitle ">Private Keys are used for connection to servers.</div>
<livewire:private-key.create /> <livewire:private-key.create />
</x-layout> </x-layout>

View File

@ -1,8 +1,10 @@
<x-layout> <x-layout>
<h1>Profile</h1> <h1>Profile</h1>
<div class="pt-2 pb-10 ">Your user profile settings.</div> <div class="subtitle ">Your user profile settings.</div>
<livewire:profile.form :request="$request" /> <livewire:profile.form :request="$request" />
<h3 class="py-4">Two-factor Authentication</h3> <h2 class="py-4">Subscription</h2>
<a href="{{ route('team.show') }}">Check in Team Settings</a>
<h2 class="py-4">Two-factor Authentication</h2>
@if (session('status') == 'two-factor-authentication-enabled') @if (session('status') == 'two-factor-authentication-enabled')
<div class="mb-4 font-medium"> <div class="mb-4 font-medium">
Please finish configuring two factor authentication below. Read the QR code or enter the secret key Please finish configuring two factor authentication below. Read the QR code or enter the secret key
@ -17,7 +19,8 @@
<div> <div>
<div>{!! $request->user()->twoFactorQrCodeSvg() !!}</div> <div>{!! $request->user()->twoFactorQrCodeSvg() !!}</div>
<div x-data="{ showCode: false }" class="py-2"> <div x-data="{ showCode: false }" class="py-2">
<x-forms.button x-on:click="showCode = !showCode">Show secret key to manually enter</x-forms.button> <x-forms.button x-on:click="showCode = !showCode">Show secret key to manually
enter</x-forms.button>
<template x-if="showCode"> <template x-if="showCode">
<div class="py-2 ">{!! decrypt($request->user()->two_factor_secret) !!}</div> <div class="py-2 ">{!! decrypt($request->user()->two_factor_secret) !!}</div>
</template> </template>

View File

@ -4,7 +4,7 @@
<x-forms.button class="btn" onclick="newEnvironment.showModal()">+ Add</x-forms.button> <x-forms.button class="btn" onclick="newEnvironment.showModal()">+ Add</x-forms.button>
<livewire:project.add-environment :project="$project" /> <livewire:project.add-environment :project="$project" />
</div> </div>
<div class="pt-2 pb-10 text-xs truncate lg:text-sm">{{ $project->name }}</div> <div class="subtitle text-xs truncate lg:text-sm">{{ $project->name }}</div>
<div class="grid gap-2 lg:grid-cols-2"> <div class="grid gap-2 lg:grid-cols-2">
@forelse ($project->environments as $environment) @forelse ($project->environments as $environment)
<a class="box" href="{{ route('project.resources', [$project->uuid, $environment->name]) }}"> <a class="box" href="{{ route('project.resources', [$project->uuid, $environment->name]) }}">

View File

@ -6,7 +6,7 @@
<livewire:project.add-empty /> <livewire:project.add-empty />
@endif @endif
</div> </div>
<div class="pt-2 pb-10 ">All Projects</div> <div class="subtitle ">All Projects</div>
<div class="grid gap-2 lg:grid-cols-2"> <div class="grid gap-2 lg:grid-cols-2">
@if ($servers === 0) @if ($servers === 0)
<div> <div>

View File

@ -1,6 +1,6 @@
<x-layout> <x-layout>
<h1>Servers</span></h1> <h1>Servers</span></h1>
<div class="pt-2 pb-10 ">All Servers</div> <div class="subtitle ">All Servers</div>
<div class="grid gap-2 lg:grid-cols-2"> <div class="grid gap-2 lg:grid-cols-2">
@forelse ($servers as $server) @forelse ($servers as $server)
<div x-data x-on:click="goto('{{ $server->uuid }}')" @class([ <div x-data x-on:click="goto('{{ $server->uuid }}')" @class([

View File

@ -1,7 +1,7 @@
<x-layout> <x-layout>
@if ($private_keys->count() === 0) @if ($private_keys->count() === 0)
<h1>Create Private Key</h1> <h1>Create Private Key</h1>
<div class="pb-10">You need to create a private key before you can create a server.</div> <div class="subtitle">You need to create a private key before you can create a server.</div>
<livewire:private-key.create from="server" /> <livewire:private-key.create from="server" />
@else @else
<livewire:server.new.by-ip :private_keys="$private_keys" /> <livewire:server.new.by-ip :private_keys="$private_keys" />

View File

@ -1,6 +1,6 @@
<x-layout> <x-layout>
<h1>Sources</h1> <h1>Sources</h1>
<div class="pt-2 pb-10 ">All Sources</div> <div class="subtitle ">All Sources</div>
<div class="grid gap-2 lg:grid-cols-2"> <div class="grid gap-2 lg:grid-cols-2">
@forelse ($sources as $source) @forelse ($sources as $source)
@if ($source->getMorphClass() === 'App\Models\GithubApp') @if ($source->getMorphClass() === 'App\Models\GithubApp')

View File

@ -1,6 +1,6 @@
<x-layout> <x-layout>
<h1>New Source</h1> <h1>New Source</h1>
<div class="pt-2 pb-10 ">Add source providers for your applications.</div> <div class="subtitle ">Add source providers for your applications.</div>
<div x-data="{ activeTab: window.location.hash ? window.location.hash.substring(1) : '' }"> <div x-data="{ activeTab: window.location.hash ? window.location.hash.substring(1) : '' }">
<div class="flex justify-center h-full gap-2 pb-6"> <div class="flex justify-center h-full gap-2 pb-6">
<a class="flex items-center justify-center w-1/2 p-2 transition-colors rounded-none min-h-12 bg-coolgray-200 hover:bg-coollabs-100 hover:text-white hover:no-underline" <a class="flex items-center justify-center w-1/2 p-2 transition-colors rounded-none min-h-12 bg-coolgray-200 hover:bg-coollabs-100 hover:text-white hover:no-underline"

View File

@ -3,7 +3,7 @@
<div class="flex justify-center mx-10"> <div class="flex justify-center mx-10">
<div> <div>
<div class="flex gap-2"> <div class="flex gap-2">
<h3>Subscription</h3> <h2>Subscription</h2>
<livewire:switch-team /> <livewire:switch-team />
</div> </div>
<div class="flex items-center pb-8"> <div class="flex items-center pb-8">

View File

@ -1,5 +1,5 @@
<x-layout> <x-layout>
<h1>New Team</h1> <h1>New Team</h1>
<div class="pt-2 pb-10">Add a new team</div> <div class="subtitle">Add a new team</div>
<livewire:team.create /> <livewire:team.create />
</x-layout> </x-layout>

View File

@ -18,13 +18,16 @@
@else @else
<div class="pb-4">Renews at: {{ getRenewDate() }}</div> <div class="pb-4">Renews at: {{ getRenewDate() }}</div>
@endif @endif
<x-forms.button><a class="text-white" href="{{ getPaymentLink() }}">Update Payment Details</a> <x-forms.button><a class="text-white hover:no-underline" href="{{ getPaymentLink() }}">Update Payment
Details</a>
</x-forms.button> </x-forms.button>
@else @else
<x-forms.button class="mt-4"><a class="text-white" href="{{ route('subscription') }}">Subscribe Now</a> <x-forms.button class="mt-4"><a class="text-white hover:no-underline"
href="{{ route('subscription') }}">Subscribe Now</a>
</x-forms.button> </x-forms.button>
@endif @endif
<x-forms.button><a class="text-white" href="https://app.lemonsqueezy.com/my-orders">Manage My <x-forms.button><a class="text-white hover:no-underline"
href="https://app.lemonsqueezy.com/my-orders">Manage My
Subscription</a> Subscription</a>
</x-forms.button> </x-forms.button>
</div> </div>