Skip to content

Storage configuration

The Storage settings screen at /admin/storage controls where Marketix stores uploaded files — branding assets (logos, favicons), generated QR code images, and PDF reports. You can choose between the local container disk or any S3-compatible object storage service.

Storage configuration is persisted via Spatie Laravel Settings under the storage group, overriding the FILESYSTEM_DISK and AWS_* environment defaults at runtime. The secret access key is stored encrypted; it is never returned to the browser.

UI labelSetting keyValues
Storage backenddriverlocal — files stored in storage/app inside the container; s3 — files stored in an S3-compatible bucket.

S3-compatible fields (shown when driver = S3)

Section titled “S3-compatible fields (shown when driver = S3)”
UI labelSetting keyDescription
Access key IDs3_keyIAM or provider-specific access key identifier.
Secret access keys3_secretCorresponding secret. Stored encrypted; leave blank to keep the current value.
Regions3_regionAWS region (e.g. us-east-1) or provider equivalent.
Buckets3_bucketName of the target bucket.
Endpoints3_endpointCustom endpoint URL for non-AWS providers (e.g. https://your-account.r2.cloudflarestorage.com). Leave blank for standard AWS.
Use path-style endpoints3_use_path_styleCheckbox. Enable for providers that require path-style URLs (e.g. MinIO, some Hetzner configurations). Disable for AWS and Cloudflare R2.
ProviderEndpointPath-style
AWS S3(blank)No
Cloudflare R2https://<account>.r2.cloudflarestorage.comNo
MinIOhttps://minio.example.comYes
DigitalOcean Spaceshttps://<region>.digitaloceanspaces.comNo
Hetzner Object Storagehttps://<region>.your-objectstorage.comProvider-dependent

The AWS_* env vars seed the database settings on a fresh install. Once you save from the UI, the database values take precedence.

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

Click Test connection on the Storage settings page to verify credentials without saving. The test:

  1. Builds a temporary S3 disk instance using the values currently in the form (using the stored secret if the secret field is blank).
  2. Writes a small test file (storage-test-<uuid>.txt), reads it back, then deletes it.
  3. Reports success or the error message from the SDK.
SymptomLikely cause
”Storage test failed: NoSuchBucket”The bucket name is wrong or does not exist yet.
”Storage test failed: InvalidAccessKeyId”Access key ID is incorrect or does not have write access to the bucket.
”Storage test failed: SignatureDoesNotMatch”Wrong secret access key. Enter the secret again (the field only updates when a value is typed).
Test passes but images are not publicly accessibleThe bucket or object ACL may not allow public reads. For branding assets to display, the bucket must serve objects publicly, or set visibility = public in your bucket policy.
Wrong endpoint or path-style errors on MinIOEnable Use path-style endpoint and ensure the endpoint URL does not include the bucket name.