Skip to main content
By default Openinary stores files on local disk. Set the STORAGE_* variables to switch to any S3-compatible provider.
The bundled Docker Compose file does not pass these variables through. Its service definitions list no STORAGE_* entries and declare no env_file, so putting them in the root .env has no effect: the container starts without them and silently falls back to local disk.For a Compose deployment, add them to the service’s environment: block yourself:
On a platform that injects environment variables directly (Railway, Coolify, Dokploy), set them there and nothing else is needed. Running from source, they are read from apps/api/.env.
There is no fallback to S3_-prefixed names. Only the exact STORAGE_* names below are read.

Parameters

Quick-start configs

No STORAGE_ENDPOINT needed for AWS S3.
The provider is detected automatically: set STORAGE_ENDPOINT for any non-AWS provider. Leave it unset for standard AWS S3.

Parameter reference

string
default:"auto"
S3 region identifier. Defaults to auto, which is what Cloudflare R2 expects, so AWS and other region-bound providers need this set explicitly.us-east-1 · eu-west-1 · auto (Cloudflare R2)
string
required
Access key ID for your storage provider.
Never commit credentials to version control.
string
required
Secret access key for your storage provider.
Never expose in logs or client-side code.
string
required
Name of the bucket where files are stored.
string
Custom endpoint for non-AWS S3-compatible providers. Omit for standard AWS S3.
string
Public base URL used to construct file URLs. Set this to your CDN or custom domain when you don’t want to expose raw S3 URLs.https://cdn.example.com · https://my-bucket.s3.us-east-1.amazonaws.com

Advanced parameters

integer
default:"50"
Max simultaneous HTTP connections to the storage provider. Increase if you see connection pool exhaustion under load.50 (default) · 100 (high traffic) · 25 (low resource)
integer
default:"0"
Connection timeout in ms. 0 = no timeout.0 · 5000 (5 s) · 10000 (10 s)
integer
default:"0"
Request timeout in ms. 0 = no timeout. For large uploads, use 300000 (5 min) or higher.0 · 30000 (30 s) · 300000 (5 min)
integer
default:"0"
TCP socket timeout in ms. 0 = no timeout.0 · 60000 (1 min) · 120000 (2 min)

Quick Start

Run Openinary with local or S3 storage.

Upload & Cache Warming

Upload files and prewarm transformation cache.