Update writes config_update_queued_at and asks the dispatcher for * an immediate run; cron/app_update.php takes the request and runs scripts/update_cli.php in * its own process. Neither column is in the global settings load - one page needs them. * * The column is checked for rather than assumed. This page has to render on an install whose * files are newer than its schema, because that is the state it exists to get people out of. */ $update_queue_available = settingsColumnExists($mysqli, 'config_update_queued_at'); $update_queued_at = null; $cron_last_dispatch_at = null; $update_job = null; if ($update_queue_available) { $update_cron_row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT config_update_queued_at, config_cron_last_dispatch_at FROM settings WHERE company_id = 1")); $update_queued_at = $update_cron_row['config_update_queued_at'] ?? null; $cron_last_dispatch_at = $update_cron_row['config_cron_last_dispatch_at'] ?? null; $update_job = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT cron_job_last_run_at, cron_job_last_status, cron_job_last_error, cron_job_last_error_at FROM cron_jobs WHERE cron_job_name = 'app_update' LIMIT 1")); } // Queueing is only worth offering if something is going to pick the request up $cron_is_running = $update_queue_available && !empty($config_enable_cron) && !empty($cron_last_dispatch_at) && strtotime($cron_last_dispatch_at) > strtotime('-5 minutes'); // version_compare, not > - "2.6.10" is less than "2.6.9" as a plain string comparison, so // the plain comparison silently stops offering database updates once a minor reaches 10. $db_update_available = version_compare(LATEST_DATABASE_VERSION, CURRENT_DATABASE_VERSION, '>'); // Derived from the two commits, not from the list: a force-push or a local commit leaves the // working tree at a different place with nothing to list, and that is still "not up to date" $app_update_available = $latest_version !== '' && $current_version !== '' && $latest_version !== $current_version; ?>

Update

The last update check did not finish
Anything below is from the check before it, so it may be out of date.
Recorded . Check that Git is installed and that the remote is reachable from this server, then clear the error from Maintenance > Cron. The forum can help - include the output above.
Checking for updates. Cron runs the check within a minute; this page refreshes itself. Nothing is going to pick it up - cron has not checked in recently or the master switch is off. See Maintenance > Cron.
Release
Branch
Not the release branch
Database
Commit

Last checked (). Never checked. Check now Checking…

An update was queued at . Cron will start it within a minute; this page will show the new version once it finishes. Nothing is going to pick it up - cron has not checked in recently or the master switch is off. See Maintenance > Cron.
The last queued update did not finish
Recorded . Clear it from Maintenance > Cron once it has been dealt with.

You are up to date

Everything is going to be alright.

Do not update without a backup
A VM snapshot is the safest option - other methods are covered in the docs. Read the changelog first: some releases need manual steps, and this page will not do them for you.
Pending

Application files: commit behind .

Application files: this install has not checked yet, so there may or may not be anything waiting. Queueing an update when there is nothing to do is harmless.

Database: schema is at and this code expects . Parts of the app will error until the update runs.

Queue Update

Queue Update hands the job to cron, which runs scripts/update_cli.php in its own process - it updates the files and then applies every pending migration, with no request timeout, as the user that owns the files. It resets the files to , so local changes to them are lost. A migration that fails part way stops without advancing the recorded version, so it is safe to queue again once the cause is fixed. Cron is not checking in, so a queued update will sit there until it is. This install cannot queue yet. Queueing needs a schema change it has not caught up with, so this one has to be started from a shell: php scripts/update_cli.php, as the user that owns the files. It updates the files and the database in one step, and Queue Update works from then on.

Pending commits
Commit When Description