Status: partly automated.deploy/install.shchecks the host, installs dependencies and hands over to the installer; both it andphp artisan installhave been exercised. What has not been verified is the distribution-specific part — the package names and repository setup in step 1 vary by distribution and were not confirmed on each. Treat that step as a guide, and the rest as tested.
The short version
.env, and hands over to php artisan install, which asks for connection
details and verifies each one before writing it.
To see whether a host is ready without changing anything:
When to choose this
You already run PHP applications and have package management, process supervision and TLS handled; or containers are not an option in your environment. If neither applies, the container path is less work and has fewer ways to go subtly wrong.The hard part: PHP 8.4
composer.json requires ^8.4, and no mainstream distribution ships it yet —
Debian 12 has 8.2, Ubuntu 24.04 has 8.3. You will be adding a third-party
repository:
- Debian / Ubuntu — deb.sury.org
- RHEL / Rocky / Alma — Remi
1. Install the runtime
Beyond PHP itself you need the extensions listed in Requirements. Two are easy to miss and fail silently:pcntlandposix— Horizon cannot supervise workers without them. The site keeps serving while no queued job ever runs, so nothing appears broken until someone notices messages go unanswered.
2. Prepare the database
The application creates a PostgreSQL schema per tenant at runtime, so its user needsCREATE on the database — a grant managed-database defaults usually
omit:
3. Deploy the code
npm run build compiles the Vue flow builder. It needs vendor/ to already
exist — the Filament theme imports CSS from there — so keep this order.
Ownership: the web server user needs write access to storage/ and
bootstrap/cache/, and nothing else.
4. Configure
Edit.env:
5. Install the application
platform:install asks for the first tenant slug, administrator email and
password, then provisions the tenant schema and its ACL.
6. Start the services
This is the step that distinguishes a working installation from one that merely loads. See Services for the unit files and the reasoning:7. Web server
Point the document root atpublic/ and pass .php to PHP-FPM. The nginx server
block in docker/nginx/default.conf is a
working reference — adjust fastcgi_pass to your socket.
Terminate TLS here or in front. Whatever does it must forward request bodies
unmodified: webhook signatures are computed over the exact bytes the provider
sent.
8. Verify
Upgrading
What the script does and does not do
deploy/install.sh deliberately stops at the project boundary. It does not
install system packages, add repositories, configure a web server or write
anything under /etc — those decisions belong to whoever owns the host, so the
script reports what is missing and how to get it, then exits.
Everything past dependency installation is php artisan install, where answers
can be validated, connections probed and the whole thing covered by tests. The
same wizard runs inside a container, so both deployment methods configure the
application identically.
Still planned: release tarballs with vendor/ and compiled assets included,
which would remove Composer and Node from the host entirely.
Related
- Deployment overview
- Requirements
- Long-running services
- Docker Compose — less work if containers are an option