Pricing Docs

Documentation

The shape of the system, in the order you need it when you are picking it up for the first time.

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.