diff --git a/app/Events/ServiceStatusChanged.php b/app/Events/ServiceStatusChanged.php index dc965d0a2..a86a8b02d 100644 --- a/app/Events/ServiceStatusChanged.php +++ b/app/Events/ServiceStatusChanged.php @@ -27,7 +27,7 @@ public function __construct($userId = null) public function broadcastOn(): ?array { - if ($this->userId) { + if (! is_null($this->userId)) { return [ new PrivateChannel("user.{$this->userId}"), ]; diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 9607cffec..d382dedfe 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -65,7 +65,7 @@ public function register(): void if ($e instanceof RuntimeException) { return; } - $this->settings = InstanceSettings::get(); + $this->settings = view()->shared('instanceSettings'); if ($this->settings->do_not_track) { return; } diff --git a/app/Http/Controllers/Api/OtherController.php b/app/Http/Controllers/Api/OtherController.php index 96dded3ce..917ccc857 100644 --- a/app/Http/Controllers/Api/OtherController.php +++ b/app/Http/Controllers/Api/OtherController.php @@ -3,7 +3,6 @@ namespace App\Http\Controllers\Api; use App\Http\Controllers\Controller; -use App\Models\InstanceSettings; use Illuminate\Http\Request; use Illuminate\Support\Facades\Http; use OpenApi\Attributes as OA; @@ -85,7 +84,7 @@ public function enable_api(Request $request) if ($teamId !== '0') { return response()->json(['message' => 'You are not allowed to enable the API.'], 403); } - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); $settings->update(['is_api_enabled' => true]); return response()->json(['message' => 'API enabled.'], 200); @@ -136,7 +135,7 @@ public function disable_api(Request $request) if ($teamId !== '0') { return response()->json(['message' => 'You are not allowed to disable the API.'], 403); } - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); $settings->update(['is_api_enabled' => false]); return response()->json(['message' => 'API disabled.'], 200); diff --git a/app/Http/Controllers/Api/ServersController.php b/app/Http/Controllers/Api/ServersController.php index 247a2519f..870824e9a 100644 --- a/app/Http/Controllers/Api/ServersController.php +++ b/app/Http/Controllers/Api/ServersController.php @@ -4,7 +4,6 @@ use App\Http\Controllers\Controller; use App\Models\Application; -use App\Models\InstanceSettings; use App\Models\Project; use App\Models\Server as ModelsServer; use Illuminate\Http\Request; @@ -301,7 +300,7 @@ public function domains_by_server(Request $request) $projects = Project::where('team_id', $teamId)->get(); $domains = collect(); $applications = $projects->pluck('applications')->flatten(); - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); if ($applications->count() > 0) { foreach ($applications as $application) { $ip = $application->destination->server->ip; diff --git a/app/Http/Middleware/ApiAllowed.php b/app/Http/Middleware/ApiAllowed.php index dc0a433e2..36ac6cb9c 100644 --- a/app/Http/Middleware/ApiAllowed.php +++ b/app/Http/Middleware/ApiAllowed.php @@ -2,7 +2,6 @@ namespace App\Http\Middleware; -use App\Models\InstanceSettings; use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; @@ -15,7 +14,7 @@ public function handle(Request $request, Closure $next): Response if (isCloud()) { return $next($request); } - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); if ($settings->is_api_enabled === false) { return response()->json(['success' => true, 'message' => 'API is disabled.'], 403); } diff --git a/app/Jobs/PullCoolifyImageJob.php b/app/Jobs/PullCoolifyImageJob.php index 2bcbfc4df..c8bb5f7ef 100644 --- a/app/Jobs/PullCoolifyImageJob.php +++ b/app/Jobs/PullCoolifyImageJob.php @@ -2,7 +2,6 @@ namespace App\Jobs; -use App\Models\InstanceSettings; use App\Models\Server; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeEncrypted; @@ -36,7 +35,7 @@ public function handle(): void $latest_version = get_latest_version_of_coolify(); instant_remote_process(["docker pull -q ghcr.io/coollabsio/coolify:{$latest_version}"], $server, false); - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); $current_version = config('version'); if (! $settings->is_auto_update_enabled) { return; diff --git a/app/Livewire/Help.php b/app/Livewire/Help.php index 2fbd2bc7e..465332cb0 100644 --- a/app/Livewire/Help.php +++ b/app/Livewire/Help.php @@ -2,7 +2,6 @@ namespace App\Livewire; -use App\Models\InstanceSettings; use DanHarrin\LivewireRateLimiting\WithRateLimiting; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Support\Facades\Http; @@ -48,7 +47,7 @@ public function submit() ] ); $mail->subject("[HELP]: {$this->subject}"); - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); $type = set_transanctional_email_settings($settings); if (! $type) { $url = 'https://app.coolify.io/api/feedback'; diff --git a/app/Livewire/Notifications/Email.php b/app/Livewire/Notifications/Email.php index 91c108edc..c694acf5d 100644 --- a/app/Livewire/Notifications/Email.php +++ b/app/Livewire/Notifications/Email.php @@ -2,7 +2,6 @@ namespace App\Livewire\Notifications; -use App\Models\InstanceSettings; use App\Models\Team; use App\Notifications\Test; use Livewire\Component; @@ -173,7 +172,7 @@ public function submitResend() public function copyFromInstanceSettings() { - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); if ($settings->smtp_enabled) { $team = currentTeam(); $team->update([ diff --git a/app/Livewire/Project/Shared/Tags.php b/app/Livewire/Project/Shared/Tags.php index 85d5c21dc..dca6180ff 100644 --- a/app/Livewire/Project/Shared/Tags.php +++ b/app/Livewire/Project/Shared/Tags.php @@ -3,32 +3,63 @@ namespace App\Livewire\Project\Shared; use App\Models\Tag; +use Livewire\Attributes\Validate; use Livewire\Component; +// Refactored ✅ class Tags extends Component { public $resource = null; - public ?string $new_tag = null; + #[Validate('required|string|min:2')] + public string $newTags; public $tags = []; - protected $listeners = [ - 'refresh' => '$refresh', - ]; - - protected $rules = [ - 'resource.tags.*.name' => 'required|string|min:2', - 'new_tag' => 'required|string|min:2', - ]; - - protected $validationAttributes = [ - 'new_tag' => 'tag', - ]; + public $filteredTags = []; public function mount() + { + $this->loadTags(); + } + + public function loadTags() { $this->tags = Tag::ownedByCurrentTeam()->get(); + $this->filteredTags = $this->tags->filter(function ($tag) { + return ! $this->resource->tags->contains($tag); + }); + } + + public function submit() + { + try { + $this->validate(); + $tags = str($this->newTags)->trim()->explode(' '); + foreach ($tags as $tag) { + if (strlen($tag) < 2) { + $this->dispatch('error', 'Invalid tag.', "Tag $tag is invalid. Min length is 2."); + + continue; + } + if ($this->resource->tags()->where('name', $tag)->exists()) { + $this->dispatch('error', 'Duplicate tags.', "Tag $tag already added."); + + continue; + } + $found = Tag::ownedByCurrentTeam()->where(['name' => $tag])->exists(); + if (! $found) { + $found = Tag::create([ + 'name' => $tag, + 'team_id' => currentTeam()->id, + ]); + } + $this->resource->tags()->attach($found->id); + } + $this->refresh(); + } catch (\Exception $e) { + return handleError($e, $this); + } } public function addTag(string $id, string $name) @@ -39,8 +70,9 @@ public function addTag(string $id, string $name) return; } - $this->resource->tags()->syncWithoutDetaching($id); + $this->resource->tags()->attach($id); $this->refresh(); + $this->dispatch('success', 'Tag added.'); } catch (\Exception $e) { return handleError($e, $this); } @@ -50,12 +82,12 @@ public function deleteTag(string $id) { try { $this->resource->tags()->detach($id); - - $found_more_tags = Tag::where(['id' => $id, 'team_id' => currentTeam()->id])->first(); - if ($found_more_tags->applications()->count() == 0 && $found_more_tags->services()->count() == 0) { + $found_more_tags = Tag::ownedByCurrentTeam()->find($id); + if ($found_more_tags && $found_more_tags->applications()->count() == 0 && $found_more_tags->services()->count() == 0) { $found_more_tags->delete(); } $this->refresh(); + $this->dispatch('success', 'Tag deleted.'); } catch (\Exception $e) { return handleError($e, $this); } @@ -63,41 +95,8 @@ public function deleteTag(string $id) public function refresh() { - $this->resource->load(['tags']); - $this->tags = Tag::ownedByCurrentTeam()->get(); - $this->new_tag = null; - } - - public function submit() - { - try { - $this->validate([ - 'new_tag' => 'required|string|min:2', - ]); - $tags = str($this->new_tag)->trim()->explode(' '); - foreach ($tags as $tag) { - if ($this->resource->tags()->where('name', $tag)->exists()) { - $this->dispatch('error', 'Duplicate tags.', "Tag $tag already added."); - - continue; - } - $found = Tag::where(['name' => $tag, 'team_id' => currentTeam()->id])->first(); - if (! $found) { - $found = Tag::create([ - 'name' => $tag, - 'team_id' => currentTeam()->id, - ]); - } - $this->resource->tags()->syncWithoutDetaching($found->id); - } - $this->refresh(); - } catch (\Exception $e) { - return handleError($e, $this); - } - } - - public function render() - { - return view('livewire.project.shared.tags'); + $this->resource->refresh(); // Remove this when legacy_model_binding is false + $this->loadTags(); + $this->reset('newTags'); } } diff --git a/app/Livewire/Project/Shared/Webhooks.php b/app/Livewire/Project/Shared/Webhooks.php index e96bd888e..aab1fdc47 100644 --- a/app/Livewire/Project/Shared/Webhooks.php +++ b/app/Livewire/Project/Shared/Webhooks.php @@ -4,49 +4,61 @@ use Livewire\Component; +// Refactored ✅ class Webhooks extends Component { public $resource; - public ?string $deploywebhook = null; + public ?string $deploywebhook; - public ?string $githubManualWebhook = null; + public ?string $githubManualWebhook; - public ?string $gitlabManualWebhook = null; + public ?string $gitlabManualWebhook; - public ?string $bitbucketManualWebhook = null; + public ?string $bitbucketManualWebhook; - public ?string $giteaManualWebhook = null; + public ?string $giteaManualWebhook; - protected $rules = [ - 'resource.manual_webhook_secret_github' => 'nullable|string', - 'resource.manual_webhook_secret_gitlab' => 'nullable|string', - 'resource.manual_webhook_secret_bitbucket' => 'nullable|string', - 'resource.manual_webhook_secret_gitea' => 'nullable|string', - ]; + public ?string $githubManualWebhookSecret = null; - public function saveSecret() + public ?string $gitlabManualWebhookSecret = null; + + public ?string $bitbucketManualWebhookSecret = null; + + public ?string $giteaManualWebhookSecret = null; + + public function mount() + { + // ray()->clearAll(); + // ray()->showQueries(); + $this->deploywebhook = generateDeployWebhook($this->resource); + + $this->githubManualWebhookSecret = data_get($this->resource, 'manual_webhook_secret_github'); + $this->githubManualWebhook = generateGitManualWebhook($this->resource, 'github'); + + $this->gitlabManualWebhookSecret = data_get($this->resource, 'manual_webhook_secret_gitlab'); + $this->gitlabManualWebhook = generateGitManualWebhook($this->resource, 'gitlab'); + + $this->bitbucketManualWebhookSecret = data_get($this->resource, 'manual_webhook_secret_bitbucket'); + $this->bitbucketManualWebhook = generateGitManualWebhook($this->resource, 'bitbucket'); + + $this->giteaManualWebhookSecret = data_get($this->resource, 'manual_webhook_secret_gitea'); + $this->giteaManualWebhook = generateGitManualWebhook($this->resource, 'gitea'); + } + + public function submit() { try { - $this->validate(); - $this->resource->save(); + $this->authorize('update', $this->resource); + $this->resource->update([ + 'manual_webhook_secret_github' => $this->githubManualWebhookSecret, + 'manual_webhook_secret_gitlab' => $this->gitlabManualWebhookSecret, + 'manual_webhook_secret_bitbucket' => $this->bitbucketManualWebhookSecret, + 'manual_webhook_secret_gitea' => $this->giteaManualWebhookSecret, + ]); $this->dispatch('success', 'Secret Saved.'); } catch (\Exception $e) { return handleError($e, $this); } } - - public function mount() - { - $this->deploywebhook = generateDeployWebhook($this->resource); - $this->githubManualWebhook = generateGitManualWebhook($this->resource, 'github'); - $this->gitlabManualWebhook = generateGitManualWebhook($this->resource, 'gitlab'); - $this->bitbucketManualWebhook = generateGitManualWebhook($this->resource, 'bitbucket'); - $this->giteaManualWebhook = generateGitManualWebhook($this->resource, 'gitea'); - } - - public function render() - { - return view('livewire.project.shared.webhooks'); - } } diff --git a/app/Livewire/Settings/Index.php b/app/Livewire/Settings/Index.php index f6f918933..044f78016 100644 --- a/app/Livewire/Settings/Index.php +++ b/app/Livewire/Settings/Index.php @@ -18,7 +18,7 @@ class Index extends Component public function mount() { if (isInstanceAdmin()) { - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); $database = StandalonePostgresql::whereName('coolify-db')->first(); $s3s = S3Storage::whereTeamId(0)->get() ?? []; if ($database) { diff --git a/app/Livewire/Settings/License.php b/app/Livewire/Settings/License.php index 212bc95be..dce8e4477 100644 --- a/app/Livewire/Settings/License.php +++ b/app/Livewire/Settings/License.php @@ -29,7 +29,7 @@ public function mount() abort(404); } $this->instance_id = config('app.id'); - $this->settings = InstanceSettings::get(); + $this->settings = view()->shared('instanceSettings'); } public function render() diff --git a/app/Livewire/Source/Github/Change.php b/app/Livewire/Source/Github/Change.php index ee28f8847..09455e6a1 100644 --- a/app/Livewire/Source/Github/Change.php +++ b/app/Livewire/Source/Github/Change.php @@ -4,7 +4,6 @@ use App\Jobs\GithubAppPermissionJob; use App\Models\GithubApp; -use App\Models\InstanceSettings; use Illuminate\Support\Facades\Http; use Livewire\Component; @@ -100,7 +99,7 @@ public function mount() return redirect()->route('source.all'); } $this->applications = $this->github_app->applications; - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); $this->github_app->makeVisible('client_secret')->makeVisible('webhook_secret'); $this->name = str($this->github_app->name)->kebab(); diff --git a/app/Livewire/Subscription/Index.php b/app/Livewire/Subscription/Index.php index c072352fe..365e6a391 100644 --- a/app/Livewire/Subscription/Index.php +++ b/app/Livewire/Subscription/Index.php @@ -23,7 +23,7 @@ public function mount() if (data_get(currentTeam(), 'subscription') && isSubscriptionActive()) { return redirect()->route('subscription.show'); } - $this->settings = InstanceSettings::get(); + $this->settings = view()->shared('instanceSettings'); $this->alreadySubscribed = currentTeam()->subscription()->exists(); } diff --git a/app/Models/Server.php b/app/Models/Server.php index 2efc9907b..7ab04f05e 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -318,7 +318,7 @@ public function setupDefault404Redirect() public function setupDynamicProxyConfiguration() { - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); $dynamic_config_path = $this->proxyPath().'/dynamic'; if ($this->proxyType() === 'TRAEFIK_V2') { $file = "$dynamic_config_path/coolify.yaml"; diff --git a/app/Notifications/Channels/TransactionalEmailChannel.php b/app/Notifications/Channels/TransactionalEmailChannel.php index 3d7b7c8d0..49bebd692 100644 --- a/app/Notifications/Channels/TransactionalEmailChannel.php +++ b/app/Notifications/Channels/TransactionalEmailChannel.php @@ -2,7 +2,6 @@ namespace App\Notifications\Channels; -use App\Models\InstanceSettings; use App\Models\User; use Exception; use Illuminate\Mail\Message; @@ -14,7 +13,7 @@ class TransactionalEmailChannel { public function send(User $notifiable, Notification $notification): void { - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); if (! data_get($settings, 'smtp_enabled') && ! data_get($settings, 'resend_enabled')) { Log::info('SMTP/Resend not enabled'); diff --git a/app/Notifications/TransactionalEmails/ResetPassword.php b/app/Notifications/TransactionalEmails/ResetPassword.php index 45243c4d5..fcb1ddb75 100644 --- a/app/Notifications/TransactionalEmails/ResetPassword.php +++ b/app/Notifications/TransactionalEmails/ResetPassword.php @@ -18,7 +18,7 @@ class ResetPassword extends Notification public function __construct($token) { - $this->settings = InstanceSettings::get(); + $this->settings = view()->shared('instanceSettings'); $this->token = $token; } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 6822dec13..7fb9d56e7 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,8 +2,10 @@ namespace App\Providers; +use App\Models\InstanceSettings; use App\Models\PersonalAccessToken; use Illuminate\Support\Facades\Http; +use Illuminate\Support\Facades\View; use Illuminate\Support\ServiceProvider; use Laravel\Sanctum\Sanctum; @@ -14,6 +16,7 @@ public function register(): void {} public function boot(): void { Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class); + Http::macro('github', function (string $api_url, ?string $github_access_token = null) { if ($github_access_token) { return Http::withHeaders([ @@ -27,5 +30,9 @@ public function boot(): void ])->baseUrl($api_url); } }); + if (! env('CI')) { + View::share('instanceSettings', InstanceSettings::get()); + } + } } diff --git a/app/Providers/FortifyServiceProvider.php b/app/Providers/FortifyServiceProvider.php index cd6ec7705..bb5dc81f4 100644 --- a/app/Providers/FortifyServiceProvider.php +++ b/app/Providers/FortifyServiceProvider.php @@ -6,7 +6,6 @@ use App\Actions\Fortify\ResetUserPassword; use App\Actions\Fortify\UpdateUserPassword; use App\Actions\Fortify\UpdateUserProfileInformation; -use App\Models\InstanceSettings; use App\Models\OauthSetting; use App\Models\User; use Illuminate\Cache\RateLimiting\Limit; @@ -45,7 +44,7 @@ public function boot(): void { Fortify::createUsersUsing(CreateNewUser::class); Fortify::registerView(function () { - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); if (! $settings->is_registration_enabled) { return redirect()->route('login'); } @@ -57,7 +56,7 @@ public function boot(): void }); Fortify::loginView(function () { - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); $enabled_oauth_providers = OauthSetting::where('enabled', true)->get(); $users = User::count(); if ($users == 0) { diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php index b500154ba..bc1299088 100644 --- a/bootstrap/helpers/shared.php +++ b/bootstrap/helpers/shared.php @@ -244,13 +244,13 @@ function generate_application_name(string $git_repository, string $git_branch, ? function is_transactional_emails_active(): bool { - return isEmailEnabled(InstanceSettings::get()); + return isEmailEnabled(view()->shared('instanceSettings')); } function set_transanctional_email_settings(?InstanceSettings $settings = null): ?string { if (! $settings) { - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); } config()->set('mail.from.address', data_get($settings, 'smtp_from_address')); config()->set('mail.from.name', data_get($settings, 'smtp_from_name')); @@ -284,7 +284,7 @@ function base_ip(): string if (isDev()) { return 'localhost'; } - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); if ($settings->public_ipv4) { return "$settings->public_ipv4"; } @@ -312,7 +312,7 @@ function getFqdnWithoutPort(string $fqdn) */ function base_url(bool $withPort = true): string { - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); if ($settings->fqdn) { return $settings->fqdn; } @@ -379,7 +379,7 @@ function send_internal_notification(string $message): void } function send_user_an_email(MailMessage $mail, string $email, ?string $cc = null): void { - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); $type = set_transanctional_email_settings($settings); if (! $type) { throw new Exception('No email settings found.'); @@ -774,6 +774,8 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal $allServices = get_service_templates(); $topLevelVolumes = collect(data_get($yaml, 'volumes', [])); $topLevelNetworks = collect(data_get($yaml, 'networks', [])); + $topLevelConfigs = collect(data_get($yaml, 'configs', [])); + $topLevelSecrets = collect(data_get($yaml, 'secrets', [])); $services = data_get($yaml, 'services'); $generatedServiceFQDNS = collect([]); @@ -1402,6 +1404,8 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal 'services' => $services->toArray(), 'volumes' => $topLevelVolumes->toArray(), 'networks' => $topLevelNetworks->toArray(), + 'configs' => $topLevelConfigs->toArray(), + 'secrets' => $topLevelSecrets->toArray(), ]; $yaml = data_forget($yaml, 'services.*.volumes.*.content'); $resource->docker_compose_raw = Yaml::dump($yaml, 10, 2); @@ -1441,6 +1445,8 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal } $topLevelNetworks = collect(data_get($yaml, 'networks', [])); + $topLevelConfigs = collect(data_get($yaml, 'configs', [])); + $topLevelSecrets = collect(data_get($yaml, 'secrets', [])); $services = data_get($yaml, 'services'); $generatedServiceFQDNS = collect([]); @@ -2086,6 +2092,8 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal 'services' => $services->toArray(), 'volumes' => $topLevelVolumes->toArray(), 'networks' => $topLevelNetworks->toArray(), + 'configs' => $topLevelConfigs->toArray(), + 'secrets' => $topLevelSecrets->toArray(), ]; if ($isSameDockerComposeFile) { $resource->docker_compose_raw = Yaml::dump($yaml, 10, 2); @@ -2250,7 +2258,7 @@ function validate_dns_entry(string $fqdn, Server $server) if (str($host)->contains('sslip.io')) { return true; } - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); $is_dns_validation_enabled = data_get($settings, 'is_dns_validation_enabled'); if (! $is_dns_validation_enabled) { return true; @@ -2370,7 +2378,7 @@ function checkIfDomainIsAlreadyUsed(Collection|array $domains, ?string $teamId = if ($domainFound) { return true; } - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); if (data_get($settings, 'fqdn')) { $domain = data_get($settings, 'fqdn'); if (str($domain)->endsWith('/')) { @@ -2442,7 +2450,7 @@ function check_domain_usage(ServiceApplication|Application|null $resource = null } } if ($resource) { - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); if (data_get($settings, 'fqdn')) { $domain = data_get($settings, 'fqdn'); if (str($domain)->endsWith('/')) { @@ -2517,7 +2525,7 @@ function get_public_ips() { try { echo "Refreshing public ips!\n"; - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); [$first, $second] = Process::concurrently(function (Pool $pool) { $pool->path(__DIR__)->command('curl -4s https://ifconfig.io'); $pool->path(__DIR__)->command('curl -6s https://ifconfig.io'); diff --git a/config/sentry.php b/config/sentry.php index 46bfddd6f..f08d73156 100644 --- a/config/sentry.php +++ b/config/sentry.php @@ -7,7 +7,7 @@ // 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.310', + 'release' => '4.0.0-beta.311', // When left empty or `null` the Laravel environment will be used 'environment' => config('app.env'), diff --git a/config/version.php b/config/version.php index 4ef54517c..7f08a2b47 100644 --- a/config/version.php +++ b/config/version.php @@ -1,3 +1,3 @@ output(); $ipv4 = trim($ipv4); $ipv4 = filter_var($ipv4, FILTER_VALIDATE_IP); - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); if (is_null($settings->public_ipv4) && $ipv4) { $settings->update(['public_ipv4' => $ipv4]); } $ipv6 = Process::run('curl -6s https://ifconfig.io')->output(); $ipv6 = trim($ipv6); $ipv6 = filter_var($ipv6, FILTER_VALIDATE_IP); - $settings = InstanceSettings::get(); + $settings = view()->shared('instanceSettings'); if (is_null($settings->public_ipv6) && $ipv6) { $settings->update(['public_ipv6' => $ipv6]); } diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile index 4ee3fade2..f46124062 100644 --- a/docker/prod/Dockerfile +++ b/docker/prod/Dockerfile @@ -17,6 +17,7 @@ ARG TARGETPLATFORM # https://github.com/cloudflare/cloudflared/releases ARG CLOUDFLARED_VERSION=2024.4.1 ARG POSTGRES_VERSION=15 +ARG CI=true WORKDIR /var/www/html diff --git a/resources/views/layouts/base.blade.php b/resources/views/layouts/base.blade.php index 744272242..9f3179090 100644 --- a/resources/views/layouts/base.blade.php +++ b/resources/views/layouts/base.blade.php @@ -8,7 +8,7 @@ @use('App\Models\InstanceSettings') @php - $instanceSettings = InstanceSettings::first(); + $instanceSettings = view()->shared('instanceSettings'); $name = null; if ($instanceSettings) { diff --git a/resources/views/livewire/project/application/configuration.blade.php b/resources/views/livewire/project/application/configuration.blade.php index 639776730..feb8c5679 100644 --- a/resources/views/livewire/project/application/configuration.blade.php +++ b/resources/views/livewire/project/application/configuration.blade.php @@ -109,7 +109,7 @@
- +
@@ -133,7 +133,7 @@
- +
diff --git a/resources/views/livewire/project/database/configuration.blade.php b/resources/views/livewire/project/database/configuration.blade.php index aa5b8ec5e..652aec3eb 100644 --- a/resources/views/livewire/project/database/configuration.blade.php +++ b/resources/views/livewire/project/database/configuration.blade.php @@ -99,7 +99,7 @@
- +
diff --git a/resources/views/livewire/project/resource/environment-select.blade.php b/resources/views/livewire/project/resource/environment-select.blade.php index ab160dcda..c03466d28 100644 --- a/resources/views/livewire/project/resource/environment-select.blade.php +++ b/resources/views/livewire/project/resource/environment-select.blade.php @@ -1,5 +1,5 @@ - + @foreach ($environments as $environment)
@else @if (!str($resource->status)->contains('running')) -
Metrics are only available when the application is running!
+
Metrics are only available when this resource is running!
@else diff --git a/resources/views/livewire/project/shared/tags.blade.php b/resources/views/livewire/project/shared/tags.blade.php index 0de2540fd..683731780 100644 --- a/resources/views/livewire/project/shared/tags.blade.php +++ b/resources/views/livewire/project/shared/tags.blade.php @@ -1,10 +1,18 @@

Tags

-
- @if (data_get($this->resource, 'tags')) - @forelse (data_get($this->resource,'tags') as $tagId => $tag) -
+
+
+ +
+ Add +
+ @if (data_get($this->resource, 'tags') && count(data_get($this->resource, 'tags')) > 0) +

Assigned Tags

+
+ @foreach (data_get($this->resource, 'tags') as $tagId => $tag) +
{{ $tag->name }} No tags yet
- @endforelse - @endif -
-
-
- + @endforeach
- Add -
- @if (count($tags) > 0) + @endif + @if (count($filteredTags) > 0)

Exisiting Tags

Click to add quickly
- @foreach ($tags as $tag) + @foreach ($filteredTags as $tag) {{ $tag->name }} @endforeach diff --git a/resources/views/livewire/project/shared/webhooks.blade.php b/resources/views/livewire/project/shared/webhooks.blade.php index 9390082c9..6b9e1c86d 100644 --- a/resources/views/livewire/project/shared/webhooks.blade.php +++ b/resources/views/livewire/project/shared/webhooks.blade.php @@ -13,13 +13,13 @@

Manual Git Webhooks

@if ($githubManualWebhook && $gitlabManualWebhook) -
+
+ label="GitHub Webhook Secret" id="githubManualWebhookSecret">
@@ -31,21 +31,19 @@ + label="GitLab Webhook Secret" id="gitlabManualWebhookSecret">
+ label="Bitbucket Webhook Secret" id="bitbucketManualWebhookSecret">
+ label="Gitea Webhook Secret" id="giteaManualWebhookSecret">
Save diff --git a/versions.json b/versions.json index 752faf982..ca1c6fb50 100644 --- a/versions.json +++ b/versions.json @@ -1,7 +1,7 @@ { "coolify": { "v4": { - "version": "4.0.0-beta.310" + "version": "4.0.0-beta.311" } } }