Merge branch 'next' into next-save

This commit is contained in:
Andras Bacsai
2024-10-11 13:20:03 +02:00
committed by GitHub
19 changed files with 405 additions and 390 deletions

View File

@@ -6,6 +6,7 @@ use App\Actions\Application\GenerateConfig;
use App\Models\Application; use App\Models\Application;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Livewire\Component; use Livewire\Component;
use Spatie\Url\Url;
use Visus\Cuid2\Cuid2; use Visus\Cuid2\Cuid2;
class General extends Component class General extends Component
@@ -183,9 +184,7 @@ class General extends Component
$storage->save(); $storage->save();
}); });
} }
} }
} }
public function loadComposeFile($isInit = false) public function loadComposeFile($isInit = false)
@@ -242,23 +241,6 @@ class General extends Component
} }
} }
public function updatedApplicationFqdn()
{
try {
$this->application->fqdn = str($this->application->fqdn)->replaceEnd(',', '')->trim();
$this->application->fqdn = str($this->application->fqdn)->replaceStart(',', '')->trim();
$this->application->fqdn = str($this->application->fqdn)->trim()->explode(',')->map(function ($domain) {
return str($domain)->trim()->lower();
});
$this->application->fqdn = $this->application->fqdn->unique()->implode(',');
$this->application->save();
} catch (\Throwable $e) {
$originalFqdn = $this->application->getOriginal('fqdn');
$this->application->fqdn = $originalFqdn;
return handleError($e, $this);
}
$this->resetDefaultLabels();
}
public function updatedApplicationBuildPack() public function updatedApplicationBuildPack()
{ {
@@ -332,7 +314,7 @@ class General extends Component
public function set_redirect() public function set_redirect()
{ {
try { try {
$has_www = collect($this->application->fqdns)->filter(fn ($fqdn) => str($fqdn)->contains('www.'))->count(); $has_www = collect($this->application->fqdns)->filter(fn($fqdn) => str($fqdn)->contains('www.'))->count();
if ($has_www === 0 && $this->application->redirect === 'www') { if ($has_www === 0 && $this->application->redirect === 'www') {
$this->dispatch('error', 'You want to redirect to www, but you do not have a www domain set.<br><br>Please add www to your domain list and as an A DNS record (if applicable).'); $this->dispatch('error', 'You want to redirect to www, but you do not have a www domain set.<br><br>Please add www to your domain list and as an A DNS record (if applicable).');
@@ -349,15 +331,18 @@ class General extends Component
public function submit($showToaster = true) public function submit($showToaster = true)
{ {
try { try {
if ($this->application->isDirty('redirect')) {
$this->set_redirect();
}
$this->application->fqdn = str($this->application->fqdn)->replaceEnd(',', '')->trim(); $this->application->fqdn = str($this->application->fqdn)->replaceEnd(',', '')->trim();
$this->application->fqdn = str($this->application->fqdn)->replaceStart(',', '')->trim(); $this->application->fqdn = str($this->application->fqdn)->replaceStart(',', '')->trim();
$this->application->fqdn = str($this->application->fqdn)->trim()->explode(',')->map(function ($domain) { $this->application->fqdn = str($this->application->fqdn)->trim()->explode(',')->map(function ($domain) {
Url::fromString($domain, ['http', 'https']);
return str($domain)->trim()->lower(); return str($domain)->trim()->lower();
}); });
$this->application->fqdn = $this->application->fqdn->unique()->implode(','); $this->application->fqdn = $this->application->fqdn->unique()->implode(',');
$this->resetDefaultLabels();
if ($this->application->isDirty('redirect')) {
$this->set_redirect();
}
$this->checkFqdns(); $this->checkFqdns();
@@ -420,6 +405,10 @@ class General extends Component
$this->application->save(); $this->application->save();
$showToaster && $this->dispatch('success', 'Application settings updated!'); $showToaster && $this->dispatch('success', 'Application settings updated!');
} catch (\Throwable $e) { } catch (\Throwable $e) {
$originalFqdn = $this->application->getOriginal('fqdn');
if ($originalFqdn !== $this->application->fqdn) {
$this->application->fqdn = $originalFqdn;
}
return handleError($e, $this); return handleError($e, $this);
} finally { } finally {
$this->dispatch('configurationChanged'); $this->dispatch('configurationChanged');

View File

@@ -31,10 +31,14 @@ class Form extends Component
public function generate_real_url() public function generate_real_url()
{ {
if (data_get($this->application, 'fqdn')) { if (data_get($this->application, 'fqdn')) {
try {
$firstFqdn = str($this->application->fqdn)->before(','); $firstFqdn = str($this->application->fqdn)->before(',');
$url = Url::fromString($firstFqdn); $url = Url::fromString($firstFqdn);
$host = $url->getHost(); $host = $url->getHost();
$this->preview_url_template = str($this->application->preview_url_template)->replace('{{domain}}', $host); $this->preview_url_template = str($this->application->preview_url_template)->replace('{{domain}}', $host);
} catch (\Exception $e) {
$this->dispatch('error', 'Invalid FQDN.');
}
} }
} }

View File

@@ -4,6 +4,7 @@ namespace App\Livewire\Project\Service;
use App\Models\ServiceApplication; use App\Models\ServiceApplication;
use Livewire\Component; use Livewire\Component;
use Spatie\Url\Url;
class EditDomain extends Component class EditDomain extends Component
{ {
@@ -20,25 +21,16 @@ class EditDomain extends Component
{ {
$this->application = ServiceApplication::find($this->applicationId); $this->application = ServiceApplication::find($this->applicationId);
} }
public function submit()
public function updatedApplicationFqdn()
{ {
try { try {
$this->application->fqdn = str($this->application->fqdn)->replaceEnd(',', '')->trim(); $this->application->fqdn = str($this->application->fqdn)->replaceEnd(',', '')->trim();
$this->application->fqdn = str($this->application->fqdn)->replaceStart(',', '')->trim(); $this->application->fqdn = str($this->application->fqdn)->replaceStart(',', '')->trim();
$this->application->fqdn = str($this->application->fqdn)->trim()->explode(',')->map(function ($domain) { $this->application->fqdn = str($this->application->fqdn)->trim()->explode(',')->map(function ($domain) {
Url::fromString($domain, ['http', 'https']);
return str($domain)->trim()->lower(); return str($domain)->trim()->lower();
}); });
$this->application->fqdn = $this->application->fqdn->unique()->implode(','); $this->application->fqdn = $this->application->fqdn->unique()->implode(',');
$this->application->save();
} catch(\Throwable $e) {
return handleError($e, $this);
}
}
public function submit()
{
try {
check_domain_usage(resource: $this->application); check_domain_usage(resource: $this->application);
$this->validate(); $this->validate();
$this->application->save(); $this->application->save();
@@ -48,12 +40,15 @@ class EditDomain extends Component
} else { } else {
$this->dispatch('success', 'Service saved.'); $this->dispatch('success', 'Service saved.');
} }
} catch (\Throwable $e) {
return handleError($e, $this);
} finally {
$this->application->service->parse(); $this->application->service->parse();
$this->dispatch('refresh'); $this->dispatch('refresh');
$this->dispatch('configurationChanged'); $this->dispatch('configurationChanged');
} catch (\Throwable $e) {
$originalFqdn = $this->application->getOriginal('fqdn');
if ($originalFqdn !== $this->application->fqdn) {
$this->application->fqdn = $originalFqdn;
}
return handleError($e, $this);
} }
} }

View File

@@ -6,6 +6,7 @@ use App\Models\ServiceApplication;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
use Livewire\Component; use Livewire\Component;
use Spatie\Url\Url;
class ServiceApplicationView extends Component class ServiceApplicationView extends Component
{ {
@@ -31,13 +32,7 @@ class ServiceApplicationView extends Component
public function updatedApplicationFqdn() public function updatedApplicationFqdn()
{ {
$this->application->fqdn = str($this->application->fqdn)->replaceEnd(',', '')->trim();
$this->application->fqdn = str($this->application->fqdn)->replaceStart(',', '')->trim();
$this->application->fqdn = str($this->application->fqdn)->trim()->explode(',')->map(function ($domain) {
return str($domain)->trim()->lower();
});
$this->application->fqdn = $this->application->fqdn->unique()->implode(',');
$this->application->save();
} }
public function instantSave() public function instantSave()
@@ -83,6 +78,14 @@ class ServiceApplicationView extends Component
public function submit() public function submit()
{ {
try { try {
$this->application->fqdn = str($this->application->fqdn)->replaceEnd(',', '')->trim();
$this->application->fqdn = str($this->application->fqdn)->replaceStart(',', '')->trim();
$this->application->fqdn = str($this->application->fqdn)->trim()->explode(',')->map(function ($domain) {
Url::fromString($domain, ['http', 'https']);
return str($domain)->trim()->lower();
});
$this->application->fqdn = $this->application->fqdn->unique()->implode(',');
check_domain_usage(resource: $this->application); check_domain_usage(resource: $this->application);
$this->validate(); $this->validate();
$this->application->save(); $this->application->save();
@@ -92,10 +95,13 @@ class ServiceApplicationView extends Component
} else { } else {
$this->dispatch('success', 'Service saved.'); $this->dispatch('success', 'Service saved.');
} }
} catch (\Throwable $e) {
return handleError($e, $this);
} finally {
$this->dispatch('generateDockerCompose'); $this->dispatch('generateDockerCompose');
} catch (\Throwable $e) {
$originalFqdn = $this->application->getOriginal('fqdn');
if ($originalFqdn !== $this->application->fqdn) {
$this->application->fqdn = $originalFqdn;
}
return handleError($e, $this);
} }
} }

View File

@@ -209,10 +209,13 @@ respond 404
1 => 'https', 1 => 'https',
], ],
'service' => 'noop', 'service' => 'noop',
'rule' => 'HostRegexp(`{catchall:.*}`)', 'rule' => 'HostRegexp(`.+`)',
'tls' => [
'certResolver' => 'letsencrypt',
],
'priority' => 1, 'priority' => 1,
'middlewares' => [ 'middlewares' => [
0 => 'redirect-regexp@file', 0 => 'redirect-regexp',
], ],
], ],
], ],

View File

@@ -319,7 +319,7 @@ class Service extends BaseModel
if ($password) { if ($password) {
$data = $data->merge([ $data = $data->merge([
'Password' => [ 'Password' => [
'key' => 'LABEL_STUDIO_PASSWORD', 'key' => data_get($password, 'key'),
'value' => data_get($password, 'value'), 'value' => data_get($password, 'value'),
'rules' => 'required', 'rules' => 'required',
'isPassword' => true, 'isPassword' => true,
@@ -359,7 +359,7 @@ class Service extends BaseModel
if ($email) { if ($email) {
$data = $data->merge([ $data = $data->merge([
'Admin Email' => [ 'Admin Email' => [
'key' => 'LANGFUSE_INIT_USER_EMAIL', 'key' => data_get($email, 'key'),
'value' => data_get($email, 'value'), 'value' => data_get($email, 'value'),
'rules' => 'required|email', 'rules' => 'required|email',
], ],
@@ -370,7 +370,7 @@ class Service extends BaseModel
if ($password) { if ($password) {
$data = $data->merge([ $data = $data->merge([
'Admin Password' => [ 'Admin Password' => [
'key' => 'LANGFUSE_INIT_USER_PASSWORD', 'key' => data_get($password, 'key'),
'value' => data_get($password, 'value'), 'value' => data_get($password, 'value'),
'rules' => 'required', 'rules' => 'required',
'isPassword' => true, 'isPassword' => true,
@@ -384,7 +384,7 @@ class Service extends BaseModel
$email = $this->environment_variables()->where('key', 'IN_USER_EMAIL')->first(); $email = $this->environment_variables()->where('key', 'IN_USER_EMAIL')->first();
$data = $data->merge([ $data = $data->merge([
'Email' => [ 'Email' => [
'key' => 'IN_USER_EMAIL', 'key' => data_get($email, 'key'),
'value' => data_get($email, 'value'), 'value' => data_get($email, 'value'),
'rules' => 'required|email', 'rules' => 'required|email',
], ],
@@ -392,7 +392,7 @@ class Service extends BaseModel
$password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_INVOICENINJAUSER')->first(); $password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_INVOICENINJAUSER')->first();
$data = $data->merge([ $data = $data->merge([
'Password' => [ 'Password' => [
'key' => 'IN_PASSWORD', 'key' => data_get($password, 'key'),
'value' => data_get($password, 'value'), 'value' => data_get($password, 'value'),
'rules' => 'required', 'rules' => 'required',
'isPassword' => true, 'isPassword' => true,
@@ -487,7 +487,7 @@ class Service extends BaseModel
if ($admin_password) { if ($admin_password) {
$data = $data->merge([ $data = $data->merge([
'Admin Password' => [ 'Admin Password' => [
'key' => 'SERVICE_PASSWORD_TOLGEE', 'key' => data_get($admin_password, 'key'),
'value' => data_get($admin_password, 'value'), 'value' => data_get($admin_password, 'value'),
'rules' => 'required', 'rules' => 'required',
'isPassword' => true, 'isPassword' => true,
@@ -534,7 +534,7 @@ class Service extends BaseModel
if ($admin_password) { if ($admin_password) {
$data = $data->merge([ $data = $data->merge([
'Admin Password' => [ 'Admin Password' => [
'key' => 'SERVICE_PASSWORD_UNLEASH', 'key' => data_get($admin_password, 'key'),
'value' => data_get($admin_password, 'value'), 'value' => data_get($admin_password, 'value'),
'rules' => 'required', 'rules' => 'required',
'isPassword' => true, 'isPassword' => true,
@@ -557,7 +557,7 @@ class Service extends BaseModel
if ($admin_password) { if ($admin_password) {
$data = $data->merge([ $data = $data->merge([
'Admin Password' => [ 'Admin Password' => [
'key' => 'GF_SECURITY_ADMIN_PASSWORD', 'key' => data_get($admin_password, 'key'),
'value' => data_get($admin_password, 'value'), 'value' => data_get($admin_password, 'value'),
'rules' => 'required', 'rules' => 'required',
'isPassword' => true, 'isPassword' => true,
@@ -919,7 +919,7 @@ class Service extends BaseModel
if ($admin_user) { if ($admin_user) {
$data = $data->merge([ $data = $data->merge([
'User' => [ 'User' => [
'key' => 'SERVICE_USER_ADMIN', 'key' => data_get($admin_user, 'key'),
'value' => data_get($admin_user, 'value', 'admin'), 'value' => data_get($admin_user, 'value', 'admin'),
'readonly' => true, 'readonly' => true,
'rules' => 'required', 'rules' => 'required',
@@ -929,7 +929,7 @@ class Service extends BaseModel
if ($admin_password) { if ($admin_password) {
$data = $data->merge([ $data = $data->merge([
'Password' => [ 'Password' => [
'key' => 'SERVICE_PASSWORD_ADMIN', 'key' => data_get($admin_password, 'key'),
'value' => data_get($admin_password, 'value'), 'value' => data_get($admin_password, 'value'),
'rules' => 'required', 'rules' => 'required',
'isPassword' => true, 'isPassword' => true,
@@ -939,7 +939,7 @@ class Service extends BaseModel
if ($admin_email) { if ($admin_email) {
$data = $data->merge([ $data = $data->merge([
'Email' => [ 'Email' => [
'key' => 'ADMIN_EMAIL', 'key' => data_get($admin_email, 'key'),
'value' => data_get($admin_email, 'value'), 'value' => data_get($admin_email, 'value'),
'rules' => 'required|email', 'rules' => 'required|email',
], ],

View File

@@ -164,6 +164,7 @@ function generate_default_proxy_configuration(Server $server)
'ports' => [ 'ports' => [
'80:80', '80:80',
'443:443', '443:443',
'443:443/udp',
'8080:8080', '8080:8080',
], ],
'healthcheck' => [ 'healthcheck' => [
@@ -187,6 +188,7 @@ function generate_default_proxy_configuration(Server $server)
'--entryPoints.http.http2.maxConcurrentStreams=50', '--entryPoints.http.http2.maxConcurrentStreams=50',
'--entrypoints.https.http.encodequerysemicolons=true', '--entrypoints.https.http.encodequerysemicolons=true',
'--entryPoints.https.http2.maxConcurrentStreams=50', '--entryPoints.https.http2.maxConcurrentStreams=50',
'--entrypoints.https.http3',
'--providers.docker.exposedbydefault=false', '--providers.docker.exposedbydefault=false',
'--providers.file.directory=/traefik/dynamic/', '--providers.file.directory=/traefik/dynamic/',
'--providers.file.watch=true', '--providers.file.watch=true',

View File

@@ -3896,6 +3896,8 @@ function isAssociativeArray($array)
*/ */
function add_coolify_default_environment_variables(StandaloneRedis|StandalonePostgresql|StandaloneMongodb|StandaloneMysql|StandaloneMariadb|StandaloneKeydb|StandaloneDragonfly|StandaloneClickhouse|Application|Service $resource, Collection &$where_to_add, ?Collection $where_to_check = null) function add_coolify_default_environment_variables(StandaloneRedis|StandalonePostgresql|StandaloneMongodb|StandaloneMysql|StandaloneMariadb|StandaloneKeydb|StandaloneDragonfly|StandaloneClickhouse|Application|Service $resource, Collection &$where_to_add, ?Collection $where_to_check = null)
{ {
// Currently disabled
return;
if ($resource instanceof Service) { if ($resource instanceof Service) {
$ip = $resource->server->ip; $ip = $resource->server->ip;
} else { } else {

View File

@@ -14,7 +14,7 @@
"guzzlehttp/guzzle": "^7.5.0", "guzzlehttp/guzzle": "^7.5.0",
"laravel/fortify": "^v1.16.0", "laravel/fortify": "^v1.16.0",
"laravel/framework": "^v11", "laravel/framework": "^v11",
"laravel/horizon": "^5.27.1", "laravel/horizon": "^5.29.1",
"laravel/prompts": "^0.1.6", "laravel/prompts": "^0.1.6",
"laravel/sanctum": "^v4.0", "laravel/sanctum": "^v4.0",
"laravel/socialite": "^v5.14.0", "laravel/socialite": "^v5.14.0",
@@ -24,7 +24,7 @@
"lcobucci/jwt": "^5.0.0", "lcobucci/jwt": "^5.0.0",
"league/flysystem-aws-s3-v3": "^3.0", "league/flysystem-aws-s3-v3": "^3.0",
"league/flysystem-sftp-v3": "^3.0", "league/flysystem-sftp-v3": "^3.0",
"livewire/livewire": "3.4.9", "livewire/livewire": "3.5.2",
"log1x/laravel-webfonts": "^1.0", "log1x/laravel-webfonts": "^1.0",
"lorisleiva/laravel-actions": "^2.7", "lorisleiva/laravel-actions": "^2.7",
"nubs/random-name-generator": "^2.2", "nubs/random-name-generator": "^2.2",

572
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -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.358', 'release' => '4.0.0-beta.360',
// 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'),

View File

@@ -1,3 +1,3 @@
<?php <?php
return '4.0.0-beta.358'; return '4.0.0-beta.360';

View File

@@ -4,7 +4,7 @@
"dependencies": { "dependencies": {
"@xterm/addon-fit": "^0.10.0", "@xterm/addon-fit": "^0.10.0",
"@xterm/xterm": "^5.5.0", "@xterm/xterm": "^5.5.0",
"cookie": "^0.6.0", "cookie": "^0.7.0",
"axios": "1.7.5", "axios": "1.7.5",
"dotenv": "^16.4.5", "dotenv": "^16.4.5",
"node-pty": "^1.0.0", "node-pty": "^1.0.0",

View File

@@ -12,7 +12,7 @@
"auth.register_now": "S'enregistrer", "auth.register_now": "S'enregistrer",
"auth.logout": "Déconnexion", "auth.logout": "Déconnexion",
"auth.register": "S'enregistrer", "auth.register": "S'enregistrer",
"auth.registration_disabled": "L'enregistrement est désactivé. Merci de contacter l'administateur.", "auth.registration_disabled": "L'enregistrement est désactivé. Merci de contacter l'administrateur.",
"auth.reset_password": "Réinitialiser le mot de passe", "auth.reset_password": "Réinitialiser le mot de passe",
"auth.failed": "Aucune correspondance n'a été trouvée pour les informations d'identification renseignées.", "auth.failed": "Aucune correspondance n'a été trouvée pour les informations d'identification renseignées.",
"auth.failed.callback": "Erreur lors du processus de retour de la plateforme de connexion.", "auth.failed.callback": "Erreur lors du processus de retour de la plateforme de connexion.",
@@ -26,5 +26,12 @@
"input.code": "Code à usage unique", "input.code": "Code à usage unique",
"input.recovery_code": "Code de récupération", "input.recovery_code": "Code de récupération",
"button.save": "Sauvegarder", "button.save": "Sauvegarder",
"repository.url": "<span class='text-helper'>Exemples</span><br>Pour les dépôts publiques, utilisez <span class='text-helper'>https://...</span>.<br>Pour les dépôts privés, utilisez <span class='text-helper'>git@...</span>.<br><br>https://github.com/coollabsio/coolify-examples <span class='text-helper'>main</span> sera la branche selectionnée<br>https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify <span class='text-helper'>nodejs-fastify</span> sera la branche selectionnée.<br>https://gitea.com/sedlav/expressjs.git <span class='text-helper'>main</span> sera la branche selectionnée.<br>https://gitlab.com/andrasbacsai/nodejs-example.git <span class='text-helper'>main</span> sera la branche selectionnée." "repository.url": "<span class='text-helper'>Exemples</span><br>Pour les dépôts publiques, utilisez <span class='text-helper'>https://...</span>.<br>Pour les dépôts privés, utilisez <span class='text-helper'>git@...</span>.<br><br>https://github.com/coollabsio/coolify-examples <span class='text-helper'>main</span> sera la branche selectionnée<br>https://github.com/coollabsio/coolify-examples/tree/nodejs-fastify <span class='text-helper'>nodejs-fastify</span> sera la branche selectionnée.<br>https://gitea.com/sedlav/expressjs.git <span class='text-helper'>main</span> sera la branche selectionnée.<br>https://gitlab.com/andrasbacsai/nodejs-example.git <span class='text-helper'>main</span> sera la branche selectionnée.",
"service.stop": "Ce service sera arrêté.",
"resource.docker_cleanup": "Exécuter le nettoyage Docker (supprimer les images inutilisées et le cache du builder).",
"resource.non_persistent": "Toutes les données non persistantes seront supprimées.",
"resource.delete_volumes": "Supprimer définitivement tous les volumes associés à cette ressource.",
"resource.delete_connected_networks": "Supprimer définitivement tous les réseaux non-prédéfinis associés à cette ressource.",
"resource.delete_configurations": "Supprimer définitivement tous les fichiers de configuration du serveur.",
"database.delete_backups_locally": "Toutes les sauvegardes seront définitivement supprimées du stockage local."
} }

View File

@@ -272,7 +272,7 @@
class="block text-sm font-medium text-gray-700 dark:text-gray-300"> class="block text-sm font-medium text-gray-700 dark:text-gray-300">
Your Password Your Password
</label> </label>
<form @submit.prevent="return false" @keydown.enter.prevent> <form @submit.prevent @keydown.enter.prevent>
<input type="password" id="password-confirm" x-model="password" class="w-full input" <input type="password" id="password-confirm" x-model="password" class="w-full input"
placeholder="Enter your password"> placeholder="Enter your password">
</form> </form>

View File

@@ -1,2 +1,4 @@
<a {{ $attributes->merge(['class' => 'text-xs cursor-pointer opacity-90 hover:opacity-100 dark:hover:text-white hover:text-black']) }} <a {{ $attributes->merge(['class' => 'text-xs cursor-pointer opacity-90 hover:opacity-100 dark:hover:text-white hover:text-black']) }}
href="https://github.com/coollabsio/coolify/releases/tag/v{{ config('version') }}">v{{ config('version') }}</a> href="https://github.com/coollabsio/coolify/releases/tag/v{{ config('version') }}" target="_blank">
v{{ config('version') }}
</a>

View File

@@ -17,12 +17,12 @@
@elseif ($currentState === 'explanation') @elseif ($currentState === 'explanation')
<x-boarding-step title="What is Coolify?"> <x-boarding-step title="What is Coolify?">
<x-slot:question> <x-slot:question>
Coolify is an all-in-one application to automate tasks on your servers, deploy application with Coolify is an all-in-one application to automate tasks on your servers, deploy applications with
Git Git
integrations, deploy databases and services, monitor these resources with notifications and integrations, deploy databases and services, monitor these resources with notifications and
alerts alerts
without vendor lock-in without vendor lock-in. <br/>
and <a href="https://coolify.io" class="dark:text-white hover:underline">much much more</a>. <a href="https://coolify.io" class="dark:text-white hover:underline">Coolify Home</a>.
<br><br> <br><br>
<span class="text-xl"> <span class="text-xl">
<x-highlighted text="Self-hosting with superpowers!" /></span> <x-highlighted text="Self-hosting with superpowers!" /></span>

View File

@@ -48,8 +48,8 @@
</div> </div>
<form wire:submit='getLogs(true)' class="flex gap-2 items-end"> <form wire:submit='getLogs(true)' class="flex gap-2 items-end">
<div class="w-96"> <div class="w-96">
<x-forms.input label="Only Show Number of Lines" placeholder="1000" type="number" required <x-forms.input label="Only Show Number of Lines" placeholder="100" type="number" required
id="numberOfLines"></x-forms.input> id="numberOfLines" :readonly="$streamLogs"></x-forms.input>
</div> </div>
<x-forms.button type="submit">Refresh</x-forms.button> <x-forms.button type="submit">Refresh</x-forms.button>
<x-forms.checkbox instantSave label="Stream Logs" id="streamLogs"></x-forms.checkbox> <x-forms.checkbox instantSave label="Stream Logs" id="streamLogs"></x-forms.checkbox>

View File

@@ -1,11 +1,10 @@
{ {
"coolify": { "coolify": {
"v4": { "v4": {
"version": "4.0.0-beta.357" "version": "4.0.0-beta.360"
}, },
"nightly": { "nightly": {
"version": "4.0.0-beta.358" "version": "4.0.0-beta.361"
}, },
"helper": { "helper": {
"version": "1.0.2" "version": "1.0.2"