Upgrading

Replace the application files, keep your data and settings, run one command.

Your configuration, branding, wording and data live outside the application files, which is what makes an upgrade a file replacement rather than a migration project.

Replaced by an upgradeKept
app/ bootstrap/ config/ cron/ database/ lang/ public/ resources/ routes/ vendor/ bin/.env, everything under storage/, and the whole database

The upgrade

  1. Back up first. The database and .env at minimum. See backup and restore.
  2. Read the changelog in the new package for anything that needs action.
  3. Upload the new files over the old ones. Do not delete the folder first: that would take .env and storage/ with it. Do not copy the new package's .env.example over your .env.
  4. Apply schema changes: php bin/migrate.php. It is safe to run again: existing tables, columns and indexes are left alone. If you have no shell, ask support for the statements or run them in phpMyAdmin.
  5. Refresh roles and permissions if the changelog says a permission was added: php bin/seed.php. It never touches user accounts or certificates.
  6. Check /admin/diagnostics and open one existing certificate. Two minutes of checking is worth more than any amount of confidence.

Delete nothing under storage/. It holds your branding assets, your certificate background images, your wording overrides and your issued PDFs. An upgrade that starts with an empty storage/ loses all four.

If a version is skipped

Upgrading straight from an older release to the newest is supported. The schema step is cumulative, so one run brings the database to the current shape whatever version you started from. Read the intervening changelog entries, though: a required action in a version you skipped still applies.

Rolling back

Restore the previous package files and the database backup you took in step 1, together. Rolling back the files alone against an upgraded database is not supported: the newer schema may hold columns the older code does not know about, and the older code may write values the newer constraints reject.

Checking what you are running

The version is in the VERSION file in the package root, and in the footer of these documentation pages. If the two disagree, an upload was incomplete.