mirror of
https://github.com/ershisan99/coolify.git
synced 2025-12-28 04:59:29 +00:00
Compare commits
23 Commits
v4.0.0-bet
...
v4.0.0-bet
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ec1a7aa893 | ||
|
|
62adf2c5dc | ||
|
|
3e4538de98 | ||
|
|
5a7b16ea5f | ||
|
|
aa7bc40f85 | ||
|
|
4fd83dc727 | ||
|
|
0e451f87a9 | ||
|
|
0b0ae55f0b | ||
|
|
40ec3d9753 | ||
|
|
9535c8df29 | ||
|
|
6ca1d36d5d | ||
|
|
f5d16c46cb | ||
|
|
725c3fd547 | ||
|
|
dcfcee1db6 | ||
|
|
9f8c44d96b | ||
|
|
5b74fd34f5 | ||
|
|
5a4c9422b2 | ||
|
|
81b916724e | ||
|
|
9540f60fa2 | ||
|
|
8eb1686125 | ||
|
|
daf3710a5e | ||
|
|
1067f37e4d | ||
|
|
3b3c0b94e5 |
@@ -3,6 +3,7 @@
|
|||||||
namespace App\Console\Commands;
|
namespace App\Console\Commands;
|
||||||
|
|
||||||
use App\Models\Application;
|
use App\Models\Application;
|
||||||
|
use App\Models\Server;
|
||||||
use App\Models\Service;
|
use App\Models\Service;
|
||||||
use App\Models\StandalonePostgresql;
|
use App\Models\StandalonePostgresql;
|
||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
@@ -34,7 +35,7 @@ class ResourcesDelete extends Command
|
|||||||
{
|
{
|
||||||
$resource = select(
|
$resource = select(
|
||||||
'What resource do you want to delete?',
|
'What resource do you want to delete?',
|
||||||
['Application', 'Database', 'Service'],
|
['Application', 'Database', 'Service', 'Server'],
|
||||||
);
|
);
|
||||||
if ($resource === 'Application') {
|
if ($resource === 'Application') {
|
||||||
$this->deleteApplication();
|
$this->deleteApplication();
|
||||||
@@ -42,6 +43,29 @@ class ResourcesDelete extends Command
|
|||||||
$this->deleteDatabase();
|
$this->deleteDatabase();
|
||||||
} elseif ($resource === 'Service') {
|
} elseif ($resource === 'Service') {
|
||||||
$this->deleteService();
|
$this->deleteService();
|
||||||
|
} elseif($resource === 'Server') {
|
||||||
|
$this->deleteServer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private function deleteServer() {
|
||||||
|
$servers = Server::all();
|
||||||
|
if ($servers->count() === 0) {
|
||||||
|
$this->error('There are no applications to delete.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$serversToDelete = multiselect(
|
||||||
|
'What server do you want to delete?',
|
||||||
|
$servers->pluck('id')->sort()->toArray(),
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($serversToDelete as $server) {
|
||||||
|
$toDelete = $servers->where('id', $server)->first();
|
||||||
|
$this->info($toDelete);
|
||||||
|
$confirmed = confirm("Are you sure you want to delete all selected resources?");
|
||||||
|
if (!$confirmed) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$toDelete->delete();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private function deleteApplication()
|
private function deleteApplication()
|
||||||
@@ -53,14 +77,16 @@ class ResourcesDelete extends Command
|
|||||||
}
|
}
|
||||||
$applicationsToDelete = multiselect(
|
$applicationsToDelete = multiselect(
|
||||||
'What application do you want to delete?',
|
'What application do you want to delete?',
|
||||||
$applications->pluck('name')->toArray(),
|
$applications->pluck('name')->sort()->toArray(),
|
||||||
);
|
);
|
||||||
$confirmed = confirm("Are you sure you want to delete all selected resources?");
|
|
||||||
if (!$confirmed) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
foreach ($applicationsToDelete as $application) {
|
foreach ($applicationsToDelete as $application) {
|
||||||
$toDelete = $applications->where('name', $application)->first();
|
$toDelete = $applications->where('name', $application)->first();
|
||||||
|
$this->info($toDelete);
|
||||||
|
$confirmed = confirm("Are you sure you want to delete all selected resources? ");
|
||||||
|
if (!$confirmed) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
$toDelete->delete();
|
$toDelete->delete();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -73,14 +99,16 @@ class ResourcesDelete extends Command
|
|||||||
}
|
}
|
||||||
$databasesToDelete = multiselect(
|
$databasesToDelete = multiselect(
|
||||||
'What database do you want to delete?',
|
'What database do you want to delete?',
|
||||||
$databases->pluck('name')->toArray(),
|
$databases->pluck('name')->sort()->toArray(),
|
||||||
);
|
);
|
||||||
$confirmed = confirm("Are you sure you want to delete all selected resources?");
|
|
||||||
if (!$confirmed) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
foreach ($databasesToDelete as $database) {
|
foreach ($databasesToDelete as $database) {
|
||||||
$toDelete = $databases->where('name', $database)->first();
|
$toDelete = $databases->where('name', $database)->first();
|
||||||
|
$this->info($toDelete);
|
||||||
|
$confirmed = confirm("Are you sure you want to delete all selected resources?");
|
||||||
|
if (!$confirmed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
$toDelete->delete();
|
$toDelete->delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,14 +122,16 @@ class ResourcesDelete extends Command
|
|||||||
}
|
}
|
||||||
$servicesToDelete = multiselect(
|
$servicesToDelete = multiselect(
|
||||||
'What service do you want to delete?',
|
'What service do you want to delete?',
|
||||||
$services->pluck('name')->toArray(),
|
$services->pluck('name')->sort()->toArray(),
|
||||||
);
|
);
|
||||||
$confirmed = confirm("Are you sure you want to delete all selected resources?");
|
|
||||||
if (!$confirmed) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
foreach ($servicesToDelete as $service) {
|
foreach ($servicesToDelete as $service) {
|
||||||
$toDelete = $services->where('name', $service)->first();
|
$toDelete = $services->where('name', $service)->first();
|
||||||
|
$this->info($toDelete);
|
||||||
|
$confirmed = confirm("Are you sure you want to delete all selected resources?");
|
||||||
|
if (!$confirmed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
$toDelete->delete();
|
$toDelete->delete();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,6 +76,9 @@ class General extends Component
|
|||||||
|
|
||||||
];
|
];
|
||||||
|
|
||||||
|
public function updatedApplicationBuildPack(){
|
||||||
|
$this->submit();
|
||||||
|
}
|
||||||
public function instantSave()
|
public function instantSave()
|
||||||
{
|
{
|
||||||
// @TODO: find another way - if possible
|
// @TODO: find another way - if possible
|
||||||
@@ -125,6 +128,12 @@ class General extends Component
|
|||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$this->validate();
|
$this->validate();
|
||||||
|
if (data_get($this->application,'build_pack') === 'dockerimage') {
|
||||||
|
$this->validate([
|
||||||
|
'application.docker_registry_image_name' => 'required',
|
||||||
|
'application.docker_registry_image_tag' => 'required',
|
||||||
|
]);
|
||||||
|
}
|
||||||
if (data_get($this->application, 'fqdn')) {
|
if (data_get($this->application, 'fqdn')) {
|
||||||
$domains = Str::of($this->application->fqdn)->trim()->explode(',')->map(function ($domain) {
|
$domains = Str::of($this->application->fqdn)->trim()->explode(',')->map(function ($domain) {
|
||||||
return Str::of($domain)->trim()->lower();
|
return Str::of($domain)->trim()->lower();
|
||||||
|
|||||||
@@ -72,10 +72,14 @@ class PublicGitRepository extends Component
|
|||||||
public function load_branch()
|
public function load_branch()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$this->branch_found = false;
|
|
||||||
$this->validate([
|
$this->validate([
|
||||||
'repository_url' => 'required|url'
|
'repository_url' => 'required|url'
|
||||||
]);
|
]);
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
return handleError($e, $this);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
$this->branch_found = false;
|
||||||
$this->get_git_source();
|
$this->get_git_source();
|
||||||
$this->get_branch();
|
$this->get_branch();
|
||||||
$this->selected_branch = $this->git_branch;
|
$this->selected_branch = $this->git_branch;
|
||||||
|
|||||||
@@ -61,7 +61,18 @@ class Form extends Component
|
|||||||
$activity = InstallDocker::run($this->server);
|
$activity = InstallDocker::run($this->server);
|
||||||
$this->emit('newMonitorActivity', $activity->id);
|
$this->emit('newMonitorActivity', $activity->id);
|
||||||
}
|
}
|
||||||
|
public function checkLocalhostConnection() {
|
||||||
|
$uptime = $this->server->validateConnection();
|
||||||
|
if ($uptime) {
|
||||||
|
$this->emit('success', 'Server is reachable.');
|
||||||
|
$this->server->settings->is_reachable = true;
|
||||||
|
$this->server->settings->is_usable = true;
|
||||||
|
$this->server->settings->save();
|
||||||
|
} else {
|
||||||
|
$this->emit('error', 'Server is not reachable. Please check your connection and configuration.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
public function validateServer($install = true)
|
public function validateServer($install = true)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
@@ -69,7 +80,7 @@ class Form extends Component
|
|||||||
if ($uptime) {
|
if ($uptime) {
|
||||||
$install && $this->emit('success', 'Server is reachable.');
|
$install && $this->emit('success', 'Server is reachable.');
|
||||||
} else {
|
} else {
|
||||||
$install &&$this->emit('error', 'Server is not reachable. Please check your connection and private key configuration.');
|
$install &&$this->emit('error', 'Server is not reachable. Please check your connection and configuration.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$dockerInstalled = $this->server->validateDockerEngine();
|
$dockerInstalled = $this->server->validateDockerEngine();
|
||||||
@@ -117,6 +128,7 @@ class Form extends Component
|
|||||||
$this->emit('error', 'IP address is already in use by another team.');
|
$this->emit('error', 'IP address is already in use by another team.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
refresh_server_connection($this->server->privateKey);
|
||||||
$this->server->settings->wildcard_domain = $this->wildcard_domain;
|
$this->server->settings->wildcard_domain = $this->wildcard_domain;
|
||||||
$this->server->settings->cleanup_after_percentage = $this->cleanup_after_percentage;
|
$this->server->settings->cleanup_after_percentage = $this->cleanup_after_percentage;
|
||||||
$this->server->settings->save();
|
$this->server->settings->save();
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ class DecideWhatToDoWithUser
|
|||||||
public function handle(Request $request, Closure $next): Response
|
public function handle(Request $request, Closure $next): Response
|
||||||
{
|
{
|
||||||
if (!auth()->user() || !isCloud() || isInstanceAdmin()) {
|
if (!auth()->user() || !isCloud() || isInstanceAdmin()) {
|
||||||
|
if (!isCloud() && showBoarding() && !in_array($request->path(), allowedPathsForBoardingAccounts())) {
|
||||||
|
return redirect('boarding');
|
||||||
|
}
|
||||||
return $next($request);
|
return $next($request);
|
||||||
}
|
}
|
||||||
if (!auth()->user()->hasVerifiedEmail()) {
|
if (!auth()->user()->hasVerifiedEmail()) {
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ class ContainerStatusJob implements ShouldQueue, ShouldBeEncrypted
|
|||||||
public function handle()
|
public function handle()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
// ray("checking server status for {$this->server->name}");
|
ray("checking server status for {$this->server->name}");
|
||||||
// ray()->clearAll();
|
// ray()->clearAll();
|
||||||
$serverUptimeCheckNumber = $this->server->unreachable_count;
|
$serverUptimeCheckNumber = $this->server->unreachable_count;
|
||||||
$serverUptimeCheckNumberMax = 3;
|
$serverUptimeCheckNumberMax = 3;
|
||||||
@@ -53,12 +53,15 @@ class ContainerStatusJob implements ShouldQueue, ShouldBeEncrypted
|
|||||||
if ($serverUptimeCheckNumber >= $serverUptimeCheckNumberMax) {
|
if ($serverUptimeCheckNumber >= $serverUptimeCheckNumberMax) {
|
||||||
if ($this->server->unreachable_email_sent === false) {
|
if ($this->server->unreachable_email_sent === false) {
|
||||||
ray('Server unreachable, sending notification...');
|
ray('Server unreachable, sending notification...');
|
||||||
// $this->server->team->notify(new Unreachable($this->server));
|
$this->server->team->notify(new Unreachable($this->server));
|
||||||
$this->server->update(['unreachable_email_sent' => true]);
|
$this->server->update(['unreachable_email_sent' => true]);
|
||||||
}
|
}
|
||||||
$this->server->settings()->update([
|
$this->server->settings()->update([
|
||||||
'is_reachable' => false,
|
'is_reachable' => false,
|
||||||
]);
|
]);
|
||||||
|
$this->server->update([
|
||||||
|
'unreachable_count' => 0,
|
||||||
|
]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$result = $this->server->validateConnection();
|
$result = $this->server->validateConnection();
|
||||||
@@ -82,7 +85,7 @@ class ContainerStatusJob implements ShouldQueue, ShouldBeEncrypted
|
|||||||
|
|
||||||
if (data_get($this->server, 'unreachable_email_sent') === true) {
|
if (data_get($this->server, 'unreachable_email_sent') === true) {
|
||||||
ray('Server is reachable again, sending notification...');
|
ray('Server is reachable again, sending notification...');
|
||||||
// $this->server->team->notify(new Revived($this->server));
|
$this->server->team->notify(new Revived($this->server));
|
||||||
$this->server->update(['unreachable_email_sent' => false]);
|
$this->server->update(['unreachable_email_sent' => false]);
|
||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ class User extends Authenticatable implements SendsEmail
|
|||||||
$mail->view('emails.email-verification', [
|
$mail->view('emails.email-verification', [
|
||||||
'url' => $url,
|
'url' => $url,
|
||||||
]);
|
]);
|
||||||
$mail->subject('Coolify Cloud: Verify your email.');
|
$mail->subject('Coolify: Verify your email.');
|
||||||
send_user_an_email($mail, $this->email);
|
send_user_an_email($mail, $this->email);
|
||||||
}
|
}
|
||||||
public function sendPasswordResetNotification($token): void
|
public function sendPasswordResetNotification($token): void
|
||||||
@@ -118,6 +118,9 @@ class User extends Authenticatable implements SendsEmail
|
|||||||
public function currentTeam()
|
public function currentTeam()
|
||||||
{
|
{
|
||||||
return Cache::remember('team:' . auth()->user()->id, 3600, function () {
|
return Cache::remember('team:' . auth()->user()->id, 3600, function () {
|
||||||
|
if (is_null(data_get(session('currentTeam'), 'id'))) {
|
||||||
|
return auth()->user()->teams[0];
|
||||||
|
}
|
||||||
return Team::find(session('currentTeam')->id);
|
return Team::find(session('currentTeam')->id);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ return [
|
|||||||
|
|
||||||
// The release version of your application
|
// The release version of your application
|
||||||
// Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD'))
|
// Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD'))
|
||||||
'release' => '4.0.0-beta.74',
|
'release' => '4.0.0-beta.78',
|
||||||
// When left empty or `null` the Laravel environment will be used
|
// When left empty or `null` the Laravel environment will be used
|
||||||
'environment' => config('app.env'),
|
'environment' => config('app.env'),
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
return '4.0.0-beta.74';
|
return '4.0.0-beta.78';
|
||||||
|
|||||||
@@ -27,4 +27,4 @@ RUN mkdir -p ~/.ssh
|
|||||||
RUN echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFuGmoeGq/pojrsyP1pszcNVuZx9iFkCELtxrh31QJ68 coolify@coolify-instance" >> ~/.ssh/authorized_keys
|
RUN echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFuGmoeGq/pojrsyP1pszcNVuZx9iFkCELtxrh31QJ68 coolify@coolify-instance" >> ~/.ssh/authorized_keys
|
||||||
|
|
||||||
EXPOSE 22
|
EXPOSE 22
|
||||||
CMD ["/usr/sbin/sshd", "-D", "-o", "ListenAddress=0.0.0.0"]
|
CMD ["/usr/sbin/sshd", "-D", "-o", "ListenAddress=0.0.0.0", "-o", "Port=22"]
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
<div class="pb-6">
|
<div class="pb-6">
|
||||||
<h1>Team</h1>
|
<div class="flex items-end gap-2">
|
||||||
|
<h1>Team</h1>
|
||||||
|
<a href="/team/new"><x-forms.button>+ New Team</x-forms.button></a>
|
||||||
|
</div>
|
||||||
<nav class="flex pt-2 pb-10">
|
<nav class="flex pt-2 pb-10">
|
||||||
<ol class="inline-flex items-center">
|
<ol class="inline-flex items-center">
|
||||||
<li>
|
<li>
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
<span>Currently active team: <span
|
<span>Currently active team: <span
|
||||||
class="text-warning">{{ session('currentTeam.name') }}</span></span>
|
class="text-warning">{{ session('currentTeam.name') }}</span></span>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|||||||
@@ -14,9 +14,12 @@
|
|||||||
<span>Your subscription has been activated! Welcome onboard!</span>
|
<span>Your subscription has been activated! Welcome onboard!</span>
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
|
@if ($projects->count() === 0 && $servers->count() === 0)
|
||||||
<h3 class="pb-4">Projects</h3>
|
No resources found. Add your first server / private key <a class="text-white underline" href="{{route('server.create')}}">here</a>.
|
||||||
|
@endif
|
||||||
|
@if ($projects->count() > 0)
|
||||||
|
<h3 class="pb-4">Projects</h3>
|
||||||
|
@endif
|
||||||
@if ($projects->count() === 1)
|
@if ($projects->count() === 1)
|
||||||
<div class="grid grid-cols-1 gap-2">
|
<div class="grid grid-cols-1 gap-2">
|
||||||
@else
|
@else
|
||||||
@@ -24,7 +27,7 @@
|
|||||||
@endif
|
@endif
|
||||||
@foreach ($projects as $project)
|
@foreach ($projects as $project)
|
||||||
<div class="gap-2 border border-transparent cursor-pointer box group" x-data
|
<div class="gap-2 border border-transparent cursor-pointer box group" x-data
|
||||||
x-on:click="gotoProject('{{ $project->uuid }}')">
|
x-on:click="gotoProject('{{ $project->uuid }}','{{ data_get($project, 'environments.0.name', 'production') }}')">
|
||||||
@if (data_get($project, 'environments.0.name'))
|
@if (data_get($project, 'environments.0.name'))
|
||||||
<a class="flex flex-col flex-1 mx-6 hover:no-underline"
|
<a class="flex flex-col flex-1 mx-6 hover:no-underline"
|
||||||
href="{{ route('project.resources', ['project_uuid' => data_get($project, 'uuid'), 'environment_name' => data_get($project, 'environments.0.name', 'production')]) }}">
|
href="{{ route('project.resources', ['project_uuid' => data_get($project, 'uuid'), 'environment_name' => data_get($project, 'environments.0.name', 'production')]) }}">
|
||||||
@@ -58,7 +61,9 @@
|
|||||||
</div>
|
</div>
|
||||||
@endforeach
|
@endforeach
|
||||||
</div>
|
</div>
|
||||||
<h3 class="py-4">Servers</h3>
|
@if ($projects->count() > 0)
|
||||||
|
<h3 class="pb-4">Servers</h3>
|
||||||
|
@endif
|
||||||
@if ($servers->count() === 1)
|
@if ($servers->count() === 1)
|
||||||
<div class="grid grid-cols-1 gap-2">
|
<div class="grid grid-cols-1 gap-2">
|
||||||
@else
|
@else
|
||||||
@@ -94,8 +99,8 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
function gotoProject(uuid) {
|
function gotoProject(uuid, environment = 'production') {
|
||||||
window.location.href = '/project/' + uuid;
|
window.location.href = '/project/' + uuid + '/' + environment;
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
{{-- <x-forms.button wire:click='getIptables'>Get IPTABLES</x-forms.button> --}}
|
{{-- <x-forms.button wire:click='getIptables'>Get IPTABLES</x-forms.button> --}}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
@if (!$application->dockerfile)
|
@if (!$application->dockerfile)
|
||||||
<div class="flex flex-col gap-2">
|
<div class="flex flex-col gap-2">
|
||||||
<div class="flex gap-2">
|
<div class="flex gap-2">
|
||||||
<x-forms.select id="application.build_pack" label="Build Pack" required>
|
<x-forms.select wire:model="application.build_pack" label="Build Pack" required>
|
||||||
<option value="nixpacks">Nixpacks</option>
|
<option value="nixpacks">Nixpacks</option>
|
||||||
<option value="dockerfile">Dockerfile</option>
|
<option value="dockerfile">Dockerfile</option>
|
||||||
<option value="dockerimage">Docker Image</option>
|
<option value="dockerimage">Docker Image</option>
|
||||||
@@ -73,8 +73,8 @@
|
|||||||
</div>
|
</div>
|
||||||
@else
|
@else
|
||||||
<div class="flex flex-col gap-2 xl:flex-row">
|
<div class="flex flex-col gap-2 xl:flex-row">
|
||||||
<x-forms.input id="application.docker_registry_image_name" required label="Docker Image" />
|
<x-forms.input id="application.docker_registry_image_name" label="Docker Image" />
|
||||||
<x-forms.input id="application.docker_registry_image_tag" required label="Docker Image Tag" />
|
<x-forms.input id="application.docker_registry_image_tag" label="Docker Image Tag" />
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
<div>
|
<div>
|
||||||
<h1>Create a new Application</h1>
|
<h1>Create a new Application</h1>
|
||||||
<div class="pb-4">Deploy any public Git repositories.</div>
|
<div class="pb-4">Deploy any public Git repositories.</div>
|
||||||
<form class="flex flex-col gap-2" wire:submit.prevent>
|
<form class="flex flex-col gap-2" wire:submit.prevent='load_branch'>
|
||||||
<div class="flex flex-col gap-2">
|
<div class="flex flex-col gap-2">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div class="flex items-end gap-2">
|
<div class="flex items-end gap-2">
|
||||||
<x-forms.input wire:keydown.enter='load_branch' id="repository_url" label="Repository URL"
|
<x-forms.input required id="repository_url" label="Repository URL"
|
||||||
helper="{!! __('repository.url') !!}" />
|
helper="{!! __('repository.url') !!}" />
|
||||||
<x-forms.button wire:click.prevent="load_branch">
|
<x-forms.button type="submit">
|
||||||
Check repository
|
Check repository
|
||||||
</x-forms.button>
|
</x-forms.button>
|
||||||
</div>
|
</div>
|
||||||
@@ -16,10 +16,9 @@
|
|||||||
<div class="flex gap-2 py-2">
|
<div class="flex gap-2 py-2">
|
||||||
<div>Rate Limit</div>
|
<div>Rate Limit</div>
|
||||||
<x-helper
|
<x-helper
|
||||||
helper="Rate limit remaining: {{ $rate_limit_remaining }}<br>Rate limit reset at: {{ $rate_limit_reset }}" />
|
helper="Rate limit remaining: {{ $rate_limit_remaining }}<br>Rate limit reset at: {{ $rate_limit_reset }} UTC" />
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
<h3 class="pt-8 pb-2">Details</h3>
|
|
||||||
<div class="flex flex-col gap-2 pb-6">
|
<div class="flex flex-col gap-2 pb-6">
|
||||||
<div class="flex gap-2">
|
<div class="flex gap-2">
|
||||||
@if ($git_source === 'other')
|
@if ($git_source === 'other')
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
Public Repository
|
Public Repository
|
||||||
</div>
|
</div>
|
||||||
<div class="text-xs group-hover:text-white">
|
<div class="text-xs group-hover:text-white">
|
||||||
You can deploy any kind of public repositories from the supported git servers.
|
You can deploy any kind of public repositories from the supported git providers.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -26,16 +26,23 @@
|
|||||||
Server is reachable and validated.
|
Server is reachable and validated.
|
||||||
@endif
|
@endif
|
||||||
@if ((!$server->settings->is_reachable || !$server->settings->is_usable) && $server->id !== 0)
|
@if ((!$server->settings->is_reachable || !$server->settings->is_usable) && $server->id !== 0)
|
||||||
<x-forms.button class="mt-8 mb-4 font-bold box-without-bg bg-coollabs hover:bg-coollabs-100" wire:click.prevent='validateServer' isHighlighted>
|
<x-forms.button class="mt-8 mb-4 font-bold box-without-bg bg-coollabs hover:bg-coollabs-100"
|
||||||
|
wire:click.prevent='validateServer' isHighlighted>
|
||||||
Validate Server & Install Docker Engine
|
Validate Server & Install Docker Engine
|
||||||
</x-forms.button>
|
</x-forms.button>
|
||||||
@endif
|
@endif
|
||||||
|
@if ((!$server->settings->is_reachable || !$server->settings->is_usable) && $server->id === 0)
|
||||||
|
<x-forms.button class="mt-8 mb-4 font-bold box-without-bg bg-coollabs hover:bg-coollabs-100"
|
||||||
|
wire:click.prevent='checkLocalhostConnection' isHighlighted>
|
||||||
|
Validate Server
|
||||||
|
</x-forms.button>
|
||||||
|
@endif
|
||||||
<div class="flex flex-col gap-2 pt-4">
|
<div class="flex flex-col gap-2 pt-4">
|
||||||
<div class="flex flex-col w-full gap-2 lg:flex-row">
|
<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.name" label="Name" required />
|
||||||
<x-forms.input id="server.description" label="Description" />
|
<x-forms.input id="server.description" label="Description" />
|
||||||
<x-forms.input placeholder="https://example.com" id="wildcard_domain" label="Wildcard Domain"
|
<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>" />
|
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><br>In case you set:<span class='text-helper'>https://example.com</span> your applications will get:<br> <span class='text-helper'>https://randomId.example.com</span>" />
|
||||||
{{-- <x-forms.checkbox disabled type="checkbox" id="server.settings.is_part_of_swarm"
|
{{-- <x-forms.checkbox disabled type="checkbox" id="server.settings.is_part_of_swarm"
|
||||||
label="Is it part of a Swarm cluster?" /> --}}
|
label="Is it part of a Swarm cluster?" /> --}}
|
||||||
</div>
|
</div>
|
||||||
@@ -59,13 +66,13 @@
|
|||||||
helper="Disk cleanup job will be executed if disk usage is more than this number." />
|
helper="Disk cleanup job will be executed if disk usage is more than this number." />
|
||||||
@endif
|
@endif
|
||||||
</form>
|
</form>
|
||||||
<h2 class="pt-4">Danger Zone</h2>
|
@if ($server->id !== 0)
|
||||||
<div class="">Woah. I hope you know what are you doing.</div>
|
<h2 class="pt-4">Danger Zone</h2>
|
||||||
<h4 class="pt-4">Delete Server</h4>
|
<div class="">Woah. I hope you know what are you doing.</div>
|
||||||
<div class="pb-4">This will remove this server from Coolify. Beware! There is no coming
|
<h4 class="pt-4">Delete Server</h4>
|
||||||
back!
|
<div class="pb-4">This will remove this server from Coolify. Beware! There is no coming
|
||||||
</div>
|
back!
|
||||||
@if ($server->id !== 0 || isDev())
|
</div>
|
||||||
<x-forms.button isError isModal modalId="deleteServer">
|
<x-forms.button isError isModal modalId="deleteServer">
|
||||||
Delete
|
Delete
|
||||||
</x-forms.button>
|
</x-forms.button>
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
@else
|
@else
|
||||||
<h3>Invite a new member</h3>
|
<h3>Invite a new member</h3>
|
||||||
@if (isInstanceAdmin())
|
@if (isInstanceAdmin())
|
||||||
<div class="pb-4 text-xs text-warning">You need to configure <a href="/settings/emails"
|
<div class="pb-4 text-xs text-warning">You need to configure (as root team) <a href="/settings#smtp"
|
||||||
class="underline text-warning">Transactional
|
class="underline text-warning">Transactional
|
||||||
Emails</a>
|
Emails</a>
|
||||||
before
|
before
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ Route::get('/verify', function () {
|
|||||||
|
|
||||||
Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
|
Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
|
||||||
$request->fulfill();
|
$request->fulfill();
|
||||||
|
send_internal_notification("User {$request->user()->name} verified their email address.");
|
||||||
return redirect('/');
|
return redirect('/');
|
||||||
})->middleware(['auth'])->name('verify.verify');
|
})->middleware(['auth'])->name('verify.verify');
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
"version": "3.12.36"
|
"version": "3.12.36"
|
||||||
},
|
},
|
||||||
"v4": {
|
"v4": {
|
||||||
"version": "4.0.0-beta.74"
|
"version": "4.0.0-beta.78"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user