composer.json, config/, and the packages actually installed —
not against what a typical Laravel application usually needs.
Runtime
PHP 8.4 is the requirement most likely to bite. Debian 12 ships 8.2 and Ubuntu
24.04 ships 8.3, so a bare-metal install needs a third-party repository
(sury.org on Debian/Ubuntu, Remi
on RHEL-family). Container deployments avoid the question entirely.
PHP extensions
Required — the application will not boot without these:pdo,pdo_pgsql— declared incomposer.jsonredis—config/database.phpdefaultsREDIS_CLIENTtophpredis. Usingpredisinstead is possible but untested here; if you switch, setREDIS_CLIENT=predisand add the Composer package.mbstring,intl,bcmath— Laravel 12 and Filamentgd— image handling in the admin panelzip— Composer and export featuresjson,openssl,tokenizer,xml,ctype,fileinfo,curl— Laravel baseline
pcntl,posix— Horizon needs both to supervise workers. Missing them is a quiet failure mode: the application serves pages normally while no queued job ever runs, so incoming messages simply never get a reply.
Database privileges
The application creates and migrates a PostgreSQL schema per tenant at runtime, so its database user needs more than the usual read/write grants:CREATE on the database installs cleanly and then fails when the
first tenant is provisioned.
Two logical connections are configured, landlord and tenant. They may point
at the same PostgreSQL instance and database — the separation is by schema, not
by server — but keeping them separate is supported.
Processes that must run
A working installation is more than a web server. These are separate long-lived processes, and the system is silently degraded without them:
Queues are separated by purpose (
flow.execution, messaging.transactional,
messaging.broadcast, messaging.system, scheduled.triggers, sync.external),
and Horizon must be configured to consume all of them.
Network
- Inbound HTTPS for the admin panel and the builder.
- Inbound HTTPS for webhook delivery, with a certificate that public providers
accept. Telegram rejects
setWebhookon an invalid certificate, so a self-signed one requires the certificate upload flow instead. - Outbound HTTPS to messaging providers and any LLM or RAG endpoint in use.
Resources
There is no benchmark to quote yet, so treat these as starting points rather than sizing guidance:- 2 vCPU / 4 GB RAM for a small single-tenant install with a handful of channels.
- Queue workers dominate memory: each Horizon worker is a full PHP process, and flow execution holds a session while waiting on external calls.
- PostgreSQL grows with conversation history, which is partitioned — see the conversation logging documentation before planning retention.
Related
- Deployment overview — choosing a method
- Local development setup — for working on Core itself, not for running it in production