mirror of
https://github.com/coollabsio/coolify.git
synced 2026-11-04 10:42:23 +00:00
Read the running version from the container that answers the status request, not from the old page state, so the modal shows success as soon as the new version is up. Hide all Livewire error pages while an upgrade runs. Closes #8024 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
134 lines
3.8 KiB
PHP
134 lines
3.8 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire;
|
|
|
|
use App\Actions\Server\UpdateCoolify;
|
|
use App\Models\InstanceSettings;
|
|
use App\Models\Server;
|
|
use App\Services\CoolifyUpgradeStatus;
|
|
use Livewire\Component;
|
|
|
|
class Upgrade extends Component
|
|
{
|
|
public bool $updateInProgress = false;
|
|
|
|
public bool $isUpgradeAvailable = false;
|
|
|
|
public string $latestVersion = '';
|
|
|
|
public string $currentVersion = '';
|
|
|
|
public bool $devMode = false;
|
|
|
|
public bool $fullButton = false;
|
|
|
|
protected $listeners = ['updateAvailable' => 'checkUpdate'];
|
|
|
|
public function mount()
|
|
{
|
|
$this->refreshUpgradeState();
|
|
}
|
|
|
|
public function checkUpdate()
|
|
{
|
|
try {
|
|
$this->refreshUpgradeState();
|
|
} catch (\Throwable $e) {
|
|
return handleError($e, $this);
|
|
}
|
|
}
|
|
|
|
protected function refreshUpgradeState(): void
|
|
{
|
|
$this->currentVersion = config('constants.coolify.version');
|
|
$this->latestVersion = get_latest_version_of_coolify();
|
|
$this->devMode = isDev();
|
|
|
|
if ($this->devMode) {
|
|
$this->isUpgradeAvailable = true;
|
|
|
|
return;
|
|
}
|
|
|
|
$settings = InstanceSettings::find(0);
|
|
if (data_get($settings, 'update_channel') === 'custom') {
|
|
$this->latestVersion = (string) $settings->update_custom_tag;
|
|
$this->isUpgradeAvailable = $this->fullButton && $this->latestVersion !== '';
|
|
|
|
return;
|
|
}
|
|
|
|
$hasNewerVersion = version_compare($this->latestVersion, $this->currentVersion, '>');
|
|
$newVersionAvailable = (bool) data_get($settings, 'new_version_available', false);
|
|
|
|
if ($settings && $newVersionAvailable && ! $hasNewerVersion) {
|
|
$settings->update(['new_version_available' => false]);
|
|
$newVersionAvailable = false;
|
|
}
|
|
|
|
$this->isUpgradeAvailable = $hasNewerVersion && $newVersionAvailable;
|
|
}
|
|
|
|
public function upgrade()
|
|
{
|
|
try {
|
|
if (! isInstanceAdmin()) {
|
|
abort(403);
|
|
}
|
|
if ($this->updateInProgress) {
|
|
return;
|
|
}
|
|
$this->updateInProgress = true;
|
|
dispatch(function () {
|
|
try {
|
|
UpdateCoolify::run(manual_update: true);
|
|
} catch (\Throwable $e) {
|
|
report($e);
|
|
}
|
|
})->afterResponse();
|
|
|
|
auditLog('ui.instance.upgrade_started', [
|
|
'team_id' => null,
|
|
'resource' => 'instance',
|
|
'from_version' => config('constants.coolify.version'),
|
|
'to_version' => $this->latestVersion,
|
|
]);
|
|
} catch (\Throwable $e) {
|
|
return handleError($e, $this);
|
|
}
|
|
}
|
|
|
|
public function getUpgradeStatus(): array
|
|
{
|
|
// Only root team members can view upgrade status
|
|
if (auth()->user()?->currentTeam()?->id !== 0) {
|
|
return ['status' => 'none'];
|
|
}
|
|
|
|
$server = Server::find(0);
|
|
if (! $server) {
|
|
return ['status' => 'none'];
|
|
}
|
|
|
|
$statusFile = CoolifyUpgradeStatus::FILE;
|
|
|
|
try {
|
|
$content = instant_remote_process(
|
|
["cat {$statusFile} 2>/dev/null || echo ''"],
|
|
$server,
|
|
false
|
|
);
|
|
$content = trim($content ?? '');
|
|
} catch (\Throwable $e) {
|
|
return ['status' => 'none'];
|
|
}
|
|
|
|
return CoolifyUpgradeStatus::fromFile(
|
|
content: $content,
|
|
// The version of the container that answers, not $currentVersion: after the restart, that is still the old version of the page.
|
|
runningVersion: (string) config('constants.coolify.version'),
|
|
targetVersion: $this->latestVersion !== '' ? $this->latestVersion : get_latest_version_of_coolify(),
|
|
);
|
|
}
|
|
}
|