Access levels
Three tiers, each enforced by middleware rather than scattered conditionals.
Access levels and the middleware that enforces them
| Tier |
Routes |
Requirement |
| Public |
/, /pricing, /docs |
None |
| Customer |
/app/* |
auth + active account |
| Management |
/admin/* |
auth + active + administrator role |
Suspension is re-checked on every authenticated request, so revoking an account takes effect
immediately for sessions that are already open.
Data layer
PostgreSQL is the primary database in every environment. Schema changes ship as migrations, so a
clean environment needs no manual setup steps.
Production PostgreSQL is an externally managed, long-running service. Application containers
connect to it; they never own its lifecycle, and no database runs inside the app image.
Runtime and deployment
One immutable image is published to the registry and reused for every role.
- Web: non-root Apache with integrated PHP on port 8080, serving the
public/ document root.
- Queue: a separate service running an explicit Artisan worker command.
- Scheduler: a separate service running the Artisan scheduler.
The web container runs on a read-only root filesystem. Application source is immutable; only
Laravel's storage/ and bootstrap/cache/
plus Apache's runtime paths are writable. Health is reported at
/up.
Error triage
Unhandled exceptions are sanitised, fingerprinted, and aggregated in PostgreSQL. Repeat
occurrences increment a counter on the existing record instead of creating noise, and each
aggregate maps to one tracked issue.
Secrets, tokens, passwords, and customer payloads are redacted before anything is written.