We’re excited to announce Bytescale now supports any S3‑compatible API for use as external storage. That means whether you’re running MinIO on‑prem, a self‑hosted Ceph cluster, or any other storage service with an S3‑compatible API, you can now plug it straight into Bytescale.
What’s new?
With this update, your team can:
- Plug in any S3‑compatible endpoint either manually via the Bytescale Dashboard or programmatically via the PutFolder API operation.
- Seamlessly integrates with every part of Bytescale, including our File Processing APIs, Storage APIs, CDN, SDKs, and widgets.
- Customizable object keys via settings like customizable object key prefixes and relative vs. absolute path resolution, built to fit your infrastructure needs.
Why you’ll love it
- Freedom to choose – Use any S3‑compatible storage service—self‑hosted, cloud‑hosted, or anything in between.
- Compliance & budget friendly – Select a storage provider that aligns with your data residency, regulatory, or cost requirements
- Full feature parity – Benefit from the same high‑performance media processing APIs and media-optimized CDN provided by Bytescale, even with files stored externally.
- Highly configurable – Fine‑tune object key structures, control how S3 URLs are resolved (subdomain vs. path-style), and specify unsupported operations to prevent Bytescale from using them—ensuring reliable integration with any S3-compatible service.
How to get started
- Head to Folder Settings → Storage Settings in the Bytescale Dashboard.
- Pick Generic S3 as your storage type.
- Provide your endpoint, bucket name, region, credentials, and custom options (
forcePathStyle
,objectKeyPrefix
, etc.). - Save changes—Bytescale will now treat your folder’s storage as an external source.
Alternatively, use the PutFolder operation to create Generic S3 folders programmatically. The configuration payload looks like this:
{
"type": "GenericS3",
"bucket": {
"bucketEndpoint": "https://example.com/foo",
"bucketName": "my-bucket",
"bucketRegion": "auto",
"forcePathStyle": true,
"objectKeyPrefix": "uploads/",
"unsupportedOperations": []
},
"credentials": {
"accessKey": "YOUR_ACCESS_KEY",
"secretKey": "YOUR_SECRET_KEY"
},
"useAbsolutePaths": true
}
Learn more
For full details, check out the docs: