Skip to content

Commit a1d395f

Browse files
authored
Merge pull request #3708 from coollabsio/next
v4.0.0-beta.355
2 parents 7442d19 + 4e91268 commit a1d395f

File tree

7 files changed

+102
-93
lines changed

7 files changed

+102
-93
lines changed

app/Livewire/Project/Database/ScheduledBackups.php

+6-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class ScheduledBackups extends Component
2626
public function mount(): void
2727
{
2828
if ($this->selectedBackupId) {
29-
$this->setSelectedBackup($this->selectedBackupId);
29+
$this->setSelectedBackup($this->selectedBackupId, true);
3030
}
3131
$this->parameters = get_route_parameters();
3232
if ($this->database->getMorphClass() === 'App\Models\ServiceDatabase') {
@@ -37,10 +37,13 @@ public function mount(): void
3737
$this->s3s = currentTeam()->s3s;
3838
}
3939

40-
public function setSelectedBackup($backupId)
40+
public function setSelectedBackup($backupId, $force = false)
4141
{
42+
if ($this->selectedBackupId === $backupId && ! $force) {
43+
return;
44+
}
4245
$this->selectedBackupId = $backupId;
43-
$this->selectedBackup = $this->database->scheduledBackups->find($this->selectedBackupId);
46+
$this->selectedBackup = $this->database->scheduledBackups->find($backupId);
4447
if (is_null($this->selectedBackup)) {
4548
$this->selectedBackupId = null;
4649
}

bootstrap/helpers/docker.php

+24-57
Original file line numberDiff line numberDiff line change
@@ -325,38 +325,16 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
325325
$labels->push('traefik.http.middlewares.gzip.compress=true');
326326
$labels->push('traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https');
327327

328-
$basic_auth = false;
329-
$basic_auth_middleware = null;
330-
$redirect = false;
331-
$redirect_middleware = null;
328+
$middlewares_from_labels = collect([]);
332329

333330
if ($serviceLabels) {
334-
$basic_auth = $serviceLabels->contains(function ($value) {
335-
return str_contains($value, 'basicauth');
336-
});
337-
if ($basic_auth) {
338-
$basic_auth_middleware = $serviceLabels
339-
->map(function ($item) {
340-
if (preg_match('/traefik\.http\.middlewares\.(.*?)\.basicauth\.users/', $item, $matches)) {
341-
return $matches[1];
342-
}
343-
})
344-
->filter()
345-
->first();
346-
}
347-
$redirect = $serviceLabels->contains(function ($value) {
348-
return str_contains($value, 'redirectregex');
349-
});
350-
if ($redirect) {
351-
$redirect_middleware = $serviceLabels
352-
->map(function ($item) {
353-
if (preg_match('/traefik\.http\.middlewares\.(.*?)\.redirectregex\.regex/', $item, $matches)) {
354-
return $matches[1];
355-
}
356-
})
357-
->filter()
358-
->first();
359-
}
331+
$middlewares_from_labels = $serviceLabels->map(function ($item) {
332+
if (preg_match('/traefik\.http\.middlewares\.(.*?)(\.|$)/', $item, $matches)) {
333+
return $matches[1];
334+
}
335+
return null;
336+
})->filter()
337+
->unique();
360338
}
361339
foreach ($domains as $loop => $domain) {
362340
try {
@@ -404,31 +382,29 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
404382
$labels->push("traefik.http.services.{$https_label}.loadbalancer.server.port=$port");
405383
}
406384
if ($path !== '/') {
385+
// Middleware handling
407386
$middlewares = collect([]);
408-
if ($is_stripprefix_enabled && ! str($image)->contains('ghost')) {
387+
if ($is_stripprefix_enabled && !str($image)->contains('ghost')) {
409388
$labels->push("traefik.http.middlewares.{$https_label}-stripprefix.stripprefix.prefixes={$path}");
410389
$middlewares->push("{$https_label}-stripprefix");
411390
}
412391
if ($is_gzip_enabled) {
413392
$middlewares->push('gzip');
414393
}
415-
if ($basic_auth && $basic_auth_middleware) {
416-
$middlewares->push($basic_auth_middleware);
417-
}
418-
if ($redirect && $redirect_middleware) {
419-
$middlewares->push($redirect_middleware);
420-
}
421394
if (str($image)->contains('ghost')) {
422395
$middlewares->push('redir-ghost');
423396
}
424397
if ($redirect_direction === 'non-www' && str($host)->startsWith('www.')) {
425398
$labels = $labels->merge($redirect_to_non_www);
426399
$middlewares->push($to_non_www_name);
427400
}
428-
if ($redirect_direction === 'www' && ! str($host)->startsWith('www.')) {
401+
if ($redirect_direction === 'www' && !str($host)->startsWith('www.')) {
429402
$labels = $labels->merge($redirect_to_www);
430403
$middlewares->push($to_www_name);
431404
}
405+
$middlewares_from_labels->each(function ($middleware_name) use ($middlewares) {
406+
$middlewares->push($middleware_name);
407+
});
432408
if ($middlewares->isNotEmpty()) {
433409
$middlewares = $middlewares->join(',');
434410
$labels->push("traefik.http.routers.{$https_label}.middlewares={$middlewares}");
@@ -437,13 +413,7 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
437413
$middlewares = collect([]);
438414
if ($is_gzip_enabled) {
439415
$middlewares->push('gzip');
440-
}
441-
if ($basic_auth && $basic_auth_middleware) {
442-
$middlewares->push($basic_auth_middleware);
443-
}
444-
if ($redirect && $redirect_middleware) {
445-
$middlewares->push($redirect_middleware);
446-
}
416+
}
447417
if (str($image)->contains('ghost')) {
448418
$middlewares->push('redir-ghost');
449419
}
@@ -455,6 +425,9 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
455425
$labels = $labels->merge($redirect_to_www);
456426
$middlewares->push($to_www_name);
457427
}
428+
$middlewares_from_labels->each(function ($middleware_name) use ($middlewares) {
429+
$middlewares->push($middleware_name);
430+
});
458431
if ($middlewares->isNotEmpty()) {
459432
$middlewares = $middlewares->join(',');
460433
$labels->push("traefik.http.routers.{$https_label}.middlewares={$middlewares}");
@@ -490,12 +463,6 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
490463
if ($is_gzip_enabled) {
491464
$middlewares->push('gzip');
492465
}
493-
if ($basic_auth && $basic_auth_middleware) {
494-
$middlewares->push($basic_auth_middleware);
495-
}
496-
if ($redirect && $redirect_middleware) {
497-
$middlewares->push($redirect_middleware);
498-
}
499466
if (str($image)->contains('ghost')) {
500467
$middlewares->push('redir-ghost');
501468
}
@@ -507,6 +474,9 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
507474
$labels = $labels->merge($redirect_to_www);
508475
$middlewares->push($to_www_name);
509476
}
477+
$middlewares_from_labels->each(function ($middleware_name) use ($middlewares) {
478+
$middlewares->push($middleware_name);
479+
});
510480
if ($middlewares->isNotEmpty()) {
511481
$middlewares = $middlewares->join(',');
512482
$labels->push("traefik.http.routers.{$http_label}.middlewares={$middlewares}");
@@ -516,12 +486,6 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
516486
if ($is_gzip_enabled) {
517487
$middlewares->push('gzip');
518488
}
519-
if ($basic_auth && $basic_auth_middleware) {
520-
$middlewares->push($basic_auth_middleware);
521-
}
522-
if ($redirect && $redirect_middleware) {
523-
$middlewares->push($redirect_middleware);
524-
}
525489
if (str($image)->contains('ghost')) {
526490
$middlewares->push('redir-ghost');
527491
}
@@ -533,6 +497,9 @@ function fqdnLabelsForTraefik(string $uuid, Collection $domains, bool $is_force_
533497
$labels = $labels->merge($redirect_to_www);
534498
$middlewares->push($to_www_name);
535499
}
500+
$middlewares_from_labels->each(function ($middleware_name) use ($middlewares) {
501+
$middlewares->push($middleware_name);
502+
});
536503
if ($middlewares->isNotEmpty()) {
537504
$middlewares = $middlewares->join(',');
538505
$labels->push("traefik.http.routers.{$http_label}.middlewares={$middlewares}");

bootstrap/helpers/shared.php

+39-1
Original file line numberDiff line numberDiff line change
@@ -828,6 +828,31 @@ function convertToArray($collection)
828828
return $collection;
829829
}
830830

831+
function parseCommandFromMagicEnvVariable(Str|string $key): Stringable
832+
{
833+
$value = str($key);
834+
$count = substr_count($value->value(), '_');
835+
if ($count === 2) {
836+
if ($value->startsWith('SERVICE_FQDN') || $value->startsWith('SERVICE_URL')) {
837+
// SERVICE_FQDN_UMAMI
838+
$command = $value->after('SERVICE_')->beforeLast('_');
839+
} else {
840+
// SERVICE_BASE64_UMAMI
841+
$command = $value->after('SERVICE_')->beforeLast('_');
842+
}
843+
}
844+
if ($count === 3) {
845+
if ($value->startsWith('SERVICE_FQDN') || $value->startsWith('SERVICE_URL')) {
846+
// SERVICE_FQDN_UMAMI_1000
847+
$command = $value->after('SERVICE_')->before('_');
848+
} else {
849+
// SERVICE_BASE64_64_UMAMI
850+
$command = $value->after('SERVICE_')->beforeLast('_');
851+
}
852+
}
853+
854+
return str($command);
855+
}
831856
function parseEnvVariable(Str|string $value)
832857
{
833858
$value = str($value);
@@ -859,6 +884,7 @@ function parseEnvVariable(Str|string $value)
859884
} else {
860885
// SERVICE_BASE64_64_UMAMI
861886
$command = $value->after('SERVICE_')->beforeLast('_');
887+
ray($command);
862888
}
863889
}
864890
}
@@ -3117,7 +3143,7 @@ function newParser(Application|Service $resource, int $pull_request_id = 0, ?int
31173143
foreach ($magicEnvironments as $key => $value) {
31183144
$key = str($key);
31193145
$value = replaceVariables($value);
3120-
$command = $key->after('SERVICE_')->before('_');
3146+
$command = parseCommandFromMagicEnvVariable($key);
31213147
$found = $resource->environment_variables()->where('key', $key->value())->where($nameOfId, $resource->id)->first();
31223148
if ($found) {
31233149
continue;
@@ -3676,6 +3702,18 @@ function newParser(Application|Service $resource, int $pull_request_id = 0, ?int
36763702
});
36773703
}
36783704
$serviceLabels = $labels->merge($defaultLabels);
3705+
if ($serviceLabels->count() > 0) {
3706+
if ($isApplication) {
3707+
$isContainerLabelEscapeEnabled = data_get($resource, 'settings.is_container_label_escape_enabled');
3708+
} else {
3709+
$isContainerLabelEscapeEnabled = data_get($resource, 'is_container_label_escape_enabled');
3710+
}
3711+
if ($isContainerLabelEscapeEnabled) {
3712+
$serviceLabels = $serviceLabels->map(function ($value, $key) {
3713+
return escapeDollarSign($value);
3714+
});
3715+
}
3716+
}
36793717
if (! $isDatabase && $fqdns instanceof Collection && $fqdns->count() > 0) {
36803718
if ($isApplication) {
36813719
$shouldGenerateLabelsExactly = $resource->destination->server->settings->generate_exact_labels;

config/sentry.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
// The release version of your application
99
// Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD'))
10-
'release' => '4.0.0-beta.354',
10+
'release' => '4.0.0-beta.355',
1111
// When left empty or `null` the Laravel environment will be used
1212
'environment' => config('app.env'),
1313

config/version.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
<?php
22

3-
return '4.0.0-beta.354';
3+
return '4.0.0-beta.355';
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,38 @@
11
<div>
22
<div class="flex flex-col gap-2">
33
@forelse($database->scheduledBackups as $backup)
4-
@if ($type == 'database')
5-
<a class="box"
6-
href="{{ route('project.database.backup.execution', [...$parameters, 'backup_uuid' => $backup->uuid]) }}">
7-
<div class="flex flex-col">
8-
<div>Frequency: {{ $backup->frequency }}</div>
9-
<div>Last backup: {{ data_get($backup->latest_log, 'status', 'No backup yet') }}</div>
10-
<div>Number of backups to keep (locally): {{ $backup->number_of_backups_locally }}</div>
11-
</div>
12-
</a>
13-
@else
14-
<div class="box" wire:click="setSelectedBackup('{{ data_get($backup, 'id') }}')">
15-
<div @class([ 'border-coollabs'=>
16-
data_get($backup, 'id') === data_get($selectedBackup, 'id'),
17-
'flex flex-col border-l-2 border-transparent',
18-
])>
19-
<div>Frequency: {{ $backup->frequency }}</div>
20-
<div>Last backup: {{ data_get($backup->latest_log, 'status', 'No backup yet') }}</div>
21-
<div>Number of backups to keep (locally): {{ $backup->number_of_backups_locally }}</div>
22-
</div>
23-
</div>
24-
@endif
4+
@if ($type == 'database')
5+
<a class="box"
6+
href="{{ route('project.database.backup.execution', [...$parameters, 'backup_uuid' => $backup->uuid]) }}">
7+
<div class="flex flex-col">
8+
<div>Frequency: {{ $backup->frequency }}</div>
9+
<div>Last backup: {{ data_get($backup->latest_log, 'status', 'No backup yet') }}</div>
10+
<div>Number of backups to keep (locally): {{ $backup->number_of_backups_locally }}</div>
11+
</div>
12+
</a>
13+
@else
14+
<div class="box" wire:click="setSelectedBackup('{{ data_get($backup, 'id') }}')">
15+
<div @class([
16+
'border-coollabs' =>
17+
data_get($backup, 'id') === data_get($selectedBackup, 'id'),
18+
'flex flex-col border-l-2 border-transparent',
19+
])>
20+
<div>Frequency: {{ $backup->frequency }}</div>
21+
<div>Last backup: {{ data_get($backup->latest_log, 'status', 'No backup yet') }}</div>
22+
<div>Number of backups to keep (locally): {{ $backup->number_of_backups_locally }}</div>
23+
</div>
24+
</div>
25+
@endif
2526
@empty
26-
<div>No scheduled backups configured.</div>
27+
<div>No scheduled backups configured.</div>
2728
@endforelse
2829
</div>
2930
@if ($type === 'service-database' && $selectedBackup)
30-
<div class="pt-10">
31-
<livewire:project.database.backup-edit wire:key="{{ $selectedBackup->id }}" :backup="$selectedBackup"
32-
:s3s="$s3s" :status="data_get($database, 'status')" />
33-
<h3 class="py-4">Executions</h3>
34-
<livewire:project.database.backup-executions wire:key="{{ $selectedBackup->id }}" :backup="$selectedBackup" :database="$database" />
35-
</div>
31+
<div class="pt-10">
32+
<livewire:project.database.backup-edit wire:key="{{ $selectedBackup->id }}" :backup="$selectedBackup"
33+
:s3s="$s3s" :status="data_get($database, 'status')" />
34+
<livewire:project.database.backup-executions wire:key="{{ $selectedBackup->uuid }}" :backup="$selectedBackup"
35+
:database="$database" />
36+
</div>
3637
@endif
3738
</div>

versions.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"coolify": {
33
"v4": {
4-
"version": "4.0.0-beta.354"
4+
"version": "4.0.0-beta.355"
55
},
66
"nightly": {
7-
"version": "4.0.0-beta.355"
7+
"version": "4.0.0-beta.356"
88
},
99
"helper": {
1010
"version": "1.0.1"

0 commit comments

Comments
 (0)