commit
f21c12f39b
13
.github/ISSUE_TEMPLATE/BUG_REPORT.yml
vendored
13
.github/ISSUE_TEMPLATE/BUG_REPORT.yml
vendored
@ -1,6 +1,6 @@
|
|||||||
name: Bug report
|
name: Bug report
|
||||||
description: 'Create a new bug report.'
|
description: "Create a new bug report."
|
||||||
title: '[Bug]: '
|
title: "[Bug]: "
|
||||||
body:
|
body:
|
||||||
- type: markdown
|
- type: markdown
|
||||||
attributes:
|
attributes:
|
||||||
@ -35,3 +35,12 @@ body:
|
|||||||
description: Coolify's version (see top of your screen).
|
description: Coolify's version (see top of your screen).
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Cloud?
|
||||||
|
description: "Are you using the cloud version of Coolify?"
|
||||||
|
options:
|
||||||
|
- label: Yes
|
||||||
|
required: false
|
||||||
|
- label: No
|
||||||
|
required: false
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
use App\Jobs\CleanupInstanceStuffsJob;
|
use App\Jobs\CleanupInstanceStuffsJob;
|
||||||
use App\Jobs\ContainerStatusJob;
|
use App\Jobs\ContainerStatusJob;
|
||||||
use App\Jobs\DatabaseBackupJob;
|
use App\Jobs\DatabaseBackupJob;
|
||||||
|
use App\Jobs\DockerCleanupJob;
|
||||||
use App\Jobs\PullCoolifyImageJob;
|
use App\Jobs\PullCoolifyImageJob;
|
||||||
use App\Jobs\PullHelperImageJob;
|
use App\Jobs\PullHelperImageJob;
|
||||||
use App\Jobs\PullSentinelImageJob;
|
use App\Jobs\PullSentinelImageJob;
|
||||||
@ -87,6 +88,7 @@ private function check_resources($schedule)
|
|||||||
}
|
}
|
||||||
foreach ($servers as $server) {
|
foreach ($servers as $server) {
|
||||||
$schedule->job(new ServerStatusJob($server))->everyMinute()->onOneServer();
|
$schedule->job(new ServerStatusJob($server))->everyMinute()->onOneServer();
|
||||||
|
$schedule->job(new DockerCleanupJob($server))->everyTenMinutes()->onOneServer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -732,8 +732,10 @@ private function create_application(Request $request, $type)
|
|||||||
$application->environment_id = $environment->id;
|
$application->environment_id = $environment->id;
|
||||||
$application->save();
|
$application->save();
|
||||||
$application->refresh();
|
$application->refresh();
|
||||||
$application->custom_labels = str(implode('|coolify|', generateLabelsApplication($application)))->replace('|coolify|', "\n");
|
if (! $application->settings->is_container_label_readonly_enabled) {
|
||||||
$application->save();
|
$application->custom_labels = str(implode('|coolify|', generateLabelsApplication($application)))->replace('|coolify|', "\n");
|
||||||
|
$application->save();
|
||||||
|
}
|
||||||
$application->isConfigurationChanged(true);
|
$application->isConfigurationChanged(true);
|
||||||
|
|
||||||
if ($instantDeploy) {
|
if ($instantDeploy) {
|
||||||
@ -826,8 +828,10 @@ private function create_application(Request $request, $type)
|
|||||||
$application->source_id = $githubApp->id;
|
$application->source_id = $githubApp->id;
|
||||||
$application->save();
|
$application->save();
|
||||||
$application->refresh();
|
$application->refresh();
|
||||||
$application->custom_labels = str(implode('|coolify|', generateLabelsApplication($application)))->replace('|coolify|', "\n");
|
if (! $application->settings->is_container_label_readonly_enabled) {
|
||||||
$application->save();
|
$application->custom_labels = str(implode('|coolify|', generateLabelsApplication($application)))->replace('|coolify|', "\n");
|
||||||
|
$application->save();
|
||||||
|
}
|
||||||
$application->isConfigurationChanged(true);
|
$application->isConfigurationChanged(true);
|
||||||
|
|
||||||
if ($instantDeploy) {
|
if ($instantDeploy) {
|
||||||
@ -916,8 +920,10 @@ private function create_application(Request $request, $type)
|
|||||||
$application->environment_id = $environment->id;
|
$application->environment_id = $environment->id;
|
||||||
$application->save();
|
$application->save();
|
||||||
$application->refresh();
|
$application->refresh();
|
||||||
$application->custom_labels = str(implode('|coolify|', generateLabelsApplication($application)))->replace('|coolify|', "\n");
|
if (! $application->settings->is_container_label_readonly_enabled) {
|
||||||
$application->save();
|
$application->custom_labels = str(implode('|coolify|', generateLabelsApplication($application)))->replace('|coolify|', "\n");
|
||||||
|
$application->save();
|
||||||
|
}
|
||||||
$application->isConfigurationChanged(true);
|
$application->isConfigurationChanged(true);
|
||||||
|
|
||||||
if ($instantDeploy) {
|
if ($instantDeploy) {
|
||||||
@ -996,8 +1002,10 @@ private function create_application(Request $request, $type)
|
|||||||
$application->git_branch = 'main';
|
$application->git_branch = 'main';
|
||||||
$application->save();
|
$application->save();
|
||||||
$application->refresh();
|
$application->refresh();
|
||||||
$application->custom_labels = str(implode('|coolify|', generateLabelsApplication($application)))->replace('|coolify|', "\n");
|
if (! $application->settings->is_container_label_readonly_enabled) {
|
||||||
$application->save();
|
$application->custom_labels = str(implode('|coolify|', generateLabelsApplication($application)))->replace('|coolify|', "\n");
|
||||||
|
$application->save();
|
||||||
|
}
|
||||||
$application->isConfigurationChanged(true);
|
$application->isConfigurationChanged(true);
|
||||||
|
|
||||||
if ($instantDeploy) {
|
if ($instantDeploy) {
|
||||||
@ -1052,8 +1060,10 @@ private function create_application(Request $request, $type)
|
|||||||
$application->git_branch = 'main';
|
$application->git_branch = 'main';
|
||||||
$application->save();
|
$application->save();
|
||||||
$application->refresh();
|
$application->refresh();
|
||||||
$application->custom_labels = str(implode('|coolify|', generateLabelsApplication($application)))->replace('|coolify|', "\n");
|
if (! $application->settings->is_container_label_readonly_enabled) {
|
||||||
$application->save();
|
$application->custom_labels = str(implode('|coolify|', generateLabelsApplication($application)))->replace('|coolify|', "\n");
|
||||||
|
$application->save();
|
||||||
|
}
|
||||||
$application->isConfigurationChanged(true);
|
$application->isConfigurationChanged(true);
|
||||||
|
|
||||||
if ($instantDeploy) {
|
if ($instantDeploy) {
|
||||||
@ -1494,8 +1504,10 @@ public function update_by_uuid(Request $request)
|
|||||||
$fqdn = str($fqdn)->replaceEnd(',', '')->trim();
|
$fqdn = str($fqdn)->replaceEnd(',', '')->trim();
|
||||||
$fqdn = str($fqdn)->replaceStart(',', '')->trim();
|
$fqdn = str($fqdn)->replaceStart(',', '')->trim();
|
||||||
$application->fqdn = $fqdn;
|
$application->fqdn = $fqdn;
|
||||||
$customLabels = str(implode('|coolify|', generateLabelsApplication($application)))->replace('|coolify|', "\n");
|
if (! $application->settings->is_container_label_readonly_enabled) {
|
||||||
$application->custom_labels = base64_encode($customLabels);
|
$customLabels = str(implode('|coolify|', generateLabelsApplication($application)))->replace('|coolify|', "\n");
|
||||||
|
$application->custom_labels = base64_encode($customLabels);
|
||||||
|
}
|
||||||
$request->offsetUnset('domains');
|
$request->offsetUnset('domains');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,6 +157,8 @@ class ApplicationDeploymentJob implements ShouldBeEncrypted, ShouldQueue
|
|||||||
|
|
||||||
private ?string $coolify_variables = null;
|
private ?string $coolify_variables = null;
|
||||||
|
|
||||||
|
private bool $preserveRepository = true;
|
||||||
|
|
||||||
public $tries = 1;
|
public $tries = 1;
|
||||||
|
|
||||||
public function __construct(int $application_deployment_queue_id)
|
public function __construct(int $application_deployment_queue_id)
|
||||||
@ -187,6 +189,7 @@ public function __construct(int $application_deployment_queue_id)
|
|||||||
$this->server = $this->mainServer = $this->destination->server;
|
$this->server = $this->mainServer = $this->destination->server;
|
||||||
$this->serverUser = $this->server->user;
|
$this->serverUser = $this->server->user;
|
||||||
$this->is_this_additional_server = $this->application->additional_servers()->wherePivot('server_id', $this->server->id)->count() > 0;
|
$this->is_this_additional_server = $this->application->additional_servers()->wherePivot('server_id', $this->server->id)->count() > 0;
|
||||||
|
$this->preserveRepository = $this->application->settings->is_preserve_repository_enabled;
|
||||||
|
|
||||||
$this->basedir = $this->application->generateBaseDir($this->deployment_uuid);
|
$this->basedir = $this->application->generateBaseDir($this->deployment_uuid);
|
||||||
$this->workdir = "{$this->basedir}".rtrim($this->application->base_directory, '/');
|
$this->workdir = "{$this->basedir}".rtrim($this->application->base_directory, '/');
|
||||||
@ -296,13 +299,13 @@ public function handle(): void
|
|||||||
} else {
|
} else {
|
||||||
$this->write_deployment_configurations();
|
$this->write_deployment_configurations();
|
||||||
}
|
}
|
||||||
$this->execute_remote_command(
|
// $this->execute_remote_command(
|
||||||
[
|
// [
|
||||||
"docker rm -f {$this->deployment_uuid} >/dev/null 2>&1",
|
// "docker rm -f {$this->deployment_uuid} >/dev/null 2>&1",
|
||||||
'hidden' => true,
|
// 'hidden' => true,
|
||||||
'ignore_errors' => true,
|
// 'ignore_errors' => true,
|
||||||
]
|
// ]
|
||||||
);
|
// );
|
||||||
|
|
||||||
// $this->execute_remote_command(
|
// $this->execute_remote_command(
|
||||||
// [
|
// [
|
||||||
@ -517,6 +520,8 @@ private function deploy_docker_compose_buildpack()
|
|||||||
$command .= " --env-file {$this->workdir}/{$this->env_filename}";
|
$command .= " --env-file {$this->workdir}/{$this->env_filename}";
|
||||||
}
|
}
|
||||||
$command .= " --project-name {$this->application->uuid} --project-directory {$this->workdir} -f {$this->workdir}{$this->docker_compose_location} up -d";
|
$command .= " --project-name {$this->application->uuid} --project-directory {$this->workdir} -f {$this->workdir}{$this->docker_compose_location} up -d";
|
||||||
|
ray($command);
|
||||||
|
|
||||||
$this->execute_remote_command(
|
$this->execute_remote_command(
|
||||||
[executeInDocker($this->deployment_uuid, $command), 'hidden' => true],
|
[executeInDocker($this->deployment_uuid, $command), 'hidden' => true],
|
||||||
);
|
);
|
||||||
@ -605,6 +610,28 @@ private function deploy_static_buildpack()
|
|||||||
|
|
||||||
private function write_deployment_configurations()
|
private function write_deployment_configurations()
|
||||||
{
|
{
|
||||||
|
if ($this->preserveRepository) {
|
||||||
|
if ($this->use_build_server) {
|
||||||
|
$this->server = $this->original_server;
|
||||||
|
}
|
||||||
|
if (str($this->configuration_dir)->isNotEmpty()) {
|
||||||
|
ray("docker cp {$this->deployment_uuid}:{$this->workdir} {$this->configuration_dir}");
|
||||||
|
$this->execute_remote_command(
|
||||||
|
[
|
||||||
|
"mkdir -p $this->configuration_dir",
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"rm -rf $this->configuration_dir/{*,.*}",
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"docker cp {$this->deployment_uuid}:{$this->workdir}/. {$this->configuration_dir}",
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if ($this->use_build_server) {
|
||||||
|
$this->server = $this->build_server;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (isset($this->docker_compose_base64)) {
|
if (isset($this->docker_compose_base64)) {
|
||||||
if ($this->use_build_server) {
|
if ($this->use_build_server) {
|
||||||
$this->server = $this->original_server;
|
$this->server = $this->original_server;
|
||||||
@ -1007,7 +1034,7 @@ private function rolling_update()
|
|||||||
if ((bool) $this->application->settings->is_consistent_container_name_enabled) {
|
if ((bool) $this->application->settings->is_consistent_container_name_enabled) {
|
||||||
$this->application_deployment_queue->addLogEntry('Consistent container name feature enabled, rolling update is not supported.');
|
$this->application_deployment_queue->addLogEntry('Consistent container name feature enabled, rolling update is not supported.');
|
||||||
}
|
}
|
||||||
if (isset($this->application->settings->custom_internal_name)) {
|
if (str($this->application->settings->custom_internal_name)->isNotEmpty()) {
|
||||||
$this->application_deployment_queue->addLogEntry('Custom internal name is set, rolling update is not supported.');
|
$this->application_deployment_queue->addLogEntry('Custom internal name is set, rolling update is not supported.');
|
||||||
}
|
}
|
||||||
if ($this->pull_request_id !== 0) {
|
if ($this->pull_request_id !== 0) {
|
||||||
@ -1523,7 +1550,9 @@ private function generate_compose_file()
|
|||||||
$this->application->custom_labels = base64_encode($labels->implode("\n"));
|
$this->application->custom_labels = base64_encode($labels->implode("\n"));
|
||||||
$this->application->save();
|
$this->application->save();
|
||||||
} else {
|
} else {
|
||||||
$labels = collect(generateLabelsApplication($this->application, $this->preview));
|
if (! $this->application->settings->is_container_label_readonly_enabled) {
|
||||||
|
$labels = collect(generateLabelsApplication($this->application, $this->preview));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ($this->pull_request_id !== 0) {
|
if ($this->pull_request_id !== 0) {
|
||||||
$labels = collect(generateLabelsApplication($this->application, $this->preview));
|
$labels = collect(generateLabelsApplication($this->application, $this->preview));
|
||||||
|
@ -12,7 +12,6 @@
|
|||||||
use Illuminate\Queue\InteractsWithQueue;
|
use Illuminate\Queue\InteractsWithQueue;
|
||||||
use Illuminate\Queue\SerializesModels;
|
use Illuminate\Queue\SerializesModels;
|
||||||
use Illuminate\Support\Facades\Log;
|
use Illuminate\Support\Facades\Log;
|
||||||
use RuntimeException;
|
|
||||||
|
|
||||||
class DockerCleanupJob implements ShouldBeEncrypted, ShouldQueue
|
class DockerCleanupJob implements ShouldBeEncrypted, ShouldQueue
|
||||||
{
|
{
|
||||||
@ -20,47 +19,48 @@ class DockerCleanupJob implements ShouldBeEncrypted, ShouldQueue
|
|||||||
|
|
||||||
public $timeout = 300;
|
public $timeout = 300;
|
||||||
|
|
||||||
public ?int $usageBefore = null;
|
public int|string|null $usageBefore = null;
|
||||||
|
|
||||||
public function __construct(public Server $server) {}
|
public function __construct(public Server $server) {}
|
||||||
|
|
||||||
public function handle(): void
|
public function handle(): void
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
$isInprogress = false;
|
// $isInprogress = false;
|
||||||
$this->server->applications()->each(function ($application) use (&$isInprogress) {
|
// $this->server->applications()->each(function ($application) use (&$isInprogress) {
|
||||||
if ($application->isDeploymentInprogress()) {
|
// if ($application->isDeploymentInprogress()) {
|
||||||
$isInprogress = true;
|
// $isInprogress = true;
|
||||||
|
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
// if ($isInprogress) {
|
// if ($isInprogress) {
|
||||||
// throw new RuntimeException('DockerCleanupJob: ApplicationDeploymentQueue is not empty, skipping...');
|
// throw new RuntimeException('DockerCleanupJob: ApplicationDeploymentQueue is not empty, skipping...');
|
||||||
// }
|
// }
|
||||||
if (! $this->server->isFunctional()) {
|
if (! $this->server->isFunctional()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if ($this->server->settings->is_force_cleanup_enabled) {
|
||||||
|
Log::info('DockerCleanupJob force cleanup on '.$this->server->name);
|
||||||
|
CleanupDocker::run(server: $this->server, force: true);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$this->usageBefore = $this->server->getDiskUsage();
|
$this->usageBefore = $this->server->getDiskUsage();
|
||||||
ray('Usage before: '.$this->usageBefore);
|
|
||||||
if ($this->usageBefore >= $this->server->settings->cleanup_after_percentage) {
|
if ($this->usageBefore >= $this->server->settings->cleanup_after_percentage) {
|
||||||
ray('Cleaning up '.$this->server->name);
|
CleanupDocker::run(server: $this->server, force: false);
|
||||||
CleanupDocker::run($this->server);
|
|
||||||
$usageAfter = $this->server->getDiskUsage();
|
$usageAfter = $this->server->getDiskUsage();
|
||||||
if ($usageAfter < $this->usageBefore) {
|
if ($usageAfter < $this->usageBefore) {
|
||||||
$this->server->team?->notify(new DockerCleanup($this->server, 'Saved '.($this->usageBefore - $usageAfter).'% disk space.'));
|
$this->server->team?->notify(new DockerCleanup($this->server, 'Saved '.($this->usageBefore - $usageAfter).'% disk space.'));
|
||||||
// ray('Saved ' . ($this->usageBefore - $usageAfter) . '% disk space on ' . $this->server->name);
|
|
||||||
// send_internal_notification('DockerCleanupJob done: Saved ' . ($this->usageBefore - $usageAfter) . '% disk space on ' . $this->server->name);
|
|
||||||
Log::info('DockerCleanupJob done: Saved '.($this->usageBefore - $usageAfter).'% disk space on '.$this->server->name);
|
Log::info('DockerCleanupJob done: Saved '.($this->usageBefore - $usageAfter).'% disk space on '.$this->server->name);
|
||||||
} else {
|
} else {
|
||||||
Log::info('DockerCleanupJob failed to save disk space on '.$this->server->name);
|
Log::info('DockerCleanupJob failed to save disk space on '.$this->server->name);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ray('No need to clean up '.$this->server->name);
|
|
||||||
Log::info('No need to clean up '.$this->server->name);
|
Log::info('No need to clean up '.$this->server->name);
|
||||||
}
|
}
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
// send_internal_notification('DockerCleanupJob failed with: '.$e->getMessage());
|
|
||||||
ray($e->getMessage());
|
ray($e->getMessage());
|
||||||
throw $e;
|
throw $e;
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
namespace App\Jobs;
|
namespace App\Jobs;
|
||||||
|
|
||||||
use App\Models\Server;
|
use App\Models\Server;
|
||||||
use App\Notifications\Server\HighDiskUsage;
|
|
||||||
use Illuminate\Bus\Queueable;
|
use Illuminate\Bus\Queueable;
|
||||||
use Illuminate\Contracts\Queue\ShouldBeEncrypted;
|
use Illuminate\Contracts\Queue\ShouldBeEncrypted;
|
||||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
@ -44,7 +43,6 @@ public function handle()
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
if ($this->server->isFunctional()) {
|
if ($this->server->isFunctional()) {
|
||||||
$this->cleanup(notify: false);
|
|
||||||
$this->remove_unnecessary_coolify_yaml();
|
$this->remove_unnecessary_coolify_yaml();
|
||||||
if ($this->server->isSentinelEnabled()) {
|
if ($this->server->isSentinelEnabled()) {
|
||||||
$this->server->checkSentinel();
|
$this->server->checkSentinel();
|
||||||
@ -56,45 +54,7 @@ public function handle()
|
|||||||
|
|
||||||
return handleError($e);
|
return handleError($e);
|
||||||
}
|
}
|
||||||
try {
|
|
||||||
// $this->check_docker_engine();
|
|
||||||
} catch (\Throwable $e) {
|
|
||||||
// Do nothing
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function check_docker_engine()
|
|
||||||
{
|
|
||||||
$version = instant_remote_process([
|
|
||||||
'docker info',
|
|
||||||
], $this->server, false);
|
|
||||||
if (is_null($version)) {
|
|
||||||
$os = instant_remote_process([
|
|
||||||
'cat /etc/os-release | grep ^ID=',
|
|
||||||
], $this->server, false);
|
|
||||||
$os = str($os)->after('ID=')->trim();
|
|
||||||
if ($os === 'ubuntu') {
|
|
||||||
try {
|
|
||||||
instant_remote_process([
|
|
||||||
'systemctl start docker',
|
|
||||||
], $this->server);
|
|
||||||
} catch (\Throwable $e) {
|
|
||||||
ray($e->getMessage());
|
|
||||||
|
|
||||||
return handleError($e);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
instant_remote_process([
|
|
||||||
'service docker start',
|
|
||||||
], $this->server);
|
|
||||||
} catch (\Throwable $e) {
|
|
||||||
ray($e->getMessage());
|
|
||||||
|
|
||||||
return handleError($e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function remove_unnecessary_coolify_yaml()
|
private function remove_unnecessary_coolify_yaml()
|
||||||
@ -108,28 +68,4 @@ private function remove_unnecessary_coolify_yaml()
|
|||||||
], $this->server, false);
|
], $this->server, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function cleanup(bool $notify = false): void
|
|
||||||
{
|
|
||||||
$this->disk_usage = $this->server->getDiskUsage();
|
|
||||||
if ($this->disk_usage >= $this->server->settings->cleanup_after_percentage) {
|
|
||||||
if ($notify) {
|
|
||||||
if ($this->server->high_disk_usage_notification_sent) {
|
|
||||||
ray('high disk usage notification already sent');
|
|
||||||
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
$this->server->high_disk_usage_notification_sent = true;
|
|
||||||
$this->server->save();
|
|
||||||
$this->server->team?->notify(new HighDiskUsage($this->server, $this->disk_usage, $this->server->settings->cleanup_after_percentage));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
DockerCleanupJob::dispatchSync($this->server);
|
|
||||||
$this->cleanup(notify: true);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$this->server->high_disk_usage_notification_sent = false;
|
|
||||||
$this->server->save();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -84,6 +84,8 @@ class General extends Component
|
|||||||
'application.settings.is_static' => 'boolean|required',
|
'application.settings.is_static' => 'boolean|required',
|
||||||
'application.settings.is_build_server_enabled' => 'boolean|required',
|
'application.settings.is_build_server_enabled' => 'boolean|required',
|
||||||
'application.settings.is_container_label_escape_enabled' => 'boolean|required',
|
'application.settings.is_container_label_escape_enabled' => 'boolean|required',
|
||||||
|
'application.settings.is_container_label_readonly_enabled' => 'boolean|required',
|
||||||
|
'application.settings.is_preserve_repository_enabled' => 'boolean|required',
|
||||||
'application.watch_paths' => 'nullable',
|
'application.watch_paths' => 'nullable',
|
||||||
'application.redirect' => 'string|required',
|
'application.redirect' => 'string|required',
|
||||||
];
|
];
|
||||||
@ -119,6 +121,8 @@ class General extends Component
|
|||||||
'application.settings.is_static' => 'Is static',
|
'application.settings.is_static' => 'Is static',
|
||||||
'application.settings.is_build_server_enabled' => 'Is build server enabled',
|
'application.settings.is_build_server_enabled' => 'Is build server enabled',
|
||||||
'application.settings.is_container_label_escape_enabled' => 'Is container label escape enabled',
|
'application.settings.is_container_label_escape_enabled' => 'Is container label escape enabled',
|
||||||
|
'application.settings.is_container_label_readonly_enabled' => 'Is container label readonly',
|
||||||
|
'application.settings.is_preserve_repository_enabled' => 'Is preserve repository enabled',
|
||||||
'application.watch_paths' => 'Watch paths',
|
'application.watch_paths' => 'Watch paths',
|
||||||
'application.redirect' => 'Redirect',
|
'application.redirect' => 'Redirect',
|
||||||
];
|
];
|
||||||
@ -143,7 +147,7 @@ public function mount()
|
|||||||
$this->ports_exposes = $this->application->ports_exposes;
|
$this->ports_exposes = $this->application->ports_exposes;
|
||||||
$this->is_container_label_escape_enabled = $this->application->settings->is_container_label_escape_enabled;
|
$this->is_container_label_escape_enabled = $this->application->settings->is_container_label_escape_enabled;
|
||||||
$this->customLabels = $this->application->parseContainerLabels();
|
$this->customLabels = $this->application->parseContainerLabels();
|
||||||
if (! $this->customLabels && $this->application->destination->server->proxyType() !== 'NONE') {
|
if (! $this->customLabels && $this->application->destination->server->proxyType() !== 'NONE' && ! $this->application->settings->is_container_label_readonly_enabled) {
|
||||||
$this->customLabels = str(implode('|coolify|', generateLabelsApplication($this->application)))->replace('|coolify|', "\n");
|
$this->customLabels = str(implode('|coolify|', generateLabelsApplication($this->application)))->replace('|coolify|', "\n");
|
||||||
$this->application->custom_labels = base64_encode($this->customLabels);
|
$this->application->custom_labels = base64_encode($this->customLabels);
|
||||||
$this->application->save();
|
$this->application->save();
|
||||||
@ -290,6 +294,9 @@ public function getWildcardDomain()
|
|||||||
|
|
||||||
public function resetDefaultLabels()
|
public function resetDefaultLabels()
|
||||||
{
|
{
|
||||||
|
if ($this->application->settings->is_container_label_readonly_enabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
$this->customLabels = str(implode('|coolify|', generateLabelsApplication($this->application)))->replace('|coolify|', "\n");
|
$this->customLabels = str(implode('|coolify|', generateLabelsApplication($this->application)))->replace('|coolify|', "\n");
|
||||||
$this->ports_exposes = $this->application->ports_exposes;
|
$this->ports_exposes = $this->application->ports_exposes;
|
||||||
$this->is_container_label_escape_enabled = $this->application->settings->is_container_label_escape_enabled;
|
$this->is_container_label_escape_enabled = $this->application->settings->is_container_label_escape_enabled;
|
||||||
@ -350,7 +357,7 @@ public function submit($showToaster = true)
|
|||||||
$this->checkFqdns();
|
$this->checkFqdns();
|
||||||
|
|
||||||
$this->application->save();
|
$this->application->save();
|
||||||
if (! $this->customLabels && $this->application->destination->server->proxyType() !== 'NONE') {
|
if (! $this->customLabels && $this->application->destination->server->proxyType() !== 'NONE' && ! $this->application->settings->is_container_label_readonly_enabled) {
|
||||||
$this->customLabels = str(implode('|coolify|', generateLabelsApplication($this->application)))->replace('|coolify|', "\n");
|
$this->customLabels = str(implode('|coolify|', generateLabelsApplication($this->application)))->replace('|coolify|', "\n");
|
||||||
$this->application->custom_labels = base64_encode($this->customLabels);
|
$this->application->custom_labels = base64_encode($this->customLabels);
|
||||||
$this->application->save();
|
$this->application->save();
|
||||||
|
@ -25,11 +25,11 @@ class PublicGitRepository extends Component
|
|||||||
|
|
||||||
public $query;
|
public $query;
|
||||||
|
|
||||||
public bool $branch_found = false;
|
public bool $branchFound = false;
|
||||||
|
|
||||||
public string $selected_branch = 'main';
|
public string $selectedBranch = 'main';
|
||||||
|
|
||||||
public bool $is_static = false;
|
public bool $isStatic = false;
|
||||||
|
|
||||||
public ?string $publish_directory = null;
|
public ?string $publish_directory = null;
|
||||||
|
|
||||||
@ -62,7 +62,7 @@ class PublicGitRepository extends Component
|
|||||||
protected $rules = [
|
protected $rules = [
|
||||||
'repository_url' => 'required|url',
|
'repository_url' => 'required|url',
|
||||||
'port' => 'required|numeric',
|
'port' => 'required|numeric',
|
||||||
'is_static' => 'required|boolean',
|
'isStatic' => 'required|boolean',
|
||||||
'publish_directory' => 'nullable|string',
|
'publish_directory' => 'nullable|string',
|
||||||
'build_pack' => 'required|string',
|
'build_pack' => 'required|string',
|
||||||
'base_directory' => 'nullable|string',
|
'base_directory' => 'nullable|string',
|
||||||
@ -72,7 +72,7 @@ class PublicGitRepository extends Component
|
|||||||
protected $validationAttributes = [
|
protected $validationAttributes = [
|
||||||
'repository_url' => 'repository',
|
'repository_url' => 'repository',
|
||||||
'port' => 'port',
|
'port' => 'port',
|
||||||
'is_static' => 'static',
|
'isStatic' => 'static',
|
||||||
'publish_directory' => 'publish directory',
|
'publish_directory' => 'publish directory',
|
||||||
'build_pack' => 'build pack',
|
'build_pack' => 'build pack',
|
||||||
'base_directory' => 'base directory',
|
'base_directory' => 'base directory',
|
||||||
@ -106,17 +106,17 @@ public function updatedBuildPack()
|
|||||||
$this->port = 3000;
|
$this->port = 3000;
|
||||||
} elseif ($this->build_pack === 'static') {
|
} elseif ($this->build_pack === 'static') {
|
||||||
$this->show_is_static = false;
|
$this->show_is_static = false;
|
||||||
$this->is_static = false;
|
$this->isStatic = false;
|
||||||
$this->port = 80;
|
$this->port = 80;
|
||||||
} else {
|
} else {
|
||||||
$this->show_is_static = false;
|
$this->show_is_static = false;
|
||||||
$this->is_static = false;
|
$this->isStatic = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function instantSave()
|
public function instantSave()
|
||||||
{
|
{
|
||||||
if ($this->is_static) {
|
if ($this->isStatic) {
|
||||||
$this->port = 80;
|
$this->port = 80;
|
||||||
$this->publish_directory = '/dist';
|
$this->publish_directory = '/dist';
|
||||||
} else {
|
} else {
|
||||||
@ -126,12 +126,7 @@ public function instantSave()
|
|||||||
$this->dispatch('success', 'Application settings updated!');
|
$this->dispatch('success', 'Application settings updated!');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function load_any_git()
|
public function loadBranch()
|
||||||
{
|
|
||||||
$this->branch_found = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function load_branch()
|
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
if (str($this->repository_url)->startsWith('git@')) {
|
if (str($this->repository_url)->startsWith('git@')) {
|
||||||
@ -155,15 +150,21 @@ public function load_branch()
|
|||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
$this->branch_found = false;
|
$this->branchFound = false;
|
||||||
$this->get_git_source();
|
$this->getGitSource();
|
||||||
$this->get_branch();
|
$this->getBranch();
|
||||||
$this->selected_branch = $this->git_branch;
|
$this->selectedBranch = $this->git_branch;
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
if (! $this->branch_found && $this->git_branch == 'main') {
|
if ($this->rate_limit_remaining == 0) {
|
||||||
|
$this->selectedBranch = $this->git_branch;
|
||||||
|
$this->branchFound = true;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (! $this->branchFound && $this->git_branch == 'main') {
|
||||||
try {
|
try {
|
||||||
$this->git_branch = 'master';
|
$this->git_branch = 'master';
|
||||||
$this->get_branch();
|
$this->getBranch();
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
return handleError($e, $this);
|
return handleError($e, $this);
|
||||||
}
|
}
|
||||||
@ -173,13 +174,16 @@ public function load_branch()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function get_git_source()
|
private function getGitSource()
|
||||||
{
|
{
|
||||||
$this->repository_url_parsed = Url::fromString($this->repository_url);
|
$this->repository_url_parsed = Url::fromString($this->repository_url);
|
||||||
$this->git_host = $this->repository_url_parsed->getHost();
|
$this->git_host = $this->repository_url_parsed->getHost();
|
||||||
$this->git_repository = $this->repository_url_parsed->getSegment(1).'/'.$this->repository_url_parsed->getSegment(2);
|
$this->git_repository = $this->repository_url_parsed->getSegment(1).'/'.$this->repository_url_parsed->getSegment(2);
|
||||||
$this->git_branch = $this->repository_url_parsed->getSegment(4) ?? 'main';
|
if ($this->repository_url_parsed->getSegment(3) === 'tree') {
|
||||||
|
$this->git_branch = str($this->repository_url_parsed->getPath())->after('tree/')->value();
|
||||||
|
} else {
|
||||||
|
$this->git_branch = 'main';
|
||||||
|
}
|
||||||
if ($this->git_host == 'github.com') {
|
if ($this->git_host == 'github.com') {
|
||||||
$this->git_source = GithubApp::where('name', 'Public GitHub')->first();
|
$this->git_source = GithubApp::where('name', 'Public GitHub')->first();
|
||||||
|
|
||||||
@ -189,17 +193,17 @@ private function get_git_source()
|
|||||||
$this->git_source = 'other';
|
$this->git_source = 'other';
|
||||||
}
|
}
|
||||||
|
|
||||||
private function get_branch()
|
private function getBranch()
|
||||||
{
|
{
|
||||||
if ($this->git_source === 'other') {
|
if ($this->git_source === 'other') {
|
||||||
$this->branch_found = true;
|
$this->branchFound = true;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ($this->git_source->getMorphClass() === 'App\Models\GithubApp') {
|
if ($this->git_source->getMorphClass() === 'App\Models\GithubApp') {
|
||||||
['rate_limit_remaining' => $this->rate_limit_remaining, 'rate_limit_reset' => $this->rate_limit_reset] = githubApi(source: $this->git_source, endpoint: "/repos/{$this->git_repository}/branches/{$this->git_branch}");
|
['rate_limit_remaining' => $this->rate_limit_remaining, 'rate_limit_reset' => $this->rate_limit_reset] = githubApi(source: $this->git_source, endpoint: "/repos/{$this->git_repository}/branches/{$this->git_branch}");
|
||||||
$this->rate_limit_reset = Carbon::parse((int) $this->rate_limit_reset)->format('Y-M-d H:i:s');
|
$this->rate_limit_reset = Carbon::parse((int) $this->rate_limit_reset)->format('Y-M-d H:i:s');
|
||||||
$this->branch_found = true;
|
$this->branchFound = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -287,7 +291,7 @@ public function submit()
|
|||||||
}
|
}
|
||||||
$application = Application::create($application_init);
|
$application = Application::create($application_init);
|
||||||
|
|
||||||
$application->settings->is_static = $this->is_static;
|
$application->settings->is_static = $this->isStatic;
|
||||||
$application->settings->save();
|
$application->settings->save();
|
||||||
|
|
||||||
$fqdn = generateFqdn($destination->server, $application->uuid);
|
$fqdn = generateFqdn($destination->server, $application->uuid);
|
||||||
|
@ -37,6 +37,7 @@ class Form extends Component
|
|||||||
'server.settings.is_swarm_manager' => 'required|boolean',
|
'server.settings.is_swarm_manager' => 'required|boolean',
|
||||||
'server.settings.is_swarm_worker' => 'required|boolean',
|
'server.settings.is_swarm_worker' => 'required|boolean',
|
||||||
'server.settings.is_build_server' => 'required|boolean',
|
'server.settings.is_build_server' => 'required|boolean',
|
||||||
|
'server.settings.is_force_cleanup_enabled' => 'required|boolean',
|
||||||
'server.settings.concurrent_builds' => 'required|integer|min:1',
|
'server.settings.concurrent_builds' => 'required|integer|min:1',
|
||||||
'server.settings.dynamic_timeout' => 'required|integer|min:1',
|
'server.settings.dynamic_timeout' => 'required|integer|min:1',
|
||||||
'server.settings.is_metrics_enabled' => 'required|boolean',
|
'server.settings.is_metrics_enabled' => 'required|boolean',
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
'destination_id' => ['type' => 'integer', 'description' => 'The unique identifier of the destination where the service is running.'],
|
'destination_id' => ['type' => 'integer', 'description' => 'The unique identifier of the destination where the service is running.'],
|
||||||
'connect_to_docker_network' => ['type' => 'boolean', 'description' => 'The flag to connect the service to the predefined Docker network.'],
|
'connect_to_docker_network' => ['type' => 'boolean', 'description' => 'The flag to connect the service to the predefined Docker network.'],
|
||||||
'is_container_label_escape_enabled' => ['type' => 'boolean', 'description' => 'The flag to enable the container label escape.'],
|
'is_container_label_escape_enabled' => ['type' => 'boolean', 'description' => 'The flag to enable the container label escape.'],
|
||||||
|
'is_container_label_readonly_enabled' => ['type' => 'boolean', 'description' => 'The flag to enable the container label readonly.'],
|
||||||
'config_hash' => ['type' => 'string', 'description' => 'The hash of the service configuration.'],
|
'config_hash' => ['type' => 'string', 'description' => 'The hash of the service configuration.'],
|
||||||
'service_type' => ['type' => 'string', 'description' => 'The type of the service.'],
|
'service_type' => ['type' => 'string', 'description' => 'The type of the service.'],
|
||||||
'created_at' => ['type' => 'string', 'description' => 'The date and time when the service was created.'],
|
'created_at' => ['type' => 'string', 'description' => 'The date and time when the service was created.'],
|
||||||
|
@ -48,9 +48,13 @@ function format_docker_command_output_to_json($rawOutput): Collection
|
|||||||
$outputLines = collect($outputLines);
|
$outputLines = collect($outputLines);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $outputLines
|
try {
|
||||||
->reject(fn ($line) => empty($line))
|
return $outputLines
|
||||||
->map(fn ($outputLine) => json_decode($outputLine, true, flags: JSON_THROW_ON_ERROR));
|
->reject(fn ($line) => empty($line))
|
||||||
|
->map(fn ($outputLine) => json_decode($outputLine, true, flags: JSON_THROW_ON_ERROR));
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
return collect([]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function format_docker_labels_to_json(string|array $rawOutput): Collection
|
function format_docker_labels_to_json(string|array $rawOutput): Collection
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
// 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.315',
|
'release' => '4.0.0-beta.316',
|
||||||
// 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.315';
|
return '4.0.0-beta.316';
|
||||||
|
@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('application_settings', function (Blueprint $table) {
|
||||||
|
$table->boolean('is_container_label_readonly_enabled')->default(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('application_settings', function (Blueprint $table) {
|
||||||
|
$table->dropColumn('is_container_label_readonly_enabled');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('application_settings', function (Blueprint $table) {
|
||||||
|
$table->boolean('is_preserve_repository_enabled')->default(false);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('application_settings', function (Blueprint $table) {
|
||||||
|
$table->dropColumn('is_preserve_repository_enabled');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*/
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('server_settings', function (Blueprint $table) {
|
||||||
|
$table->boolean('is_force_cleanup_enabled')->default(false)->after('is_sentinel_enabled');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*/
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('server_settings', function (Blueprint $table) {
|
||||||
|
$table->dropColumn('is_force_cleanup_enabled');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
@ -16,12 +16,13 @@
|
|||||||
<x-forms.checkbox
|
<x-forms.checkbox
|
||||||
helper="Your application will be available only on https if your domain starts with https://..."
|
helper="Your application will be available only on https if your domain starts with https://..."
|
||||||
instantSave id="is_force_https_enabled" label="Force Https" />
|
instantSave id="is_force_https_enabled" label="Force Https" />
|
||||||
<x-forms.checkbox label="Enable gzip compression"
|
<x-forms.checkbox label="Enable Gzip Compression"
|
||||||
helper="You can disable gzip compression if you want. Some services are compressing data by default. In this case, you do not need this."
|
helper="You can disable gzip compression if you want. Some services are compressing data by default. In this case, you do not need this."
|
||||||
instantSave id="is_gzip_enabled" />
|
instantSave id="is_gzip_enabled" />
|
||||||
<x-forms.checkbox helper="Strip Prefix is used to remove prefixes from paths. Like /api/ to /api."
|
<x-forms.checkbox helper="Strip Prefix is used to remove prefixes from paths. Like /api/ to /api."
|
||||||
instantSave id="is_stripprefix_enabled" label="Strip Prefixes" />
|
instantSave id="is_stripprefix_enabled" label="Strip Prefixes" />
|
||||||
@if ($application->build_pack === 'dockercompose')
|
@if ($application->build_pack === 'dockercompose')
|
||||||
|
<h3>Docker Compose</h3>
|
||||||
<x-forms.checkbox instantSave id="application.settings.is_raw_compose_deployment_enabled"
|
<x-forms.checkbox instantSave id="application.settings.is_raw_compose_deployment_enabled"
|
||||||
label="Raw Compose Deployment"
|
label="Raw Compose Deployment"
|
||||||
helper="WARNING: Advanced use cases only. Your docker compose file will be deployed as-is. Nothing is modified by Coolify. You need to configure the proxy parts. More info in the <a class='underline dark:text-white' href='https://coolify.io/docs/knowledge-base/docker/compose#raw-docker-compose-deployment'>documentation.</a>" />
|
helper="WARNING: Advanced use cases only. Your docker compose file will be deployed as-is. Nothing is modified by Coolify. You need to configure the proxy parts. More info in the <a class='underline dark:text-white' href='https://coolify.io/docs/knowledge-base/docker/compose#raw-docker-compose-deployment'>documentation.</a>" />
|
||||||
|
@ -30,13 +30,7 @@
|
|||||||
</x-forms.select>
|
</x-forms.select>
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
@if ($application->could_set_build_commands())
|
|
||||||
<div class="w-64">
|
|
||||||
<x-forms.checkbox instantSave id="application.settings.is_static"
|
|
||||||
label="Is it a static site?"
|
|
||||||
helper="If your application is a static site or the final build assets should be served as a static site, enable this." />
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
@if ($application->build_pack === 'dockercompose')
|
@if ($application->build_pack === 'dockercompose')
|
||||||
@if (
|
@if (
|
||||||
!is_null($parsedServices) &&
|
!is_null($parsedServices) &&
|
||||||
@ -57,6 +51,7 @@
|
|||||||
@endforeach
|
@endforeach
|
||||||
@endif
|
@endif
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
@if ($application->build_pack !== 'dockercompose')
|
@if ($application->build_pack !== 'dockercompose')
|
||||||
@ -129,99 +124,152 @@ class="underline" href="https://coolify.io/docs/knowledge-base/docker/registry"
|
|||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
|
<div class="py-4 border-b dark:border-coolgray-200">
|
||||||
@if ($application->build_pack !== 'dockerimage')
|
<h3>Build</h3>
|
||||||
<h3 class="pt-8">Build</h3>
|
@if ($application->build_pack === 'dockerimage')
|
||||||
@if ($application->build_pack !== 'dockercompose')
|
|
||||||
<div class="max-w-96">
|
|
||||||
<x-forms.checkbox
|
|
||||||
helper="Use a build server to build your application. You can configure your build server in the Server settings. This is experimental. For more info, check the <a href='https://coolify.io/docs/knowledge-base/server/build-server' class='underline' target='_blank'>documentation</a>."
|
|
||||||
instantSave id="application.settings.is_build_server_enabled"
|
|
||||||
label="Use a Build Server? (experimental)" />
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
@if ($application->could_set_build_commands())
|
|
||||||
@if ($application->build_pack === 'nixpacks')
|
|
||||||
<div class="flex flex-col gap-2 xl:flex-row">
|
|
||||||
<x-forms.input placeholder="If you modify this, you probably need to have a nixpacks.toml"
|
|
||||||
id="application.install_command" label="Install Command" />
|
|
||||||
<x-forms.input placeholder="If you modify this, you probably need to have a nixpacks.toml"
|
|
||||||
id="application.build_command" label="Build Command" />
|
|
||||||
<x-forms.input placeholder="If you modify this, you probably need to have a nixpacks.toml"
|
|
||||||
id="application.start_command" label="Start Command" />
|
|
||||||
</div>
|
|
||||||
<div class="pb-4 text-xs">Nixpacks will detect the required configuration automatically.
|
|
||||||
<a class="underline" href="https://coolify.io/docs/resources/introduction">Framework
|
|
||||||
Specific Docs</a>
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
@endif
|
|
||||||
@if ($application->build_pack === 'dockercompose')
|
|
||||||
<div class="flex flex-col gap-2" x-init="$wire.dispatch('loadCompose', true)">
|
|
||||||
<div class="flex gap-2">
|
|
||||||
<x-forms.input x-bind:disabled="initLoadingCompose" placeholder="/"
|
|
||||||
id="application.base_directory" label="Base Directory"
|
|
||||||
helper="Directory to use as root. Useful for monorepos." />
|
|
||||||
<x-forms.input x-bind:disabled="initLoadingCompose" placeholder="/docker-compose.yaml"
|
|
||||||
id="application.docker_compose_location" label="Docker Compose Location"
|
|
||||||
helper="It is calculated together with the Base Directory:<br><span class='dark:text-warning'>{{ Str::start($application->base_directory . $application->docker_compose_location, '/') }}</span>" />
|
|
||||||
</div>
|
|
||||||
<div class="pt-4">The following commands are for advanced use cases. Only modify them if you
|
|
||||||
know what are
|
|
||||||
you doing.</div>
|
|
||||||
<div class="flex gap-2">
|
|
||||||
<x-forms.input placeholder="docker compose build" x-bind:disabled="initLoadingCompose"
|
|
||||||
id="application.docker_compose_custom_build_command"
|
|
||||||
helper="If you use this, you need to specify paths relatively and should use the same compose file in the custom command, otherwise the automatically configured labels / etc won't work.<br><br>So in your case, use: <span class='dark:text-warning'>docker compose -f .{{ Str::start($application->base_directory . $application->docker_compose_location, '/') }} build</span>"
|
|
||||||
label="Custom Build Command" />
|
|
||||||
<x-forms.input placeholder="docker compose up -d" x-bind:disabled="initLoadingCompose"
|
|
||||||
id="application.docker_compose_custom_start_command"
|
|
||||||
helper="If you use this, you need to specify paths relatively and should use the same compose file in the custom command, otherwise the automatically configured labels / etc won't work.<br><br>So in your case, use: <span class='dark:text-warning'>docker compose -f .{{ Str::start($application->base_directory . $application->docker_compose_location, '/') }} up -d</span>"
|
|
||||||
label="Custom Start Command" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@else
|
|
||||||
<div class="flex flex-col gap-2 xl:flex-row">
|
|
||||||
<x-forms.input placeholder="/" id="application.base_directory" label="Base Directory"
|
|
||||||
helper="Directory to use as root. Useful for monorepos." />
|
|
||||||
@if ($application->build_pack === 'dockerfile' && !$application->dockerfile)
|
|
||||||
<x-forms.input placeholder="/Dockerfile" id="application.dockerfile_location"
|
|
||||||
label="Dockerfile Location"
|
|
||||||
helper="It is calculated together with the Base Directory:<br><span class='dark:text-warning'>{{ Str::start($application->base_directory . $application->dockerfile_location, '/') }}</span>" />
|
|
||||||
@endif
|
|
||||||
|
|
||||||
@if ($application->build_pack === 'dockerfile')
|
|
||||||
<x-forms.input id="application.dockerfile_target_build" label="Docker Build Stage Target"
|
|
||||||
helper="Useful if you have multi-staged dockerfile." />
|
|
||||||
@endif
|
|
||||||
@if ($application->could_set_build_commands())
|
|
||||||
@if ($application->settings->is_static)
|
|
||||||
<x-forms.input placeholder="/dist" id="application.publish_directory"
|
|
||||||
label="Publish Directory" required />
|
|
||||||
@else
|
|
||||||
<x-forms.input placeholder="/" id="application.publish_directory"
|
|
||||||
label="Publish Directory" />
|
|
||||||
@endif
|
|
||||||
@endif
|
|
||||||
|
|
||||||
</div>
|
|
||||||
@if ($this->application->is_github_based() && !$this->application->is_public_repository())
|
|
||||||
<div class="pb-4">
|
|
||||||
<x-forms.textarea helper="Gitignore-style rules to filter Git based webhook deployments."
|
|
||||||
placeholder="src/pages/**" id="application.watch_paths" label="Watch Paths" />
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
<x-forms.input
|
<x-forms.input
|
||||||
helper="You can add custom docker run options that will be used when your container is started.<br>Note: Not all options are supported, as they could mess up Coolify's automation and could cause bad experience for users.<br><br>Check the <a class='underline dark:text-white' href='https://coolify.io/docs/knowledge-base/docker/custom-commands'>docs.</a>"
|
helper="You can add custom docker run options that will be used when your container is started.<br>Note: Not all options are supported, as they could mess up Coolify's automation and could cause bad experience for users.<br><br>Check the <a class='underline dark:text-white' href='https://coolify.io/docs/knowledge-base/docker/custom-commands'>docs.</a>"
|
||||||
placeholder="--cap-add SYS_ADMIN --device=/dev/fuse --security-opt apparmor:unconfined --ulimit nofile=1024:1024 --tmpfs /run:rw,noexec,nosuid,size=65536k"
|
placeholder="--cap-add SYS_ADMIN --device=/dev/fuse --security-opt apparmor:unconfined --ulimit nofile=1024:1024 --tmpfs /run:rw,noexec,nosuid,size=65536k"
|
||||||
id="application.custom_docker_run_options" label="Custom Docker Options" />
|
id="application.custom_docker_run_options" label="Custom Docker Options" />
|
||||||
|
@else
|
||||||
|
@if ($application->could_set_build_commands())
|
||||||
|
@if ($application->build_pack === 'nixpacks')
|
||||||
|
<div class="flex flex-col gap-2 xl:flex-row">
|
||||||
|
<x-forms.input helper="If you modify this, you probably need to have a nixpacks.toml"
|
||||||
|
id="application.install_command" label="Install Command" />
|
||||||
|
<x-forms.input helper="If you modify this, you probably need to have a nixpacks.toml"
|
||||||
|
id="application.build_command" label="Build Command" />
|
||||||
|
<x-forms.input helper="If you modify this, you probably need to have a nixpacks.toml"
|
||||||
|
id="application.start_command" label="Start Command" />
|
||||||
|
</div>
|
||||||
|
<div class="pt-1 text-xs">Nixpacks will detect the required configuration
|
||||||
|
automatically.
|
||||||
|
<a class="underline"
|
||||||
|
href="https://coolify.io/docs/resources/applications/index">Framework
|
||||||
|
Specific Docs</a>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
@endif
|
||||||
|
<div x-data="{
|
||||||
|
activeAccordion: '',
|
||||||
|
setActiveAccordion(id) {
|
||||||
|
this.activeAccordion = (this.activeAccordion == id) ? '' : id
|
||||||
|
}
|
||||||
|
}"
|
||||||
|
class="relative w-full mx-auto mt-4 overflow-hidden text-sm font-normal">
|
||||||
|
<div x-data="{ id: $id('accordion') }" class="cursor-pointer">
|
||||||
|
<button @click="setActiveAccordion(id)"
|
||||||
|
class="flex items-center justify-between w-full p-1 text-left select-none hover:dark:text-white hover:bg-white/5"
|
||||||
|
type="button">
|
||||||
|
<h4>Advanced</h4>
|
||||||
|
<svg class="w-4 h-4 duration-200 ease-out"
|
||||||
|
:class="{ 'rotate-180': activeAccordion == id }" viewBox="0 0 24 24"
|
||||||
|
xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor"
|
||||||
|
stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<polyline points="6 9 12 15 18 9"></polyline>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<div x-show="activeAccordion==id" x-collapse x-cloak class="px-2">
|
||||||
|
<div class="flex flex-col gap-2 pt-6 pb-10">
|
||||||
|
@if ($application->build_pack === 'dockercompose')
|
||||||
|
<div class="flex flex-col gap-2" x-init="$wire.dispatch('loadCompose', true)">
|
||||||
|
<div class="flex gap-2">
|
||||||
|
<x-forms.input x-bind:disabled="initLoadingCompose" placeholder="/"
|
||||||
|
id="application.base_directory" label="Base Directory"
|
||||||
|
helper="Directory to use as root. Useful for monorepos." />
|
||||||
|
<x-forms.input x-bind:disabled="initLoadingCompose"
|
||||||
|
placeholder="/docker-compose.yaml"
|
||||||
|
id="application.docker_compose_location"
|
||||||
|
label="Docker Compose Location"
|
||||||
|
helper="It is calculated together with the Base Directory:<br><span class='dark:text-warning'>{{ Str::start($application->base_directory . $application->docker_compose_location, '/') }}</span>" />
|
||||||
|
</div>
|
||||||
|
<div class="w-96">
|
||||||
|
<x-forms.checkbox instantSave
|
||||||
|
id="application.settings.is_preserve_repository_enabled"
|
||||||
|
label="Preserve Repository During Deployment"
|
||||||
|
helper="Git repository (based on the base directory settings) will be copied to the deployment directory." />
|
||||||
|
</div>
|
||||||
|
<div class="pt-4">The following commands are for advanced use cases. Only
|
||||||
|
modify them if you
|
||||||
|
know what are
|
||||||
|
you doing.</div>
|
||||||
|
<div class="flex gap-2">
|
||||||
|
<x-forms.input placeholder="docker compose build"
|
||||||
|
x-bind:disabled="initLoadingCompose"
|
||||||
|
id="application.docker_compose_custom_build_command"
|
||||||
|
helper="If you use this, you need to specify paths relatively and should use the same compose file in the custom command, otherwise the automatically configured labels / etc won't work.<br><br>So in your case, use: <span class='dark:text-warning'>docker compose -f .{{ Str::start($application->base_directory . $application->docker_compose_location, '/') }} build</span>"
|
||||||
|
label="Custom Build Command" />
|
||||||
|
<x-forms.input placeholder="docker compose up -d"
|
||||||
|
x-bind:disabled="initLoadingCompose"
|
||||||
|
id="application.docker_compose_custom_start_command"
|
||||||
|
helper="If you use this, you need to specify paths relatively and should use the same compose file in the custom command, otherwise the automatically configured labels / etc won't work.<br><br>So in your case, use: <span class='dark:text-warning'>docker compose -f .{{ Str::start($application->base_directory . $application->docker_compose_location, '/') }} up -d</span>"
|
||||||
|
label="Custom Start Command" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@else
|
||||||
|
<div class="flex flex-col gap-2 xl:flex-row">
|
||||||
|
<x-forms.input placeholder="/" id="application.base_directory"
|
||||||
|
label="Base Directory"
|
||||||
|
helper="Directory to use as root. Useful for monorepos." />
|
||||||
|
@if ($application->build_pack === 'dockerfile' && !$application->dockerfile)
|
||||||
|
<x-forms.input placeholder="/Dockerfile"
|
||||||
|
id="application.dockerfile_location" label="Dockerfile Location"
|
||||||
|
helper="It is calculated together with the Base Directory:<br><span class='dark:text-warning'>{{ Str::start($application->base_directory . $application->dockerfile_location, '/') }}</span>" />
|
||||||
|
@endif
|
||||||
|
|
||||||
|
@if ($application->build_pack === 'dockerfile')
|
||||||
|
<x-forms.input id="application.dockerfile_target_build"
|
||||||
|
label="Docker Build Stage Target"
|
||||||
|
helper="Useful if you have multi-staged dockerfile." />
|
||||||
|
@endif
|
||||||
|
@if ($application->could_set_build_commands())
|
||||||
|
@if ($application->settings->is_static)
|
||||||
|
<x-forms.input placeholder="/dist"
|
||||||
|
id="application.publish_directory" label="Publish Directory"
|
||||||
|
required />
|
||||||
|
@else
|
||||||
|
<x-forms.input placeholder="/" id="application.publish_directory"
|
||||||
|
label="Publish Directory" />
|
||||||
|
@endif
|
||||||
|
@endif
|
||||||
|
|
||||||
|
</div>
|
||||||
|
@if ($this->application->is_github_based() && !$this->application->is_public_repository())
|
||||||
|
<div class="pb-4">
|
||||||
|
<x-forms.textarea
|
||||||
|
helper="Gitignore-style rules to filter Git based webhook deployments."
|
||||||
|
placeholder="src/pages/**" id="application.watch_paths"
|
||||||
|
label="Watch Paths" />
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
<x-forms.input
|
||||||
|
helper="You can add custom docker run options that will be used when your container is started.<br>Note: Not all options are supported, as they could mess up Coolify's automation and could cause bad experience for users.<br><br>Check the <a class='underline dark:text-white' href='https://coolify.io/docs/knowledge-base/docker/custom-commands'>docs.</a>"
|
||||||
|
placeholder="--cap-add SYS_ADMIN --device=/dev/fuse --security-opt apparmor:unconfined --ulimit nofile=1024:1024 --tmpfs /run:rw,noexec,nosuid,size=65536k"
|
||||||
|
id="application.custom_docker_run_options"
|
||||||
|
label="Custom Docker Options" />
|
||||||
|
|
||||||
|
@if ($application->build_pack !== 'dockercompose')
|
||||||
|
<div class="pt-2 w-96">
|
||||||
|
<x-forms.checkbox
|
||||||
|
helper="Use a build server to build your application. You can configure your build server in the Server settings. This is experimental. For more info, check the <a href='https://coolify.io/docs/knowledge-base/server/build-server' class='underline' target='_blank'>documentation</a>."
|
||||||
|
instantSave id="application.settings.is_build_server_enabled"
|
||||||
|
label="Use a Build Server? (experimental)" />
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
@if ($application->could_set_build_commands())
|
||||||
|
<div class="w-96">
|
||||||
|
<x-forms.checkbox instantSave id="application.settings.is_static"
|
||||||
|
label="Is it a static site?"
|
||||||
|
helper="If your application is a static site or the final build assets should be served as a static site, enable this." />
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@endif
|
@endif
|
||||||
@else
|
</div>
|
||||||
<x-forms.input
|
|
||||||
helper="You can add custom docker run options that will be used when your container is started.<br>Note: Not all options are supported, as they could mess up Coolify's automation and could cause bad experience for users.<br><br>Check the <a class='underline dark:text-white' href='https://coolify.io/docs/knowledge-base/docker/custom-commands'>docs.</a>"
|
|
||||||
placeholder="--cap-add SYS_ADMIN --device=/dev/fuse --security-opt apparmor:unconfined --ulimit nofile=1024:1024 --tmpfs /run:rw,noexec,nosuid,size=65536k"
|
|
||||||
id="application.custom_docker_run_options" label="Custom Docker Options" />
|
|
||||||
@endif
|
|
||||||
@if ($application->build_pack === 'dockercompose')
|
@if ($application->build_pack === 'dockercompose')
|
||||||
<x-forms.button wire:target='initLoadingCompose'
|
<x-forms.button wire:target='initLoadingCompose'
|
||||||
x-on:click="$wire.dispatch('loadCompose', false)">Reload Compose File</x-forms.button>
|
x-on:click="$wire.dispatch('loadCompose', false)">Reload Compose File</x-forms.button>
|
||||||
@ -235,10 +283,13 @@ class="underline" href="https://coolify.io/docs/knowledge-base/docker/registry"
|
|||||||
label="Docker Compose Content" helper="You need to modify the docker compose file."
|
label="Docker Compose Content" helper="You need to modify the docker compose file."
|
||||||
monacoEditorLanguage="yaml" useMonacoEditor />
|
monacoEditorLanguage="yaml" useMonacoEditor />
|
||||||
@endif
|
@endif
|
||||||
<div class="w-72">
|
<div class="w-96">
|
||||||
<x-forms.checkbox label="Escape special characters in labels?"
|
<x-forms.checkbox label="Escape special characters in labels?"
|
||||||
helper="By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$.<br><br>If you want to use env variables inside the labels, turn this off."
|
helper="By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$.<br><br>If you want to use env variables inside the labels, turn this off."
|
||||||
id="application.settings.is_container_label_escape_enabled" instantSave></x-forms.checkbox>
|
id="application.settings.is_container_label_escape_enabled" instantSave></x-forms.checkbox>
|
||||||
|
<x-forms.checkbox label="Readonly labels"
|
||||||
|
helper="If you know what are you doing, you can enable this to edit the labels directly. Coolify won't update labels automatically. <br><br>Be careful, it could break the proxy configuration after you restart the container."
|
||||||
|
id="application.settings.is_container_label_readonly_enabled" instantSave></x-forms.checkbox>
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@ -264,10 +315,13 @@ class="underline" href="https://coolify.io/docs/knowledge-base/docker/registry"
|
|||||||
|
|
||||||
<x-forms.textarea label="Container Labels" rows="15" id="customLabels"
|
<x-forms.textarea label="Container Labels" rows="15" id="customLabels"
|
||||||
monacoEditorLanguage="ini" useMonacoEditor></x-forms.textarea>
|
monacoEditorLanguage="ini" useMonacoEditor></x-forms.textarea>
|
||||||
<div class="w-72">
|
<div class="w-96">
|
||||||
<x-forms.checkbox label="Escape special characters in labels?"
|
<x-forms.checkbox label="Escape special characters in labels?"
|
||||||
helper="By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$.<br><br>If you want to use env variables inside the labels, turn this off."
|
helper="By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$.<br><br>If you want to use env variables inside the labels, turn this off."
|
||||||
id="application.settings.is_container_label_escape_enabled" instantSave></x-forms.checkbox>
|
id="application.settings.is_container_label_escape_enabled" instantSave></x-forms.checkbox>
|
||||||
|
<x-forms.checkbox label="Readonly labels"
|
||||||
|
helper="If you know what are you doing, you can enable this to edit the labels directly. Coolify won't update labels automatically. <br><br>Be careful, it could break the proxy configuration after you restart the container."
|
||||||
|
id="application.settings.is_container_label_readonly_enabled" instantSave></x-forms.checkbox>
|
||||||
</div>
|
</div>
|
||||||
<x-modal-confirmation buttonFullWidth action="resetDefaultLabels"
|
<x-modal-confirmation buttonFullWidth action="resetDefaultLabels"
|
||||||
buttonTitle="Reset to Coolify Generated Labels">
|
buttonTitle="Reset to Coolify Generated Labels">
|
||||||
|
@ -48,8 +48,7 @@ class="loading loading-xs dark:text-warning loading-spinner"></span>
|
|||||||
@if ($current_step === 'repository')
|
@if ($current_step === 'repository')
|
||||||
<h2 class="pb-4">Select a repository</h2>
|
<h2 class="pb-4">Select a repository</h2>
|
||||||
<form class="flex flex-col gap-2 pt-2" wire:submit='submit'>
|
<form class="flex flex-col gap-2 pt-2" wire:submit='submit'>
|
||||||
<x-forms.input id="repository_url" required label="Repository Url (https:// or git@)"
|
<x-forms.input id="repository_url" required label="Repository Url (https:// or git@)" />
|
||||||
helper="{!! __('repository.url') !!}" />
|
|
||||||
<div class="flex gap-2">
|
<div class="flex gap-2">
|
||||||
<x-forms.input id="branch" required label="Branch" />
|
<x-forms.input id="branch" required label="Branch" />
|
||||||
<x-forms.select wire:model.live="build_pack" label="Build Pack" required>
|
<x-forms.select wire:model.live="build_pack" label="Build Pack" required>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<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='load_branch'>
|
<form class="flex flex-col gap-2" wire:submit='loadBranch'>
|
||||||
<div class="flex flex-col gap-2">
|
<div class="flex flex-col gap-2">
|
||||||
<div class="flex flex-col gap-2">
|
<div class="flex flex-col gap-2">
|
||||||
<div class="flex items-end gap-2">
|
<div class="flex items-end gap-2">
|
||||||
@ -11,15 +11,12 @@
|
|||||||
Check repository
|
Check repository
|
||||||
</x-forms.button>
|
</x-forms.button>
|
||||||
</div>
|
</div>
|
||||||
@if (!$branch_found)
|
<div>
|
||||||
<div class="px-2 pt-4">
|
For example application deployments, checkout <a class="underline dark:text-white"
|
||||||
<div>
|
href="https://github.com/coollabsio/coolify-examples/" target="_blank">Coolify
|
||||||
For example application deployments, checkout <a class="underline dark:text-white"
|
Examples</a>.
|
||||||
href="https://github.com/coollabsio/coolify-examples/" target="_blank">Coolify
|
</div>
|
||||||
Examples</a>.
|
@if ($branchFound)
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
@if ($branch_found)
|
|
||||||
@if ($rate_limit_remaining && $rate_limit_reset)
|
@if ($rate_limit_remaining && $rate_limit_reset)
|
||||||
<div class="flex gap-2 py-2">
|
<div class="flex gap-2 py-2">
|
||||||
<div>Rate Limit</div>
|
<div>Rate Limit</div>
|
||||||
@ -42,7 +39,7 @@
|
|||||||
<option value="dockerfile">Dockerfile</option>
|
<option value="dockerfile">Dockerfile</option>
|
||||||
<option value="dockercompose">Docker Compose</option>
|
<option value="dockercompose">Docker Compose</option>
|
||||||
</x-forms.select>
|
</x-forms.select>
|
||||||
@if ($is_static)
|
@if ($isStatic)
|
||||||
<x-forms.input id="publish_directory" label="Publish Directory"
|
<x-forms.input id="publish_directory" label="Publish Directory"
|
||||||
helper="If there is a build process involved (like Svelte, React, Next, etc..), please specify the output directory for the build assets." />
|
helper="If there is a build process involved (like Svelte, React, Next, etc..), please specify the output directory for the build assets." />
|
||||||
@endif
|
@endif
|
||||||
@ -57,10 +54,10 @@
|
|||||||
class='dark:text-warning'>{{ Str::start($base_directory . $docker_compose_location, '/') }}</span>
|
class='dark:text-warning'>{{ Str::start($base_directory . $docker_compose_location, '/') }}</span>
|
||||||
@endif
|
@endif
|
||||||
@if ($show_is_static)
|
@if ($show_is_static)
|
||||||
<x-forms.input type="number" id="port" label="Port" :readonly="$is_static || $build_pack === 'static'"
|
<x-forms.input type="number" id="port" label="Port" :readonly="$isStatic || $build_pack === 'static'"
|
||||||
helper="The port your application listens on." />
|
helper="The port your application listens on." />
|
||||||
<div class="w-52">
|
<div class="w-52">
|
||||||
<x-forms.checkbox instantSave id="is_static" label="Is it a static site?"
|
<x-forms.checkbox instantSave id="isStatic" label="Is it a static site?"
|
||||||
helper="If your application is a static site or the final build assets should be served as a static site, enable this." />
|
helper="If your application is a static site or the final build assets should be served as a static site, enable this." />
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
|
@ -3,11 +3,7 @@
|
|||||||
prevent
|
prevent
|
||||||
name collision. <br>To see the actual volume names, check the Deployable Compose file, or go to Storage
|
name collision. <br>To see the actual volume names, check the Deployable Compose file, or go to Storage
|
||||||
menu.</div>
|
menu.</div>
|
||||||
<div class="pb-2 w-72">
|
|
||||||
<x-forms.checkbox label="Escape special characters in labels?"
|
|
||||||
helper="By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$.<br><br>If you want to use env variables inside the labels, turn this off."
|
|
||||||
id="service.is_container_label_escape_enabled" instantSave></x-forms.checkbox>
|
|
||||||
</div>
|
|
||||||
<div x-cloak x-show="raw" class="font-mono">
|
<div x-cloak x-show="raw" class="font-mono">
|
||||||
<x-forms.textarea allowTab useMonacoEditor monacoEditorLanguage="yaml" rows="20"
|
<x-forms.textarea allowTab useMonacoEditor monacoEditorLanguage="yaml" rows="20"
|
||||||
id="service.docker_compose_raw">
|
id="service.docker_compose_raw">
|
||||||
@ -17,6 +13,11 @@
|
|||||||
<x-forms.textarea rows="20" readonly id="service.docker_compose">
|
<x-forms.textarea rows="20" readonly id="service.docker_compose">
|
||||||
</x-forms.textarea>
|
</x-forms.textarea>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="pt-2 w-72">
|
||||||
|
<x-forms.checkbox label="Escape special characters in labels?"
|
||||||
|
helper="By default, $ (and other chars) is escaped. So if you write $ in the labels, it will be saved as $$.<br><br>If you want to use env variables inside the labels, turn this off."
|
||||||
|
id="service.is_container_label_escape_enabled" instantSave></x-forms.checkbox>
|
||||||
|
</div>
|
||||||
<div class="flex justify-end w-full gap-2 pt-4">
|
<div class="flex justify-end w-full gap-2 pt-4">
|
||||||
<div class="flex items-end gap-2">
|
<div class="flex items-end gap-2">
|
||||||
<div x-cloak x-show="raw">
|
<div x-cloak x-show="raw">
|
||||||
|
@ -136,13 +136,32 @@ class="w-full mt-8 mb-4 font-bold box-without-bg bg-coollabs hover:bg-coollabs-1
|
|||||||
|
|
||||||
@if ($server->isFunctional())
|
@if ($server->isFunctional())
|
||||||
<h3 class="pt-4">Settings</h3>
|
<h3 class="pt-4">Settings</h3>
|
||||||
<div class="flex flex-wrap gap-2 sm:flex-nowrap">
|
<div class="flex flex-col gap-2">
|
||||||
<x-forms.input id="cleanup_after_percentage" label="Disk cleanup threshold (%)" required
|
<div class="flex flex-col flex-wrap gap-2 sm:flex-nowrap">
|
||||||
helper="The disk cleanup task will run when the disk usage exceeds this threshold." />
|
@if ($server->settings->is_force_cleanup_enabled)
|
||||||
<x-forms.input id="server.settings.concurrent_builds" label="Number of concurrent builds" required
|
<div class="w-64">
|
||||||
helper="You can specify the number of simultaneous build processes/deployments that should run concurrently." />
|
<x-forms.checkbox
|
||||||
<x-forms.input id="server.settings.dynamic_timeout" label="Deployment timeout (seconds)" required
|
helper="This will cleanup build caches / unused images / etc every 10 minutes."
|
||||||
helper="You can define the maximum duration for a deployment to run before timing it out." />
|
instantSave id="server.settings.is_force_cleanup_enabled"
|
||||||
|
label="Force Cleanup Docker Engine" />
|
||||||
|
</div>
|
||||||
|
@else
|
||||||
|
<x-forms.input id="cleanup_after_percentage" label="Disk cleanup threshold (%)" required
|
||||||
|
helper="The disk cleanup task will run when the disk usage exceeds this threshold." />
|
||||||
|
<div class="w-64">
|
||||||
|
<x-forms.checkbox
|
||||||
|
helper="This will cleanup build caches / unused images / etc every 10 minutes."
|
||||||
|
instantSave id="server.settings.is_force_cleanup_enabled"
|
||||||
|
label="Force Cleanup Docker Engine" />
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-wrap gap-2 sm:flex-nowrap">
|
||||||
|
<x-forms.input id="server.settings.concurrent_builds" label="Number of concurrent builds" required
|
||||||
|
helper="You can specify the number of simultaneous build processes/deployments that should run concurrently." />
|
||||||
|
<x-forms.input id="server.settings.dynamic_timeout" label="Deployment timeout (seconds)" required
|
||||||
|
helper="You can define the maximum duration for a deployment to run before timing it out." />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center gap-2 pt-4 pb-2">
|
<div class="flex items-center gap-2 pt-4 pb-2">
|
||||||
<h3>Sentinel</h3>
|
<h3>Sentinel</h3>
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
this.activeAccordion = (this.activeAccordion == id) ? '' : id
|
this.activeAccordion = (this.activeAccordion == id) ? '' : id
|
||||||
}
|
}
|
||||||
}" class="relative w-full py-2 mx-auto overflow-hidden text-sm font-normal rounded-md">
|
}" class="relative w-full py-2 mx-auto overflow-hidden text-sm font-normal rounded-md">
|
||||||
<div x-data="{ id: $id('accordion') }" class="cursor-pointer group">
|
<div x-data="{ id: $id('accordion') }" class="cursor-pointer">
|
||||||
<button @click="setActiveAccordion(id)"
|
<button @click="setActiveAccordion(id)"
|
||||||
class="flex items-center justify-between w-full px-1 py-2 text-left select-none hover:dark:text-white hover:bg-white/5"
|
class="flex items-center justify-between w-full px-1 py-2 text-left select-none hover:dark:text-white hover:bg-white/5"
|
||||||
type="button">
|
type="button">
|
||||||
|
@ -233,6 +233,7 @@
|
|||||||
Route::post('/upload/backup/{databaseUuid}', [UploadController::class, 'upload'])->name('upload.backup');
|
Route::post('/upload/backup/{databaseUuid}', [UploadController::class, 'upload'])->name('upload.backup');
|
||||||
Route::get('/download/backup/{executionId}', function () {
|
Route::get('/download/backup/{executionId}', function () {
|
||||||
try {
|
try {
|
||||||
|
ray()->clearAll();
|
||||||
$team = auth()->user()->currentTeam();
|
$team = auth()->user()->currentTeam();
|
||||||
if (is_null($team)) {
|
if (is_null($team)) {
|
||||||
return response()->json(['message' => 'Team not found.'], 404);
|
return response()->json(['message' => 'Team not found.'], 404);
|
||||||
@ -264,14 +265,18 @@
|
|||||||
'port' => $server->port,
|
'port' => $server->port,
|
||||||
'username' => $server->user,
|
'username' => $server->user,
|
||||||
'privateKey' => $privateKeyLocation,
|
'privateKey' => $privateKeyLocation,
|
||||||
|
'root' => '/',
|
||||||
]);
|
]);
|
||||||
|
if (! $disk->exists($filename)) {
|
||||||
|
return response()->json(['message' => 'Backup not found.'], 404);
|
||||||
|
}
|
||||||
|
|
||||||
return new StreamedResponse(function () use ($disk, $filename) {
|
return new StreamedResponse(function () use ($disk, $filename) {
|
||||||
if (ob_get_level()) {
|
if (ob_get_level()) {
|
||||||
ob_end_clean();
|
ob_end_clean();
|
||||||
}
|
}
|
||||||
$stream = $disk->readStream($filename);
|
$stream = $disk->readStream($filename);
|
||||||
if ($stream === false) {
|
if ($stream === false || is_null($stream)) {
|
||||||
abort(500, 'Failed to open stream for the requested file.');
|
abort(500, 'Failed to open stream for the requested file.');
|
||||||
}
|
}
|
||||||
while (! feof($stream)) {
|
while (! feof($stream)) {
|
||||||
|
@ -301,7 +301,7 @@ services:
|
|||||||
- DEFAULT_ORGANIZATION_NAME=${STUDIO_DEFAULT_ORGANIZATION:-Default Organization}
|
- DEFAULT_ORGANIZATION_NAME=${STUDIO_DEFAULT_ORGANIZATION:-Default Organization}
|
||||||
- DEFAULT_PROJECT_NAME=${STUDIO_DEFAULT_PROJECT:-Default Project}
|
- DEFAULT_PROJECT_NAME=${STUDIO_DEFAULT_PROJECT:-Default Project}
|
||||||
|
|
||||||
- SUPABASE_URL=http://supabase-kong:8000
|
- SUPABASE_URL=${SERVICE_FQDN_SUPABASEKONG:-http://supabase-kong:8000}
|
||||||
- SUPABASE_PUBLIC_URL=${SERVICE_FQDN_SUPABASEKONG}
|
- SUPABASE_PUBLIC_URL=${SERVICE_FQDN_SUPABASEKONG}
|
||||||
- SUPABASE_ANON_KEY=${SERVICE_SUPABASEANON_KEY}
|
- SUPABASE_ANON_KEY=${SERVICE_SUPABASEANON_KEY}
|
||||||
- SUPABASE_SERVICE_KEY=${SERVICE_SUPABASESERVICE_KEY}
|
- SUPABASE_SERVICE_KEY=${SERVICE_SUPABASESERVICE_KEY}
|
||||||
@ -1182,7 +1182,7 @@ services:
|
|||||||
retries: 3
|
retries: 3
|
||||||
environment:
|
environment:
|
||||||
- JWT_SECRET=${SERVICE_PASSWORD_JWT}
|
- JWT_SECRET=${SERVICE_PASSWORD_JWT}
|
||||||
- SUPABASE_URL=http://supabase-kong:8000
|
- SUPABASE_URL=${SERVICE_FQDN_SUPABASEKONG:-http://supabase-kong:8000}
|
||||||
- SUPABASE_ANON_KEY=${SERVICE_SUPABASEANON_KEY}
|
- SUPABASE_ANON_KEY=${SERVICE_SUPABASEANON_KEY}
|
||||||
- SUPABASE_SERVICE_ROLE_KEY=${SERVICE_SUPABASESERVICE_KEY}
|
- SUPABASE_SERVICE_ROLE_KEY=${SERVICE_SUPABASESERVICE_KEY}
|
||||||
- SUPABASE_DB_URL=postgresql://postgres:${SERVICE_PASSWORD_POSTGRES}@${POSTGRES_HOSTNAME:-supabase-db}:${POSTGRES_PORT:-5432}/${POSTGRES_DB:-postgres}
|
- SUPABASE_DB_URL=postgresql://postgres:${SERVICE_PASSWORD_POSTGRES}@${POSTGRES_HOSTNAME:-supabase-db}:${POSTGRES_PORT:-5432}/${POSTGRES_DB:-postgres}
|
||||||
|
File diff suppressed because one or more lines are too long
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"coolify": {
|
"coolify": {
|
||||||
"v4": {
|
"v4": {
|
||||||
"version": "4.0.0-beta.315"
|
"version": "4.0.0-beta.316"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user