page:recipes:client portal:laravel:tenant workspaces

Host Client Portal with Laravel: Tenant-Scoped Workspaces

Summary

Deploy a client portal built with Laravel on Ample using the multi-tenant relational data pattern. Compute runs the app in an isolated microVM behind a public HTTPS URL, a managed PostgreSQL 16 database is auto-provisioned and injected as DATABASE_URL. Verified on Laravel: a tenant column on every row and query, with a cross-tenant read returning nothing (tenant_isolation=ok). Not separately tested: your tenant model, membership and per-tenant authorization; treat the client portal-specific behavior as your application code.

Representative Queries

Resource Requirements

Infrastructure Requirements

  1. Compute
    • Status: verified
    • Summary: Apps run in isolated x86_64 Firecracker microVMs that auto-pause when idle and wake on request; sizes are the priced VM sizes.
  2. Postgres
    • Status: verified
    • Summary: Managed PostgreSQL 16 runs in its own microVM and is auto-provisioned when an app needs a database and no DATABASE_URL is supplied.

Prerequisites

Tested Configuration

Workflow Steps

  1. Build and Start
    composer install --no-dev from composer.lock, then FrankenPHP serving public/ (php-server with the index.php fallback) reading PORT on the php-8.5 template. The server must bind 0.0.0.0 on PORT.
  2. Implement the Pattern on PostgreSQL
    The fixture's module implements multi-tenant relational data: a tenant column on every row and query, with a cross-tenant read returning nothing (tenant_isolation=ok). Copy the approach into your schema; keep migrations idempotent and run them with --release-command.
  3. Deploy
    Run the synchronous deploy once and read the result (exit 0 live, 1 failed, 2 blocked). Re-running with no change is a no-op.
    ample deploy . --name --public
  4. Verify
    Fetch the live URL and the pattern self-test route(s) (/p/multi-tenant-relational-data) from the example; then run your own checks. On failure read 'ample logs --kind build' then '--kind runtime'. ample logs --kind build

Examples

Success Checks

  1. App responds on its public URL
    • Kind: http_get
    • Path: /
    • Expect: ample canary laravel patterns
  2. Multi-tenant relational data self-test
    • Kind: http_get
    • Path: /p/multi-tenant-relational-data
    • Expect: tenant_isolation=ok

Limitations

Cost Estimate

Note: Always-on monthly price of the tested sizes; apps and databases auto-pause when idle. Buckets are allocation-priced per quota and not included.

Next Actions

  1. Browse Catalog
  2. Search Published Recipes by Intent, Stack and Constraints
  3. Prepare Deployment Plan for an Authorized Project
  4. Read Existing Agent Authentication Setup
  5. Browse Client Portal
  6. Browse Laravel
  7. Browse Multi-Tenant Relational Data
  8. Browse Deploy Web App