Updates
jekcms ships core, theme, and plugin updates through a single signed channel. The admin panel at admin/updates.php shows what's available, lets you apply it, and keeps five rolling backups so you can roll back if anything goes wrong.
How the update check works
Every jekcms install pings the update server once every six hours (or immediately when you click Check for updates). The flow:
- Your site sends its current version, license key, and PHP version to
/api/v1/updates/check.phpon the jekcms update server - The server compares against
version.json(the authoritative manifest of every release) and returns a list of applicable updates - Results are cached in the
updatestable — the admin dashboard reads from there, so the banner appears instantly without a live request
The check covers three things: the jekcms core, any installed themes from the official marketplace, and any installed plugins. Third-party plugins that point at their own update URL use the same pipeline with their own manifest.
The "Update available" banner
When an update is pending, a yellow banner appears at the top of every admin page. It shows the new version number, release date, and a View details link that opens the release notes in a modal. The banner is dismissible per-user but reappears on the next version.
Click Update now to go straight to admin/updates.php. Click Release notes to read what changed before committing.
Automatic backup before update
Every update runs a pre-update backup automatically. You cannot disable this for core updates — it's there to save you when something goes sideways.
What gets backed up:
- The full codebase (everything under the install root except
storage/cacheandstorage/logs) - A mysqldump of the database
- The current
config/config.php
Backups are stored under storage/backups/update-YYYY-MM-DD-HHMMSS/ and the last five are retained. When a sixth backup is created, the oldest is deleted automatically. If you need longer retention, copy the folder elsewhere before the next update runs.
Rolling back
Go to admin/updates.php → Backups tab. Each row shows timestamp, from-version, to-version, and size. Click Restore on any row and confirm. The restore:
- Puts the site into maintenance mode
- Restores files from the backup folder
- Imports the database dump
- Lifts maintenance mode
Expect 30 seconds to two minutes depending on DB size. You stay logged in — the admin session survives the restore.
Manual ZIP upload
If your server can't reach the update server (air-gapped, strict firewall, staging box), download the update ZIP manually from your account dashboard on jekcms.com and upload it via Updates → Upload manually. The uploader runs the exact same verification and backup pipeline as the automatic update — nothing is skipped.
Signed manifest verification
Every update ZIP ships with a manifest.json and a detached signature signed by the jekcms release key. Before a single file is written, jekcms:
- Verifies the signature matches the embedded public key
- Recomputes SHA-256 hashes for every file in the ZIP and compares to the manifest
- Rejects the whole update if anything mismatches
This blocks tampered mirrors. If someone hosts a "free" jekcms update on a pirate site with a backdoor added, the signature check fails and the update refuses to install. You'll see Signature verification failed — refusing to proceed in the log.
Auto vs manual update mode
Under Settings → Updates you choose one of three modes:
- Manual — Check only, never apply. You click Update now yourself.
- Security only — Auto-apply releases flagged
security: truein the manifest. Everything else waits. - Automatic — Auto-apply every update on the nightly cron run.
Production sites with custom code should stay on Manual or Security only. Hobby sites can safely run Automatic.
Update-in-progress lock
When an update starts, jekcms writes storage/locks/update.lock with the PID and timestamp. A second update attempt (from another admin, or a cron run overlapping a manual run) sees the lock and exits immediately with Update already in progress. The lock releases when the update finishes — success or failure.
If an update crashes mid-run and leaves a stale lock, delete storage/locks/update.lock manually and run the update again. The backup from the failed attempt is still usable.
What to do if an update fails
- Read the log at
storage/logs/update.log— the last entry explains why - Common causes: insufficient disk space, PHP memory limit too low, file permission issues on
vendor/orstorage/ - If the site is broken, go to
admin/updates.php→ Backups → Restore the pre-update backup - If you can't reach the admin, restore manually: copy the backup folder back over the install root and
mysql < backup.sql - Post the
update.logtail to support with your license key
Release notes viewer
Every release in version.json includes structured notes: Added, Changed, Fixed, Security, Breaking. The viewer at Updates → History shows every version your site has ever installed with full notes, searchable. Useful when debugging "when did X behavior change" — find the release that flipped it.