@@ -47,6 +47,10 @@ class Kernel extends ConsoleKernel
 | 
			
		||||
            $this->check_resources($schedule);
 | 
			
		||||
            $this->pull_helper_image($schedule);
 | 
			
		||||
            $this->check_scheduled_tasks($schedule);
 | 
			
		||||
 | 
			
		||||
            if (!isCloud()) {
 | 
			
		||||
                $schedule->command('cleanup:database --yes')->daily();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    private function pull_helper_image($schedule)
 | 
			
		||||
@@ -68,35 +72,35 @@ class Kernel extends ConsoleKernel
 | 
			
		||||
            $containerServers = $servers->where('settings.is_swarm_worker', false)->where('settings.is_build_server', false);
 | 
			
		||||
        }
 | 
			
		||||
        foreach ($containerServers as $server) {
 | 
			
		||||
            $schedule->job(new ContainerStatusJob($server))->everyMinute()->onOneServer();
 | 
			
		||||
            // $schedule
 | 
			
		||||
            //     ->call(function () use ($server) {
 | 
			
		||||
            //         $randomSeconds = rand(1, 40);
 | 
			
		||||
            //         $job = new ContainerStatusJob($server);
 | 
			
		||||
            //         $job->delay($randomSeconds);
 | 
			
		||||
            //         ray('dispatching container status job in ' . $randomSeconds . ' seconds');
 | 
			
		||||
            //         dispatch($job);
 | 
			
		||||
            //     })->name('container-status-' . $server->id)->everyMinute()->onOneServer();
 | 
			
		||||
            // $schedule->job(new ContainerStatusJob($server))->everyMinute()->onOneServer();
 | 
			
		||||
            $schedule
 | 
			
		||||
                ->call(function () use ($server) {
 | 
			
		||||
                    $randomSeconds = rand(1, 40);
 | 
			
		||||
                    $job = new ContainerStatusJob($server);
 | 
			
		||||
                    $job->delay($randomSeconds);
 | 
			
		||||
                    ray('dispatching container status job in ' . $randomSeconds . ' seconds');
 | 
			
		||||
                    dispatch($job);
 | 
			
		||||
                })->name('container-status-' . $server->id)->everyMinute()->onOneServer();
 | 
			
		||||
            if ($server->isLogDrainEnabled()) {
 | 
			
		||||
                $schedule->job(new CheckLogDrainContainerJob($server))->everyMinute()->onOneServer();
 | 
			
		||||
                // $schedule
 | 
			
		||||
                //     ->call(function () use ($server) {
 | 
			
		||||
                //         $randomSeconds = rand(1, 40);
 | 
			
		||||
                //         $job = new CheckLogDrainContainerJob($server);
 | 
			
		||||
                //         $job->delay($randomSeconds);
 | 
			
		||||
                //         dispatch($job);
 | 
			
		||||
                //     })->name('log-drain-container-check-' . $server->id)->everyMinute()->onOneServer();
 | 
			
		||||
                // $schedule->job(new CheckLogDrainContainerJob($server))->everyMinute()->onOneServer();
 | 
			
		||||
                $schedule
 | 
			
		||||
                    ->call(function () use ($server) {
 | 
			
		||||
                        $randomSeconds = rand(1, 40);
 | 
			
		||||
                        $job = new CheckLogDrainContainerJob($server);
 | 
			
		||||
                        $job->delay($randomSeconds);
 | 
			
		||||
                        dispatch($job);
 | 
			
		||||
                    })->name('log-drain-container-check-' . $server->id)->everyMinute()->onOneServer();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        foreach ($servers as $server) {
 | 
			
		||||
            $schedule->job(new ServerStatusJob($server))->everyMinute()->onOneServer();
 | 
			
		||||
            // $schedule
 | 
			
		||||
            //     ->call(function () use ($server) {
 | 
			
		||||
            //         $randomSeconds = rand(1, 40);
 | 
			
		||||
            //         $job = new ServerStatusJob($server);
 | 
			
		||||
            //         $job->delay($randomSeconds);
 | 
			
		||||
            //         dispatch($job);
 | 
			
		||||
            //     })->name('server-status-job-' . $server->id)->everyMinute()->onOneServer();
 | 
			
		||||
            // $schedule->job(new ServerStatusJob($server))->everyMinute()->onOneServer();
 | 
			
		||||
            $schedule
 | 
			
		||||
                ->call(function () use ($server) {
 | 
			
		||||
                    $randomSeconds = rand(1, 40);
 | 
			
		||||
                    $job = new ServerStatusJob($server);
 | 
			
		||||
                    $job->delay($randomSeconds);
 | 
			
		||||
                    dispatch($job);
 | 
			
		||||
                })->name('server-status-job-' . $server->id)->everyMinute()->onOneServer();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    private function instance_auto_update($schedule)
 | 
			
		||||
 
 | 
			
		||||
@@ -13,5 +13,6 @@ class PreventRequestsDuringMaintenance extends Middleware
 | 
			
		||||
     */
 | 
			
		||||
    protected $except = [
 | 
			
		||||
        'webhooks/*',
 | 
			
		||||
        '/api/health'
 | 
			
		||||
    ];
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -102,6 +102,32 @@ class Service extends BaseModel
 | 
			
		||||
        foreach ($applications as $application) {
 | 
			
		||||
            $image = str($application->image)->before(':')->value();
 | 
			
		||||
            switch ($image) {
 | 
			
		||||
                case str($image)?->contains('directus'):
 | 
			
		||||
                    $data = collect([]);
 | 
			
		||||
                    $admin_email = $this->environment_variables()->where('key', 'ADMIN_EMAIL')->first();
 | 
			
		||||
                    $admin_password = $this->environment_variables()->where('key', 'SERVICE_PASSWORD_ADMIN')->first();
 | 
			
		||||
 | 
			
		||||
                    if ($admin_email) {
 | 
			
		||||
                        $data = $data->merge([
 | 
			
		||||
                            'Admin Email' => [
 | 
			
		||||
                                'key' => data_get($admin_email, 'key'),
 | 
			
		||||
                                'value' => data_get($admin_email, 'value'),
 | 
			
		||||
                                'rules' => 'required|email',
 | 
			
		||||
                            ],
 | 
			
		||||
                        ]);
 | 
			
		||||
                    }
 | 
			
		||||
                    if ($admin_password) {
 | 
			
		||||
                        $data = $data->merge([
 | 
			
		||||
                            'Admin Password' => [
 | 
			
		||||
                                'key' => data_get($admin_password, 'key'),
 | 
			
		||||
                                'value' => data_get($admin_password, 'value'),
 | 
			
		||||
                                'rules' => 'required',
 | 
			
		||||
                                'isPassword' => true,
 | 
			
		||||
                            ],
 | 
			
		||||
                        ]);
 | 
			
		||||
                    }
 | 
			
		||||
                    $fields->put('Directus', $data);
 | 
			
		||||
                    break;
 | 
			
		||||
                case str($image)?->contains('kong'):
 | 
			
		||||
                    $data = collect([]);
 | 
			
		||||
                    $dashboard_user = $this->environment_variables()->where('key', 'SERVICE_USER_ADMIN')->first();
 | 
			
		||||
 
 | 
			
		||||
@@ -1054,8 +1054,8 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal
 | 
			
		||||
                            serviceLabels: $serviceLabels,
 | 
			
		||||
                            is_gzip_enabled: $savedService->isGzipEnabled(),
 | 
			
		||||
                            is_stripprefix_enabled: $savedService->isStripprefixEnabled(),
 | 
			
		||||
                            service_name: $serviceName));
 | 
			
		||||
 | 
			
		||||
                            service_name: $serviceName
 | 
			
		||||
                        ));
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if ($resource->server->isLogDrainEnabled() && $savedService->isLogDrainEnabled()) {
 | 
			
		||||
@@ -1597,6 +1597,7 @@ function generateEnvValue(string $command, ?Service $service = null)
 | 
			
		||||
        case 'PASSWORD_64':
 | 
			
		||||
            $generatedValue = Str::password(length: 64, symbols: false);
 | 
			
		||||
            break;
 | 
			
		||||
            // This is not base64, it's just a random string
 | 
			
		||||
        case 'BASE64_64':
 | 
			
		||||
            $generatedValue = Str::random(64);
 | 
			
		||||
            break;
 | 
			
		||||
@@ -1604,8 +1605,20 @@ function generateEnvValue(string $command, ?Service $service = null)
 | 
			
		||||
            $generatedValue = Str::random(128);
 | 
			
		||||
            break;
 | 
			
		||||
        case 'BASE64':
 | 
			
		||||
        case 'BASE64_32':
 | 
			
		||||
            $generatedValue = Str::random(32);
 | 
			
		||||
            break;
 | 
			
		||||
            // This is base64,
 | 
			
		||||
        case 'REALBASE64_64':
 | 
			
		||||
            $generatedValue = base64_encode(Str::random(64));
 | 
			
		||||
            break;
 | 
			
		||||
        case 'REALBASE64_128':
 | 
			
		||||
            $generatedValue = base64_encode(Str::random(128));
 | 
			
		||||
            break;
 | 
			
		||||
        case 'REALBASE64':
 | 
			
		||||
        case 'REALBASE64_32':
 | 
			
		||||
            $generatedValue = base64_encode(Str::random(32));
 | 
			
		||||
            break;
 | 
			
		||||
        case 'USER':
 | 
			
		||||
            $generatedValue = Str::random(16);
 | 
			
		||||
            break;
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ return [
 | 
			
		||||
 | 
			
		||||
    // The release version of your application
 | 
			
		||||
    // Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD'))
 | 
			
		||||
    'release' => '4.0.0-beta.233',
 | 
			
		||||
    'release' => '4.0.0-beta.234',
 | 
			
		||||
    // When left empty or `null` the Laravel environment will be used
 | 
			
		||||
    'environment' => config('app.env'),
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,3 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
return '4.0.0-beta.233';
 | 
			
		||||
return '4.0.0-beta.234';
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,9 @@
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1">
 | 
			
		||||
    <link rel="preconnect" href="https://api.fonts.coollabs.io" crossorigin>
 | 
			
		||||
    <link rel="dns-prefetch" href="https://api.fonts.coollabs.io" />
 | 
			
		||||
    <link rel="preload" href="https://api.fonts.coollabs.io/css2?family=Inter&display=swap" as="style" />
 | 
			
		||||
    <link rel="preload" href="https://cdn.fonts.coollabs.io/inter/normal/400.woff2" as="style" />
 | 
			
		||||
    <link href="https://api.fonts.coollabs.io/css2?family=Inter&display=swap" rel="stylesheet">
 | 
			
		||||
    <meta name="robots" content="noindex">
 | 
			
		||||
    <title>Coolify</title>
 | 
			
		||||
 
 | 
			
		||||
@@ -209,7 +209,11 @@
 | 
			
		||||
                        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
 | 
			
		||||
 | 
			
		||||
            @else
 | 
			
		||||
            <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='text-white underline' href='https://coolify.io/docs/custom-docker-options'>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')
 | 
			
		||||
                <x-forms.button wire:click="loadComposeFile">Reload Compose File</x-forms.button>
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,7 @@ services:
 | 
			
		||||
      - DATABASE_URL=postgres://postgres:$SERVICE_PASSWORD_POSTGRES@plausible_db/plausible
 | 
			
		||||
      - BASE_URL=$SERVICE_FQDN_PLAUSIBLE
 | 
			
		||||
      - SECRET_KEY_BASE=$SERVICE_BASE64_64_PLAUSIBLE
 | 
			
		||||
      - TOTP_VAULT_KEY=$SERVICE_REALBASE64_TOTP
 | 
			
		||||
    depends_on:
 | 
			
		||||
      - plausible_db
 | 
			
		||||
      - plausible_events_db
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
            "version": "3.12.36"
 | 
			
		||||
        },
 | 
			
		||||
        "v4": {
 | 
			
		||||
            "version": "4.0.0-beta.233"
 | 
			
		||||
            "version": "4.0.0-beta.234"
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user