Elestio Object Storage: S3 Buckets With No Egress Fees
Most Elestio customers I talk to have the same awkward line in their architecture diagram. The apps run on Elestio. The backups, uploads, media files and exports go to a bucket somewhere else, on a different bill, with a different set of keys, and an egress charge that shows up the month a file goes viral.
That line just got shorter. Elestio Object Storage is live: S3-compatible buckets, managed for you, billed from the same Elestio credits as your services, with no fee for data going out. Here's what you get, what it costs, and how to start using it.
What You Get
A bucket on Elestio is a plain S3 bucket. Any tool or SDK that works with Amazon S3 works with it: the AWS CLI, boto3, the AWS SDK for JavaScript, Go, Java, PHP, .NET, rclone, Cyberduck. You point them at storage.elestio.com, set the region to auto, and that's it.
Around that, the dashboard gives you the things you'd normally script yourself:
- A file browser with drag-and-drop upload, folders, previews (images, PDFs, video, audio, text) and temporary share links from 1 minute to 7 days.
- Scoped API keys: read only or read and write, limited to specific folders, IP ranges, or an expiry date.
- Custom domains with HTTPS (
files.yourcompany.com), and optional public read for serving assets. - A recycle bin that keeps deleted files for 7 to 90 days.
- Webhooks on upload, copy, delete and rename, for processing new files or updating a search index.
- CORS rules so your website can upload straight from the browser with temporary links.
Where Your Data Lives
You pick the region when you create the bucket, and it can't be changed later, so choose deliberately:
- Multi-region Europe (Amsterdam, Frankfurt): the default. Copies kept in several cities, data stays in the EU.
- Multi-region US (San Jose, Chicago, Ashburn).
- Global: files follow where they're read. Fast everywhere, but data can be stored outside the EU.
- A single city: Frankfurt, Amsterdam, London, Ashburn, Chicago, San Jose, Singapore or Tokyo.
If GDPR is part of the reason you're on Elestio, Multi-region Europe is the one you want, and it's already selected.
What It Costs
Billing is daily, on real usage. Nothing is free: every GB stored and every request is billed. The thing you don't pay for is data leaving the bucket.
| Item | Elestio, single region or Global | Elestio, multi-region | AWS S3 Standard (us-east-1) |
|---|---|---|---|
| Storage (per GB/month) | $0.02 | $0.025 | $0.023 |
| Writes and lists (per 1,000) | $0.005 | $0.01 | $0.005 |
| Reads (per 1,000) | $0.0005 | $0.0005 | $0.0004 |
| Data transfer out | No charge | No charge | $0.09 per GB (after 100 GB/month) |
AWS figures are list prices from the AWS Price List for US East (N. Virginia), October 2026. The 100 GB of free monthly transfer is shared across all your AWS services.
To make that concrete, take a typical media-heavy app: 1 TB stored, 1 million uploads, 10 million downloads and 2 TB of traffic out per month. At AWS's public list prices for S3 Standard in us-east-1 (October 2026), that's roughly $23 of storage, $9 of requests and about $171 of egress ($0.09/GB after the first 100 GB), so around $203/month. On an Elestio single-region bucket, it's $20 of storage, $10 of requests and nothing for egress: $30/month. Egress is the whole story here.
Limits to know: 10 buckets and 20 API keys per project, and 1 TB of storage per project for paying customers (100 GB during the free trial). The project owner can request more from the Object Storage page.
Create a Bucket and Connect in Two Minutes
In the dashboard, click Object Storage, then Create a new bucket, pick a region and a name. Elestio adds a short random suffix (my-bucket-k7x2qm) and shows you a read and write key. Copy the secret now; it's shown only once.
The bucket's Connect tab has a Copy everything as environment variables button. It gives you this:
export AWS_ACCESS_KEY_ID=<your access key ID>
export AWS_SECRET_ACCESS_KEY=<your secret>
export AWS_ENDPOINT_URL_S3=https://storage.elestio.com
export AWS_REGION=auto
export BUCKET=my-bucket-k7x2qm
Recent AWS CLI versions read AWS_ENDPOINT_URL_S3 automatically, so this just works:
aws s3 cp ./photo.jpg s3://$BUCKET/photos/photo.jpg
aws s3 ls s3://$BUCKET/photos/
The Connect tab also has ready-to-run snippets for Node.js, Python, PHP, Go, Ruby, Java, .NET and rclone.
Bonus: A Bucket as a Linux Disk
Infinidisk, Elestio's companion tool, mounts a bucket as a regular Linux disk on any service. Compression is on by default, and you can add encryption at rest, snapshots and point-in-time recovery. Writes land locally first and reach the bucket in checkpoints about every 60 seconds, so read the docs before you put a busy database on it.
Troubleshooting
"Access Denied" from an SDK. Check that the bucket name includes its random suffix, the region is auto, and the key has permission on that bucket (and folder, if restricted).
Custom domain won't activate. The CNAME must point to the target shown in the dashboard. On Cloudflare, set it to DNS only (grey cloud), not proxied.
Browser uploads fail. Add your site under Settings > CORS with PUT allowed, and generate the upload link from your backend.
Uploads suddenly blocked. The project hit its storage quota. Reads and deletes still work; request more from the Object Storage page.
Deleted the wrong file. If the recycle bin was on, restore it from Deleted files. Deleting a whole bucket is final, recycle bin or not.
Go Try It
Open your Elestio dashboard, click Object Storage, and create your first bucket. The full documentation is at docs.elest.io/platform/object-storage.
Thanks for reading ❤️ See you in the next one 👋