What this covers
How to update an existing Scriptor install to a newer release.
Scriptor itself, iManager (the storage layer Scriptor depends
on), and any plugins all live in vendor/; the update is a
composer update plus, when iManager bumped its schema, a
vendor/bin/imanager schema:migrate.
Before you do anything, back up. The Backup and restore topic covers the recipe; do it before every update, including the small ones.
Walkthrough
Step 1: Take a backup
sqlite3 data/imanager.db ".backup '/tmp/imanager.db.snapshot'"
tar czf /var/backups/scriptor/pre-update-$(date +%Y%m%d-%H%M).tgz \
/tmp/imanager.db.snapshot \
public/uploads/ \
data/settings/custom.scriptor-config.php
rm /tmp/imanager.db.snapshot
Skipping this step is the most common reason an update becomes a problem. See Backup and restore for the full reasoning.
Step 2: Check what is currently installed
composer show bigins/scriptor bigins/imanager
The output tells you the current versions of Scriptor and iManager. Note them down; you will reference them if a roll- back becomes necessary.
For plugins, list them too:
composer show 'bigins/scriptor-*'
Step 3: Update
Native install:
composer update bigins/scriptor bigins/imanager 'bigins/scriptor-*' --with-dependencies
This pulls the latest tags within the version constraints in
your composer.json. To go to a specific version instead, edit
the constraint in composer.json first ("bigins/scriptor": "^2.1.0") and then run composer update bigins/scriptor.
Docker (compose stack):
The Docker workflow bakes Composer dependencies into the image at build time. To update, rebuild the image:
docker compose build --no-cache scriptor
docker compose up -d scriptor
Restart-only (docker compose restart scriptor) does not
update; the existing container's vendor/ is unchanged.
Step 4: Run schema migrations if needed
iManager's CLI has two commands that matter here:
vendor/bin/imanager schema:status
Reports the database schema version against the iManager release's expected version. If it says "up to date", nothing more to do; skip to Step 5.
If it lists pending migrations, apply them:
vendor/bin/imanager schema:migrate
The command runs migrations in order, idempotently. A migration that already ran is skipped. A failing migration stops the run and reports which one.
Since iManager 2.2.1, vendor/bin/imanager fts:rebuild
implicitly runs schema:migrate first when the schema is
behind. For older iManager versions, run schema:migrate
explicitly before fts:rebuild.
Step 5: Rebuild the full-text-search index (when iManager changed searchable fields)
iManager 2.2.0 made the searchable-field defaults smarter, which means an older install that worked correctly may have indexed less than the new release expects. Rebuild after a release that touches FTS:
vendor/bin/imanager fts:rebuild
The release notes for the iManager version you are moving to will say whether this is needed. When in doubt, run it; it is idempotent and takes seconds even on large content trees.
Step 6: Clear OPcache (production)
If you have OPcache enabled in production with
opcache.validate_timestamps=0, PHP keeps running the old
bytecode after the update. Reset it:
php -r "opcache_reset();"
# or, for Docker stacks:
docker compose restart php # whichever service runs PHP-FPM
For Docker, the rebuild in Step 3 already replaced the container; no separate OPcache reset is needed.
Step 7: Smoke-test
A short checklist:
/returns HTTP 200 in an anonymous browser session./editor/shows the login form.- Logging into the editor lands on the dashboard.
- Pages module opens, shows the page tree.
- Clicking a page opens the form with content intact.
- Saving a page (no changes is fine; just the round-trip) succeeds.
/plugins/lists every plugin you expect, with a version that matches whatcomposer showreports.
If all seven pass, the update is good. Keep the pre-update backup for at least a day in case a subtle regression surfaces later.
What to check after
composer show bigins/scriptorreports the new version.vendor/bin/imanager schema:statusreports "up to date".- The smoke-test checklist passes end to end.
- Plugins that were enabled before the update are still enabled (in the Plugins module's main table, not the Disabled section).
Troubleshooting
composer update fails with a "platform requirements" error
The new Scriptor release requires a PHP version your install
does not have. The error names the constraint (e.g. requires php ^8.3). Either upgrade PHP first (the install path you
used decides how) or pin Scriptor to a version that supports
your PHP ("bigins/scriptor": "^2.0" for PHP 8.2 hosts).
composer update succeeds but the site shows a fatal error
A class name or method signature changed between releases and something in your override or theme is referencing the old shape. Look at the error message; it names the file and line. Two options:
- Fix the reference. Update your theme or override to match the new API. The release notes are the canonical reference for what changed.
- Roll back. Restore the pre-update backup
(
composer.lock+ the database snapshot from Step 1), then pin the constraint to the working version before retrying.
schema:migrate fails partway
The output names the failing migration. Common causes:
- Database is on read-only filesystem. Common on Docker bind-mounts with the wrong ownership. Fix the mount and retry; migrations are idempotent.
- A custom plugin's data violates a new constraint. The new schema added a NOT NULL column or a UNIQUE constraint that existing rows violate. The release notes call this out; the fix is to clean the offending rows first and then retry.
When in doubt, restore the pre-update backup and pin to the old version while you investigate.
Plugins module shows my plugin disappeared after update
composer update resolves the same constraint to a newer
release if the plugin uses a wide range ("^1"). If the new
release is incompatible with the Scriptor version you ended
up on, the plugin would fail to boot and disappear from the
table. Three checks:
composer show bigins/scriptor-<plugin>: is it still invendor/?data/logs/scriptor.log: does it show a boot error for that plugin?- The plugin's CHANGELOG: does it support the Scriptor version you are on?
Pin the plugin to a known-good version while you work it out.
See also
- Backup and restore: the pre-update step you skip at your peril
- Installed plugins: what to check about plugin compatibility before and after the update
- Logs and troubleshooting: where the post-update errors show up
- iManager CHANGELOG:
the source of truth for which release wants
schema:migratevs.fts:rebuild docs/install.mdin the Scriptor repo: the install command this topic does not need to re-run (install refuses on a seeded database)