* chore(version): update coolify-realtime to version 1.0.9 in docker-compose and versions files * feat(migration): add is_sentinel_enabled column to server_settings with default true * fix(migration): update default value handling for is_sentinel_enabled column in server_settings * feat(seeder): dispatch StartProxy action for each server in ProductionSeeder * feat(seeder): add CheckAndStartSentinelJob dispatch for each server in ProductionSeeder * fix(seeder): conditionally dispatch CheckAndStartSentinelJob based on server's sentinel status * feat(seeder): conditionally dispatch StartProxy action based on proxy check result * refactor(ui): terminal * refactor(ui): remove terminal header from execute-container-command view * refactor(ui): remove unnecessary padding from deployment, backup, and logs sections * fix(service): disable healthcheck logging for Gotenberg (#6005) * fix(service): Joplin volume name (#5930) * chore(version): update coolify version to 4.0.0-beta.420 and nightly version to 4.0.0-beta.421 * fix(server): update sentinelUpdatedAt assignment to use server's sentinel_updated_at property * feat(service): update Changedetection template (#5937) * chore(service): changedetection remove unused code * fix(service): audiobookshelf healthcheck command (#5993) * refactor(service): update Hoarder to their new name karakeep (#5964) * fix(service): downgrade Evolution API phone version (#5977) * feat(service): add Miniflux service (#5843) * refactor(service): karakeep naming and formatting * refactor(service): improve miniflux - improve DB url - add depends_on - formatting, naming & order * feat(service): add Pingvin Share service (#5969) * fix(service): pingvinshare-with-clamav - add platform to make clamav work - formatting * feat(auth): Add Discord OAuth Provider (#5552) * feat(auth): Add Clerk OAuth Provider (#5553) * feat(auth): add Zitadel OAuth Provider (#5490) * Update composer.lock * fix(ssh): scp requires square brackets for ipv6 (#6001) * refactor(core): rename API rate limit ENV * refactor(ui): simplify container selection form in execute-container-command view * chore(service): Update Evolution API image to the official one (#6031) * chore(versions): bump coolify versions to v4.0.0-beta.420 and v4.0.0-beta.421 * fix(github): changing github app breaks the webhook. it does not anymore * feat(service): enhance service status handling and UI updates * fix(parser): improve FQDN generation and update environment variable handling * fix(ui): enhance status refresh buttons with loading indicators * fix(ui): update confirmation button text for stopping database and service * fix(routes): update middleware for deploy route to use 'api.ability:deploy' * fix(ui): refine API token creation form and update helper text for clarity * fix(ui): adjust layout of deployments section for improved alignment * chore(dependencies): update composer dependencies to latest versions including resend-laravel to ^0.19.0 and aws-sdk-php to 3.347.0 * refactor(email): streamline SMTP and resend settings logic for improved clarity * fix(ui): adjust project grid layout and refine server border styling for better visibility * fix(ui): update border styling for consistency across components and enhance loading indicators * feat(cleanup): add functionality to delete teams with no members or servers in CleanupStuckedResources command * refactor(invitation): rename methods for consistency and enhance invitation deletion logic * refactor(user): streamline user deletion process and enhance team management logic * fix(ui): add padding to section headers in settings views for improved spacing * fix(ui): reduce gap between input fields in email settings for better alignment * fix(docker): conditionally enable gzip compression in Traefik labels based on configuration * fix(parser): enable gzip compression conditionally for Pocketbase images and streamline service creation logic * fix(ui): update padding for trademarks policy and enhance spacing in advanced settings section * feat(ui): add heart icon and enhance popup messaging for sponsorship support * feat(settings): add sponsorship popup toggle and corresponding database migration * fix(ui): correct closing tag for sponsorship link in layout popups * fix(ui): refine wording in sponsorship donation prompt in layout popups * fix(ui): update navbar icon color and enhance popup layout for sponsorship support * Update resources/views/livewire/project/shared/health-checks.blade.php Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * Update app/Livewire/Subscription/Index.php Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * fix(ui): add target="_blank" to sponsorship links in layout popups for improved user experience * fix(models): refine comment wording in User model for clarity on user deletion criteria * Update app/Providers/RouteServiceProvider.php Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * fix(models): improve user deletion logic in User model to handle team member roles and prevent deletion if user is alone in root team * fix(ui): update wording in sponsorship prompt for clarity and engagement --------- Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Co-authored-by: Khiet Tam Nguyen <86177399+nktnet1@users.noreply.github.com> Co-authored-by: Carsten <BanditsBacon@users.noreply.github.com> Co-authored-by: Alberto Rizzi <48057685+albertorizzi@users.noreply.github.com> Co-authored-by: Jonas Klesen <deklesen@gmail.com> Co-authored-by: Stew Night. <22344601+stewnight@users.noreply.github.com> Co-authored-by: Jeffer Marcelino <jeffersunde72@gmail.com> Co-authored-by: Lucas Eduardo <lucas59356@gmail.com> Co-authored-by: CrazyTim71 <118295691+CrazyTim71@users.noreply.github.com> Co-authored-by: Yassir Elmarissi <yassir.elmarissi@hm.edu> Co-authored-by: Hauke Schnau <hauke@schnau-lilienthal.de> Co-authored-by: Darren Sisson <74752850+djsisson@users.noreply.github.com> Co-authored-by: Alkesh Das <67038642+smad-bro@users.noreply.github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
249 lines
9.5 KiB
PHP
249 lines
9.5 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire\Settings;
|
|
|
|
use App\Jobs\CheckForUpdatesJob;
|
|
use App\Models\InstanceSettings;
|
|
use App\Models\Server;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Livewire\Attributes\Computed;
|
|
use Livewire\Attributes\Validate;
|
|
use Livewire\Component;
|
|
|
|
class Index extends Component
|
|
{
|
|
public InstanceSettings $settings;
|
|
|
|
protected Server $server;
|
|
|
|
#[Validate('boolean')]
|
|
public bool $is_auto_update_enabled;
|
|
|
|
#[Validate('nullable|string|max:255')]
|
|
public ?string $fqdn = null;
|
|
|
|
#[Validate('required|integer|min:1025|max:65535')]
|
|
public int $public_port_min;
|
|
|
|
#[Validate('required|integer|min:1025|max:65535')]
|
|
public int $public_port_max;
|
|
|
|
#[Validate('nullable|string')]
|
|
public ?string $custom_dns_servers = null;
|
|
|
|
#[Validate('nullable|string|max:255')]
|
|
public ?string $instance_name = null;
|
|
|
|
#[Validate('nullable|string')]
|
|
public ?string $allowed_ips = null;
|
|
|
|
#[Validate('nullable|string')]
|
|
public ?string $public_ipv4 = null;
|
|
|
|
#[Validate('nullable|string')]
|
|
public ?string $public_ipv6 = null;
|
|
|
|
#[Validate('string')]
|
|
public string $auto_update_frequency;
|
|
|
|
#[Validate('string|required')]
|
|
public string $update_check_frequency;
|
|
|
|
#[Validate('required|string|timezone')]
|
|
public string $instance_timezone;
|
|
|
|
#[Validate('boolean')]
|
|
public bool $do_not_track;
|
|
|
|
#[Validate('boolean')]
|
|
public bool $is_registration_enabled;
|
|
|
|
#[Validate('boolean')]
|
|
public bool $is_dns_validation_enabled;
|
|
|
|
#[Validate('boolean')]
|
|
public bool $is_api_enabled;
|
|
|
|
#[Validate('boolean')]
|
|
public bool $disable_two_step_confirmation;
|
|
|
|
#[Validate('boolean')]
|
|
public bool $is_sponsorship_popup_enabled;
|
|
|
|
public function render()
|
|
{
|
|
return view('livewire.settings.index');
|
|
}
|
|
|
|
public function mount()
|
|
{
|
|
if (! isInstanceAdmin()) {
|
|
return redirect()->route('dashboard');
|
|
} else {
|
|
$this->settings = instanceSettings();
|
|
$this->fqdn = $this->settings->fqdn;
|
|
$this->public_port_min = $this->settings->public_port_min;
|
|
$this->public_port_max = $this->settings->public_port_max;
|
|
$this->custom_dns_servers = $this->settings->custom_dns_servers;
|
|
$this->instance_name = $this->settings->instance_name;
|
|
$this->allowed_ips = $this->settings->allowed_ips;
|
|
$this->public_ipv4 = $this->settings->public_ipv4;
|
|
$this->public_ipv6 = $this->settings->public_ipv6;
|
|
$this->do_not_track = $this->settings->do_not_track;
|
|
$this->is_auto_update_enabled = $this->settings->is_auto_update_enabled;
|
|
$this->is_registration_enabled = $this->settings->is_registration_enabled;
|
|
$this->is_dns_validation_enabled = $this->settings->is_dns_validation_enabled;
|
|
$this->is_api_enabled = $this->settings->is_api_enabled;
|
|
$this->auto_update_frequency = $this->settings->auto_update_frequency;
|
|
$this->update_check_frequency = $this->settings->update_check_frequency;
|
|
$this->instance_timezone = $this->settings->instance_timezone;
|
|
$this->disable_two_step_confirmation = $this->settings->disable_two_step_confirmation;
|
|
$this->is_sponsorship_popup_enabled = $this->settings->is_sponsorship_popup_enabled;
|
|
}
|
|
}
|
|
|
|
#[Computed]
|
|
public function timezones(): array
|
|
{
|
|
return collect(timezone_identifiers_list())
|
|
->sort()
|
|
->values()
|
|
->toArray();
|
|
}
|
|
|
|
public function instantSave($isSave = true)
|
|
{
|
|
$this->validate();
|
|
if ($this->settings->is_auto_update_enabled === true) {
|
|
$this->validate([
|
|
'auto_update_frequency' => ['required', 'string'],
|
|
]);
|
|
}
|
|
|
|
$this->settings->fqdn = $this->fqdn;
|
|
$this->settings->public_port_min = $this->public_port_min;
|
|
$this->settings->public_port_max = $this->public_port_max;
|
|
$this->settings->custom_dns_servers = $this->custom_dns_servers;
|
|
$this->settings->instance_name = $this->instance_name;
|
|
$this->settings->allowed_ips = $this->allowed_ips;
|
|
$this->settings->public_ipv4 = $this->public_ipv4;
|
|
$this->settings->public_ipv6 = $this->public_ipv6;
|
|
$this->settings->do_not_track = $this->do_not_track;
|
|
$this->settings->is_auto_update_enabled = $this->is_auto_update_enabled;
|
|
$this->settings->is_registration_enabled = $this->is_registration_enabled;
|
|
$this->settings->is_dns_validation_enabled = $this->is_dns_validation_enabled;
|
|
$this->settings->is_api_enabled = $this->is_api_enabled;
|
|
$this->settings->auto_update_frequency = $this->auto_update_frequency;
|
|
$this->settings->update_check_frequency = $this->update_check_frequency;
|
|
$this->settings->disable_two_step_confirmation = $this->disable_two_step_confirmation;
|
|
$this->settings->instance_timezone = $this->instance_timezone;
|
|
$this->settings->is_sponsorship_popup_enabled = $this->is_sponsorship_popup_enabled;
|
|
if ($isSave) {
|
|
$this->settings->save();
|
|
$this->dispatch('success', 'Settings updated!');
|
|
}
|
|
}
|
|
|
|
public function submit()
|
|
{
|
|
try {
|
|
$error_show = false;
|
|
$this->server = Server::findOrFail(0);
|
|
$this->resetErrorBag();
|
|
|
|
if (! validate_timezone($this->instance_timezone)) {
|
|
$this->instance_timezone = config('app.timezone');
|
|
throw new \Exception('Invalid timezone.');
|
|
} else {
|
|
$this->settings->instance_timezone = $this->instance_timezone;
|
|
}
|
|
|
|
if ($this->settings->public_port_min > $this->settings->public_port_max) {
|
|
$this->addError('settings.public_port_min', 'The minimum port must be lower than the maximum port.');
|
|
|
|
return;
|
|
}
|
|
$this->validate();
|
|
|
|
if ($this->is_auto_update_enabled && ! validate_cron_expression($this->auto_update_frequency)) {
|
|
$this->dispatch('error', 'Invalid Cron / Human expression for Auto Update Frequency.');
|
|
if (empty($this->auto_update_frequency)) {
|
|
$this->auto_update_frequency = '0 0 * * *';
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
if (! validate_cron_expression($this->update_check_frequency)) {
|
|
$this->dispatch('error', 'Invalid Cron / Human expression for Update Check Frequency.');
|
|
if (empty($this->update_check_frequency)) {
|
|
$this->update_check_frequency = '0 * * * *';
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
if ($this->settings->is_dns_validation_enabled && $this->settings->fqdn) {
|
|
if (! validate_dns_entry($this->settings->fqdn, $this->server)) {
|
|
$this->dispatch('error', "Validating DNS failed.<br><br>Make sure you have added the DNS records correctly.<br><br>{$this->settings->fqdn}->{$this->server->ip}<br><br>Check this <a target='_blank' class='underline dark:text-white' href='https://coolify.io/docs/knowledge-base/dns-configuration'>documentation</a> for further help.");
|
|
$error_show = true;
|
|
}
|
|
}
|
|
if ($this->settings->fqdn) {
|
|
check_domain_usage(domain: $this->settings->fqdn);
|
|
}
|
|
$this->settings->custom_dns_servers = str($this->settings->custom_dns_servers)->replaceEnd(',', '')->trim();
|
|
$this->settings->custom_dns_servers = str($this->settings->custom_dns_servers)->trim()->explode(',')->map(function ($dns) {
|
|
return str($dns)->trim()->lower();
|
|
});
|
|
$this->settings->custom_dns_servers = $this->settings->custom_dns_servers->unique();
|
|
$this->settings->custom_dns_servers = $this->settings->custom_dns_servers->implode(',');
|
|
|
|
$this->settings->allowed_ips = str($this->settings->allowed_ips)->replaceEnd(',', '')->trim();
|
|
$this->settings->allowed_ips = str($this->settings->allowed_ips)->trim()->explode(',')->map(function ($ip) {
|
|
return str($ip)->trim();
|
|
});
|
|
$this->settings->allowed_ips = $this->settings->allowed_ips->unique();
|
|
$this->settings->allowed_ips = $this->settings->allowed_ips->implode(',');
|
|
|
|
$this->instantSave(isSave: false);
|
|
|
|
$this->settings->save();
|
|
$this->server->setupDynamicProxyConfiguration();
|
|
if (! $error_show) {
|
|
$this->dispatch('success', 'Instance settings updated successfully!');
|
|
}
|
|
} catch (\Exception $e) {
|
|
return handleError($e, $this);
|
|
}
|
|
}
|
|
|
|
public function checkManually()
|
|
{
|
|
CheckForUpdatesJob::dispatchSync();
|
|
$this->dispatch('updateAvailable');
|
|
$settings = instanceSettings();
|
|
if ($settings->new_version_available) {
|
|
$this->dispatch('success', 'New version available!');
|
|
} else {
|
|
$this->dispatch('success', 'No new version available.');
|
|
}
|
|
}
|
|
|
|
public function toggleTwoStepConfirmation($password): bool
|
|
{
|
|
if (! Hash::check($password, Auth::user()->password)) {
|
|
$this->addError('password', 'The provided password is incorrect.');
|
|
|
|
return false;
|
|
}
|
|
|
|
$this->settings->disable_two_step_confirmation = $this->disable_two_step_confirmation = true;
|
|
$this->settings->save();
|
|
$this->dispatch('success', 'Two step confirmation has been disabled.');
|
|
|
|
return true;
|
|
}
|
|
}
|