All documentation
Getting started

Runtimes

Five runtimes, each with its own build, process model, and Nginx configuration.

Laravel

Runs composer install, caches config, routes, and views, and optionally runs artisan migrate --force, a per-site setting that is on by default. The site gets its own PHP-FPM pool and an Nginx vhost with public/ as the document root. PHP 8.1 to 8.5, 8.5 by default.

Creating a Laravel site also creates a cron entry for the framework scheduler. It is tied to the site, so it runs as the site's own account, in the current release, with the site's pinned PHP:

* * * * *   php artisan schedule:run

If your repository schedules nothing, delete the entry from the server’s Processes view.

Laravel is the only runtime with a maintenance mode Provisore can switch. See Nginx & access control.

PHP (generic)

Any Composer project. The same per-site PHP-FPM pool as Laravel, with a configurable document root and no framework commands.

Node

Node 22, 24, or 26, installed with fnm so sites on one server can use different versions. New sites get 24, the active LTS. 26 is offered but does not enter LTS until October 2026. Your build command runs, then your start command runs as a supervised systemd service behind an Nginx reverse proxy. That covers Next.js, Nuxt, SvelteKit, or a plain HTTP server.

A .nvmrc, .node-version or an engines range in your repository overrides the version set on the site. Pin Node 20 and you still get it, though it is past end of life upstream and not offered for new sites. Pin a major Provisore does not carry and the build runs on 24, with a line in the deploy log saying so.

Static

A Node toolchain builds the site and Nginx serves the output directory directly. There is no application process to restart.

Swift

Vapor or Hummingbird, built with swift build -c release and run as a systemd service behind Nginx. The toolchain is downloaded when a site first needs it, verified against a pinned signing key, and installed under /opt/provisore/swift/<version> so several sites can share it. A .swift-version file in the repository overrides the version set on the site, which in turn overrides the default of Swift 6.4.0.

The service listens on 127.0.0.1 at a port Provisore assigns, given to it three ways: the arguments --hostname 127.0.0.1 --port <port>, after serve for a Vapor app, which Vapor reads; HTTP_HOST and HTTP_PORT, which Hummingbird reads through swift-configuration; and PORT. An app that reads its address any other way, or whose argument parser rejects those two flags, needs its own start command, set with provisore sites update --start-command. A .env that sets one of these variables to another port overrides Provisore’s and fails the health check, which probes the assigned port.

  • On Ubuntu 26.04, Swift 6.4.0 or newer. swift.org builds no earlier 26.04 toolchain, and a deploy asking for one stops with that message. 24.04 goes back further.
  • Write an x.y.0 release in full: swift.org publishes 6.4.0 as 6.4.0, not 6.4, and the shorter spelling names no download.
  • Release builds need about 4 GB of RAM including swap. Below that, or if the disk cannot hold the toolchain, the build stops before it starts.
  • A failed deploy re-downloads the toolchain on the next attempt. The archive is around 1 GB and is not cached between attempts.

Changing PHP version

Sites on one server can run different PHP versions at the same time, each with its own FPM pool and socket. Switch a site from its inspector or from Settings, PHP version. Switching installs the version if the server does not have it, writes the new pool and reloads it while the old one is still serving, checks that the site responds, and then removes the old pool.

The new version is recorded once the site responds on it. If the check fails, the site goes back to its previous version and the switch is reported as failed. Expect a 502 window of roughly 75 ms while the socket moves from the old pool to the new one.

A switch is refused if the target version lacks an extension that the current version loads. Install the extension for the target version, then switch.

Third-party PHP packages

When Ubuntu’s own archive has no package for the requested PHP version, Provisore adds a third-party source: ondrej/php on 24.04, deb.sury.org/php on 26.04. Its signing key is checked against a pinned fingerprint. Unattended upgrades install that source’s security fixes as well as Ubuntu’s, and the PHP version Ubuntu ships stays on Ubuntu’s own builds. Each release carries exactly one PHP version in its own archive: 8.3 on 24.04 and 8.5 on 26.04. A site on that version adds no source; every other version does. Since new sites default to PHP 8.5, that means a default site adds no source on 26.04 and does add one on 24.04.