Configuration

Files configuration

File manager storage and async thresholds are configured in config/files.php and config/filesystems.php. Env keys are documented under Environment variables; this page explains how disks, URLs, and cleanup interact.

Thresholds (config/files.php)

Config keyEnvDefaultMeaning
duplicate_sync_max_bytesFILES_DUPLICATE_SYNC_MAX_BYTES52428800 (50 MB)Single non-folder files at or below this size are duplicated inline. Folders, bulk selections, and larger files are queued.
zip_ttl_minutesFILES_ZIP_TTL_MINUTES60Prepared zip archives under storage/app/zips expire after this many minutes.
zip_max_bytesFILES_ZIP_MAX_BYTES104857600 (100 MB)Maximum zip payload size enforced by the application.
FILES_DUPLICATE_SYNC_MAX_BYTES=52428800
FILES_ZIP_TTL_MINUTES=60
FILES_ZIP_MAX_BYTES=104857600

Queue dependency

Queued duplicates and zip builds require a running queue worker (queue:listen / queue:work). See Operations.

Filesystem disks (config/filesystems.php)

DiskDriverRoot / notes
locallocalstorage/app/private — default private storage (FILESYSTEM_DISK defaults to local). serve enabled for authenticated streaming patterns.
publiclocalstorage/app/public — URL {APP_URL}/storage. Visibility public.
assetslocalstorage/app/public/assets — public asset files for the file manager. URL uses FILE_PUBLIC_URL_BASE (see below).
s3s3Optional cloud disk; scaffolded with standard AWS_* env vars.

Default disk:

FILESYSTEM_DISK=local
'links' => [
    public_path('storage') => storage_path('app/public'),
],

Create the link once per environment:

php artisan storage:link

Without this link, browsers cannot resolve /storage/... URLs for the public / assets disks.

FILE_PUBLIC_URL_BASE

At the top of config/filesystems.php:

$filePublicBase = rtrim((string) env('FILE_PUBLIC_URL_BASE', env('APP_URL', 'http://localhost')), '/');

The assets disk URL is:

{FILE_PUBLIC_URL_BASE}/storage/assets
VariableFallbackWhen to set
FILE_PUBLIC_URL_BASEAPP_URLCDN or different public origin for asset URLs while the app still runs on another host.
# Optional — omit to use APP_URL
FILE_PUBLIC_URL_BASE=https://cdn.example.com
APP_URL=https://app.example.com

The public disk URL still uses APP_URL directly ({APP_URL}/storage). Keep both consistent unless you intentionally split origins.

Optional S3

.env.example includes AWS scaffolding:

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false

Also supported via config: AWS_URL, AWS_ENDPOINT (path-style endpoints for MinIO and similar).

To use S3 as the default filesystem disk:

  1. Fill AWS credentials and bucket.
  2. Set FILESYSTEM_DISK=s3 (or point specific code paths at the s3 disk).
  3. Confirm URL/visibility behaviour for downloads and thumbnails in your environment.

Not the default path

Local development and the documented file-manager flows assume the local/public/assets disks. Switching to S3 may require additional operational setup (CORS, private object URLs, cleanup of zips/uploads that still use local paths under storage/app).

Cleanup commands

Scheduled in routes/console.php (see Operations):

CommandSchedulePurpose
files:cleanup-uploadshourlyRemoves expired partial/chunked upload sessions and their chunk storage (CleanupStaleFileUploadsCommandFileService::cleanupStaleUploads()).
files:cleanup-zipshourlyRemoves prepared zip downloads older than zip_ttl_minutes (CleanupExpiredFileZipsCommandFileService::cleanupExpiredZips()).

Run manually:

php artisan files:cleanup-uploads
php artisan files:cleanup-zips

JSON and Inertia file-manager endpoints live under /files/* with the can.manage.files middleware. Full route table: Admin API. Data model notes: File tree model.

Previous
Application config