@@ -26,7 +26,7 @@ class ScheduledBackups extends Component
|
|||||||
public function mount(): void
|
public function mount(): void
|
||||||
{
|
{
|
||||||
if ($this->selectedBackupId) {
|
if ($this->selectedBackupId) {
|
||||||
$this->setSelectedBackup($this->selectedBackupId);
|
$this->setSelectedBackup($this->selectedBackupId, true);
|
||||||
}
|
}
|
||||||
$this->parameters = get_route_parameters();
|
$this->parameters = get_route_parameters();
|
||||||
if ($this->database->getMorphClass() === 'App\Models\ServiceDatabase') {
|
if ($this->database->getMorphClass() === 'App\Models\ServiceDatabase') {
|
||||||
@@ -37,10 +37,13 @@ class ScheduledBackups extends Component
|
|||||||
$this->s3s = currentTeam()->s3s;
|
$this->s3s = currentTeam()->s3s;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setSelectedBackup($backupId)
|
public function setSelectedBackup($backupId, $force = false)
|
||||||
{
|
{
|
||||||
|
if ($this->selectedBackupId === $backupId && ! $force) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
$this->selectedBackupId = $backupId;
|
$this->selectedBackupId = $backupId;
|
||||||
$this->selectedBackup = $this->database->scheduledBackups->find($this->selectedBackupId);
|
$this->selectedBackup = $this->database->scheduledBackups->find($backupId);
|
||||||
if (is_null($this->selectedBackup)) {
|
if (is_null($this->selectedBackup)) {
|
||||||
$this->selectedBackupId = null;
|
$this->selectedBackupId = null;
|
||||||
}
|
}
|
||||||
|
@@ -325,38 +325,16 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
|
|||||||
$labels->push('traefik.http.middlewares.gzip.compress=true');
|
$labels->push('traefik.http.middlewares.gzip.compress=true');
|
||||||
$labels->push('traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https');
|
$labels->push('traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https');
|
||||||
|
|
||||||
$basic_auth = false;
|
$middlewares_from_labels = collect([]);
|
||||||
$basic_auth_middleware = null;
|
|
||||||
$redirect = false;
|
|
||||||
$redirect_middleware = null;
|
|
||||||
|
|
||||||
if ($serviceLabels) {
|
if ($serviceLabels) {
|
||||||
$basic_auth = $serviceLabels->contains(function ($value) {
|
$middlewares_from_labels = $serviceLabels->map(function ($item) {
|
||||||
return str_contains($value, 'basicauth');
|
if (preg_match('/traefik\.http\.middlewares\.(.*?)(\.|$)/', $item, $matches)) {
|
||||||
});
|
return $matches[1];
|
||||||
if ($basic_auth) {
|
}
|
||||||
$basic_auth_middleware = $serviceLabels
|
return null;
|
||||||
->map(function ($item) {
|
})->filter()
|
||||||
if (preg_match('/traefik\.http\.middlewares\.(.*?)\.basicauth\.users/', $item, $matches)) {
|
->unique();
|
||||||
return $matches[1];
|
|
||||||
}
|
|
||||||
})
|
|
||||||
->filter()
|
|
||||||
->first();
|
|
||||||
}
|
|
||||||
$redirect = $serviceLabels->contains(function ($value) {
|
|
||||||
return str_contains($value, 'redirectregex');
|
|
||||||
});
|
|
||||||
if ($redirect) {
|
|
||||||
$redirect_middleware = $serviceLabels
|
|
||||||
->map(function ($item) {
|
|
||||||
if (preg_match('/traefik\.http\.middlewares\.(.*?)\.redirectregex\.regex/', $item, $matches)) {
|
|
||||||
return $matches[1];
|
|
||||||
}
|
|
||||||
})
|
|
||||||
->filter()
|
|
||||||
->first();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
foreach ($domains as $loop => $domain) {
|
foreach ($domains as $loop => $domain) {
|
||||||
try {
|
try {
|
||||||
@@ -404,20 +382,15 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
|
|||||||
$labels->push("traefik.http.services.{$https_label}.loadbalancer.server.port=$port");
|
$labels->push("traefik.http.services.{$https_label}.loadbalancer.server.port=$port");
|
||||||
}
|
}
|
||||||
if ($path !== '/') {
|
if ($path !== '/') {
|
||||||
|
// Middleware handling
|
||||||
$middlewares = collect([]);
|
$middlewares = collect([]);
|
||||||
if ($is_stripprefix_enabled && ! str($image)->contains('ghost')) {
|
if ($is_stripprefix_enabled && !str($image)->contains('ghost')) {
|
||||||
$labels->push("traefik.http.middlewares.{$https_label}-stripprefix.stripprefix.prefixes={$path}");
|
$labels->push("traefik.http.middlewares.{$https_label}-stripprefix.stripprefix.prefixes={$path}");
|
||||||
$middlewares->push("{$https_label}-stripprefix");
|
$middlewares->push("{$https_label}-stripprefix");
|
||||||
}
|
}
|
||||||
if ($is_gzip_enabled) {
|
if ($is_gzip_enabled) {
|
||||||
$middlewares->push('gzip');
|
$middlewares->push('gzip');
|
||||||
}
|
}
|
||||||
if ($basic_auth && $basic_auth_middleware) {
|
|
||||||
$middlewares->push($basic_auth_middleware);
|
|
||||||
}
|
|
||||||
if ($redirect && $redirect_middleware) {
|
|
||||||
$middlewares->push($redirect_middleware);
|
|
||||||
}
|
|
||||||
if (str($image)->contains('ghost')) {
|
if (str($image)->contains('ghost')) {
|
||||||
$middlewares->push('redir-ghost');
|
$middlewares->push('redir-ghost');
|
||||||
}
|
}
|
||||||
@@ -425,10 +398,13 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
|
|||||||
$labels = $labels->merge($redirect_to_non_www);
|
$labels = $labels->merge($redirect_to_non_www);
|
||||||
$middlewares->push($to_non_www_name);
|
$middlewares->push($to_non_www_name);
|
||||||
}
|
}
|
||||||
if ($redirect_direction === 'www' && ! str($host)->startsWith('www.')) {
|
if ($redirect_direction === 'www' && !str($host)->startsWith('www.')) {
|
||||||
$labels = $labels->merge($redirect_to_www);
|
$labels = $labels->merge($redirect_to_www);
|
||||||
$middlewares->push($to_www_name);
|
$middlewares->push($to_www_name);
|
||||||
}
|
}
|
||||||
|
$middlewares_from_labels->each(function ($middleware_name) use ($middlewares) {
|
||||||
|
$middlewares->push($middleware_name);
|
||||||
|
});
|
||||||
if ($middlewares->isNotEmpty()) {
|
if ($middlewares->isNotEmpty()) {
|
||||||
$middlewares = $middlewares->join(',');
|
$middlewares = $middlewares->join(',');
|
||||||
$labels->push("traefik.http.routers.{$https_label}.middlewares={$middlewares}");
|
$labels->push("traefik.http.routers.{$https_label}.middlewares={$middlewares}");
|
||||||
@@ -437,13 +413,7 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
|
|||||||
$middlewares = collect([]);
|
$middlewares = collect([]);
|
||||||
if ($is_gzip_enabled) {
|
if ($is_gzip_enabled) {
|
||||||
$middlewares->push('gzip');
|
$middlewares->push('gzip');
|
||||||
}
|
}
|
||||||
if ($basic_auth && $basic_auth_middleware) {
|
|
||||||
$middlewares->push($basic_auth_middleware);
|
|
||||||
}
|
|
||||||
if ($redirect && $redirect_middleware) {
|
|
||||||
$middlewares->push($redirect_middleware);
|
|
||||||
}
|
|
||||||
if (str($image)->contains('ghost')) {
|
if (str($image)->contains('ghost')) {
|
||||||
$middlewares->push('redir-ghost');
|
$middlewares->push('redir-ghost');
|
||||||
}
|
}
|
||||||
@@ -455,6 +425,9 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
|
|||||||
$labels = $labels->merge($redirect_to_www);
|
$labels = $labels->merge($redirect_to_www);
|
||||||
$middlewares->push($to_www_name);
|
$middlewares->push($to_www_name);
|
||||||
}
|
}
|
||||||
|
$middlewares_from_labels->each(function ($middleware_name) use ($middlewares) {
|
||||||
|
$middlewares->push($middleware_name);
|
||||||
|
});
|
||||||
if ($middlewares->isNotEmpty()) {
|
if ($middlewares->isNotEmpty()) {
|
||||||
$middlewares = $middlewares->join(',');
|
$middlewares = $middlewares->join(',');
|
||||||
$labels->push("traefik.http.routers.{$https_label}.middlewares={$middlewares}");
|
$labels->push("traefik.http.routers.{$https_label}.middlewares={$middlewares}");
|
||||||
@@ -490,12 +463,6 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
|
|||||||
if ($is_gzip_enabled) {
|
if ($is_gzip_enabled) {
|
||||||
$middlewares->push('gzip');
|
$middlewares->push('gzip');
|
||||||
}
|
}
|
||||||
if ($basic_auth && $basic_auth_middleware) {
|
|
||||||
$middlewares->push($basic_auth_middleware);
|
|
||||||
}
|
|
||||||
if ($redirect && $redirect_middleware) {
|
|
||||||
$middlewares->push($redirect_middleware);
|
|
||||||
}
|
|
||||||
if (str($image)->contains('ghost')) {
|
if (str($image)->contains('ghost')) {
|
||||||
$middlewares->push('redir-ghost');
|
$middlewares->push('redir-ghost');
|
||||||
}
|
}
|
||||||
@@ -507,6 +474,9 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
|
|||||||
$labels = $labels->merge($redirect_to_www);
|
$labels = $labels->merge($redirect_to_www);
|
||||||
$middlewares->push($to_www_name);
|
$middlewares->push($to_www_name);
|
||||||
}
|
}
|
||||||
|
$middlewares_from_labels->each(function ($middleware_name) use ($middlewares) {
|
||||||
|
$middlewares->push($middleware_name);
|
||||||
|
});
|
||||||
if ($middlewares->isNotEmpty()) {
|
if ($middlewares->isNotEmpty()) {
|
||||||
$middlewares = $middlewares->join(',');
|
$middlewares = $middlewares->join(',');
|
||||||
$labels->push("traefik.http.routers.{$http_label}.middlewares={$middlewares}");
|
$labels->push("traefik.http.routers.{$http_label}.middlewares={$middlewares}");
|
||||||
@@ -516,12 +486,6 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
|
|||||||
if ($is_gzip_enabled) {
|
if ($is_gzip_enabled) {
|
||||||
$middlewares->push('gzip');
|
$middlewares->push('gzip');
|
||||||
}
|
}
|
||||||
if ($basic_auth && $basic_auth_middleware) {
|
|
||||||
$middlewares->push($basic_auth_middleware);
|
|
||||||
}
|
|
||||||
if ($redirect && $redirect_middleware) {
|
|
||||||
$middlewares->push($redirect_middleware);
|
|
||||||
}
|
|
||||||
if (str($image)->contains('ghost')) {
|
if (str($image)->contains('ghost')) {
|
||||||
$middlewares->push('redir-ghost');
|
$middlewares->push('redir-ghost');
|
||||||
}
|
}
|
||||||
@@ -533,6 +497,9 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
|
|||||||
$labels = $labels->merge($redirect_to_www);
|
$labels = $labels->merge($redirect_to_www);
|
||||||
$middlewares->push($to_www_name);
|
$middlewares->push($to_www_name);
|
||||||
}
|
}
|
||||||
|
$middlewares_from_labels->each(function ($middleware_name) use ($middlewares) {
|
||||||
|
$middlewares->push($middleware_name);
|
||||||
|
});
|
||||||
if ($middlewares->isNotEmpty()) {
|
if ($middlewares->isNotEmpty()) {
|
||||||
$middlewares = $middlewares->join(',');
|
$middlewares = $middlewares->join(',');
|
||||||
$labels->push("traefik.http.routers.{$http_label}.middlewares={$middlewares}");
|
$labels->push("traefik.http.routers.{$http_label}.middlewares={$middlewares}");
|
||||||
|
@@ -828,6 +828,31 @@ function convertToArray($collection)
|
|||||||
return $collection;
|
return $collection;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function parseCommandFromMagicEnvVariable(Str|string $key): Stringable
|
||||||
|
{
|
||||||
|
$value = str($key);
|
||||||
|
$count = substr_count($value->value(), '_');
|
||||||
|
if ($count === 2) {
|
||||||
|
if ($value->startsWith('SERVICE_FQDN') || $value->startsWith('SERVICE_URL')) {
|
||||||
|
// SERVICE_FQDN_UMAMI
|
||||||
|
$command = $value->after('SERVICE_')->beforeLast('_');
|
||||||
|
} else {
|
||||||
|
// SERVICE_BASE64_UMAMI
|
||||||
|
$command = $value->after('SERVICE_')->beforeLast('_');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($count === 3) {
|
||||||
|
if ($value->startsWith('SERVICE_FQDN') || $value->startsWith('SERVICE_URL')) {
|
||||||
|
// SERVICE_FQDN_UMAMI_1000
|
||||||
|
$command = $value->after('SERVICE_')->before('_');
|
||||||
|
} else {
|
||||||
|
// SERVICE_BASE64_64_UMAMI
|
||||||
|
$command = $value->after('SERVICE_')->beforeLast('_');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return str($command);
|
||||||
|
}
|
||||||
function parseEnvVariable(Str|string $value)
|
function parseEnvVariable(Str|string $value)
|
||||||
{
|
{
|
||||||
$value = str($value);
|
$value = str($value);
|
||||||
@@ -859,6 +884,7 @@ function parseEnvVariable(Str|string $value)
|
|||||||
} else {
|
} else {
|
||||||
// SERVICE_BASE64_64_UMAMI
|
// SERVICE_BASE64_64_UMAMI
|
||||||
$command = $value->after('SERVICE_')->beforeLast('_');
|
$command = $value->after('SERVICE_')->beforeLast('_');
|
||||||
|
ray($command);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3117,7 +3143,7 @@ function newParser(Application|Service $resource, int $pull_request_id = 0, ?int
|
|||||||
foreach ($magicEnvironments as $key => $value) {
|
foreach ($magicEnvironments as $key => $value) {
|
||||||
$key = str($key);
|
$key = str($key);
|
||||||
$value = replaceVariables($value);
|
$value = replaceVariables($value);
|
||||||
$command = $key->after('SERVICE_')->before('_');
|
$command = parseCommandFromMagicEnvVariable($key);
|
||||||
$found = $resource->environment_variables()->where('key', $key->value())->where($nameOfId, $resource->id)->first();
|
$found = $resource->environment_variables()->where('key', $key->value())->where($nameOfId, $resource->id)->first();
|
||||||
if ($found) {
|
if ($found) {
|
||||||
continue;
|
continue;
|
||||||
@@ -3676,6 +3702,18 @@ function newParser(Application|Service $resource, int $pull_request_id = 0, ?int
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
$serviceLabels = $labels->merge($defaultLabels);
|
$serviceLabels = $labels->merge($defaultLabels);
|
||||||
|
if ($serviceLabels->count() > 0) {
|
||||||
|
if ($isApplication) {
|
||||||
|
$isContainerLabelEscapeEnabled = data_get($resource, 'settings.is_container_label_escape_enabled');
|
||||||
|
} else {
|
||||||
|
$isContainerLabelEscapeEnabled = data_get($resource, 'is_container_label_escape_enabled');
|
||||||
|
}
|
||||||
|
if ($isContainerLabelEscapeEnabled) {
|
||||||
|
$serviceLabels = $serviceLabels->map(function ($value, $key) {
|
||||||
|
return escapeDollarSign($value);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
if (! $isDatabase && $fqdns instanceof Collection && $fqdns->count() > 0) {
|
if (! $isDatabase && $fqdns instanceof Collection && $fqdns->count() > 0) {
|
||||||
if ($isApplication) {
|
if ($isApplication) {
|
||||||
$shouldGenerateLabelsExactly = $resource->destination->server->settings->generate_exact_labels;
|
$shouldGenerateLabelsExactly = $resource->destination->server->settings->generate_exact_labels;
|
||||||
|
@@ -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.354',
|
'release' => '4.0.0-beta.355',
|
||||||
// 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.354';
|
return '4.0.0-beta.355';
|
||||||
|
@@ -1,37 +1,38 @@
|
|||||||
<div>
|
<div>
|
||||||
<div class="flex flex-col gap-2">
|
<div class="flex flex-col gap-2">
|
||||||
@forelse($database->scheduledBackups as $backup)
|
@forelse($database->scheduledBackups as $backup)
|
||||||
@if ($type == 'database')
|
@if ($type == 'database')
|
||||||
<a class="box"
|
<a class="box"
|
||||||
href="{{ route('project.database.backup.execution', [...$parameters, 'backup_uuid' => $backup->uuid]) }}">
|
href="{{ route('project.database.backup.execution', [...$parameters, 'backup_uuid' => $backup->uuid]) }}">
|
||||||
<div class="flex flex-col">
|
<div class="flex flex-col">
|
||||||
<div>Frequency: {{ $backup->frequency }}</div>
|
<div>Frequency: {{ $backup->frequency }}</div>
|
||||||
<div>Last backup: {{ data_get($backup->latest_log, 'status', 'No backup yet') }}</div>
|
<div>Last backup: {{ data_get($backup->latest_log, 'status', 'No backup yet') }}</div>
|
||||||
<div>Number of backups to keep (locally): {{ $backup->number_of_backups_locally }}</div>
|
<div>Number of backups to keep (locally): {{ $backup->number_of_backups_locally }}</div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
@else
|
@else
|
||||||
<div class="box" wire:click="setSelectedBackup('{{ data_get($backup, 'id') }}')">
|
<div class="box" wire:click="setSelectedBackup('{{ data_get($backup, 'id') }}')">
|
||||||
<div @class([ 'border-coollabs'=>
|
<div @class([
|
||||||
data_get($backup, 'id') === data_get($selectedBackup, 'id'),
|
'border-coollabs' =>
|
||||||
'flex flex-col border-l-2 border-transparent',
|
data_get($backup, 'id') === data_get($selectedBackup, 'id'),
|
||||||
])>
|
'flex flex-col border-l-2 border-transparent',
|
||||||
<div>Frequency: {{ $backup->frequency }}</div>
|
])>
|
||||||
<div>Last backup: {{ data_get($backup->latest_log, 'status', 'No backup yet') }}</div>
|
<div>Frequency: {{ $backup->frequency }}</div>
|
||||||
<div>Number of backups to keep (locally): {{ $backup->number_of_backups_locally }}</div>
|
<div>Last backup: {{ data_get($backup->latest_log, 'status', 'No backup yet') }}</div>
|
||||||
</div>
|
<div>Number of backups to keep (locally): {{ $backup->number_of_backups_locally }}</div>
|
||||||
</div>
|
</div>
|
||||||
@endif
|
</div>
|
||||||
|
@endif
|
||||||
@empty
|
@empty
|
||||||
<div>No scheduled backups configured.</div>
|
<div>No scheduled backups configured.</div>
|
||||||
@endforelse
|
@endforelse
|
||||||
</div>
|
</div>
|
||||||
@if ($type === 'service-database' && $selectedBackup)
|
@if ($type === 'service-database' && $selectedBackup)
|
||||||
<div class="pt-10">
|
<div class="pt-10">
|
||||||
<livewire:project.database.backup-edit wire:key="{{ $selectedBackup->id }}" :backup="$selectedBackup"
|
<livewire:project.database.backup-edit wire:key="{{ $selectedBackup->id }}" :backup="$selectedBackup"
|
||||||
:s3s="$s3s" :status="data_get($database, 'status')" />
|
:s3s="$s3s" :status="data_get($database, 'status')" />
|
||||||
<h3 class="py-4">Executions</h3>
|
<livewire:project.database.backup-executions wire:key="{{ $selectedBackup->uuid }}" :backup="$selectedBackup"
|
||||||
<livewire:project.database.backup-executions wire:key="{{ $selectedBackup->id }}" :backup="$selectedBackup" :database="$database" />
|
:database="$database" />
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"coolify": {
|
"coolify": {
|
||||||
"v4": {
|
"v4": {
|
||||||
"version": "4.0.0-beta.354"
|
"version": "4.0.0-beta.355"
|
||||||
},
|
},
|
||||||
"nightly": {
|
"nightly": {
|
||||||
"version": "4.0.0-beta.355"
|
"version": "4.0.0-beta.356"
|
||||||
},
|
},
|
||||||
"helper": {
|
"helper": {
|
||||||
"version": "1.0.1"
|
"version": "1.0.1"
|
||||||
|
Reference in New Issue
Block a user