Storage
Uploads, generated PDFs, evidence photos, and Field PWA assets live on disk. The supported V1 default is the local disk on the same server as PHP. You do not need Amazon S3 to go live.
MySQL rows point at files. A dump without matching storage/app loses evidence and generated PDFs. Never point the domain at backend/storage itself — that would expose logs and .env.
- Default disk:
FILESYSTEM_DISK=localinbackend/.env - Files:
backend/storage/app(private + public subtree), logsbackend/storage/logs - Public window:
backend/public/storage→backend/storage/app/public - Optional S3 overlay: Platform Admin → Settings → Storage / files (
/admin/settings/storage)
Public assets vs private tenant files
Section titled “Public assets vs private tenant files”| Kind | Examples | How it is delivered | How to verify |
|---|---|---|---|
| Public assets | Workspace branding logo under storage/app/public |
Browser URL through public/storage after storage:link |
Open a real branding image while signed in as an admin. It should not 404 |
| Private tenant files | Field evidence photos, TenantFile records | Authenticated application routes, not a public /storage/… URL |
Sign in and open the evidence preview. A 404 on a guessed public URL is not proof that evidence is missing |
storage:link
Section titled “storage:link”The Web Installer runs the symlink as part of storage setup. php artisan veldriq:install also runs storage:link unless you pass --no-storage-link.
cd /path/to/backendphp artisan storage:linkExpected: backend/public/storage exists and points at storage/app/public. The PHP / web user must write backend/storage/ and backend/bootstrap/cache/. Never chmod -R 777.
Upload size
Section titled “Upload size”Limits come from PHP and the host, not from a Veldriq slider. Raise upload_max_filesize and post_max_size in cPanel MultiPHP INI Editor or in the VPS php.ini. On nginx, also raise client_max_body_size if large photos fail with 413. The Storage / files screen has Max upload size (KB) for private TenantFile uploads — that cannot exceed PHP’s limit. A queue worker does not increase those limits.
S3 is optional and not the V1 soak target
Section titled “S3 is optional and not the V1 soak target”Platform Admin → Settings → Storage / files can set Private files disk to S3 / S3-compatible. The driver exists. It is not a validated production target in this release.
Keep FILESYSTEM_DISK=local and Private files disk on Local (shared hosting friendly) unless you complete your own soak. Changing the disk after you already uploaded files does not move those files. Branding logos stay on the public disk regardless.
If it fails
Section titled “If it fails”- 404 on a branding logo → missing symlink; run
storage:linkfrombackend/ - Evidence preview fails while signed in → permissions, disk, or PHP size limits
- HTTP 500 on upload → web user cannot write
storage/ - 413 on large photos → PHP or nginx size limits
Related: Files · Branding · Troubleshooting storage.