Amazon S3
Cloudflare R2
Wasabi
Backblaze B2
DigitalOcean Spaces
Hetzner Object Storage
Google Cloud Storage
Scaleway
OVHcloud
IDrive e2
MinIO
Any S3-compatible
By default a server stores files in CloudFile storage, which counts towards your plan. You can instead connect your own S3-compatible bucket. SFTP and FTP uploads then go straight into it, and the storage is billed by your provider, not by us. This works on every plan.
Connect a bucket
- Go to Storage and click Add bucket.
- Pick your provider. We fill in the endpoint and region format for you.
- Enter the bucket name, access key ID and secret access key.
- Click Test connection. We write a small
.cloudfile-checkfile, read it back, list the bucket and delete the file again. - Save.
Then open a server, go to Settings → Storage, pick the bucket and save. You can also pick it when you create a server.
Each provider below has a step-by-step setup guide. Any other service that speaks the S3 API works too: pick Other S3-compatible.
Choosing a provider
Any of these works the same way in CloudFile. The differences are in pricing and where the data lives:
| Provider | Good for | Notes |
|---|---|---|
| Amazon S3 | Teams already on AWS | Most regions; egress is billed per GB |
| Cloudflare R2 | Servers with heavy downloads | No egress fees; optional EU jurisdiction |
| Wasabi | Long-term archives | No egress fees while monthly downloads stay within stored volume; 90-day minimum storage on pay-as-you-go |
| Backblaze B2 | Low-cost storage | Free egress up to 3× stored data; one region per account |
| DigitalOcean Spaces | Teams already on DigitalOcean | $5/month includes 250 GiB storage and 1 TiB outbound transfer |
| Hetzner Object Storage | EU data residency | Germany and Finland only; monthly price includes a storage and egress quota |
| Google Cloud Storage | Teams already on Google Cloud | Egress is billed per GB; soft delete keeps deleted files (billed) for 7 days by default |
| Scaleway | EU data residency | Paris, Amsterdam, Warsaw and Milan |
| OVHcloud | EU data residency, global reach | Regions in Europe, Canada, Singapore, Australia and India |
| IDrive e2 | Low-cost storage | Regions in the US, Canada, Europe and Asia |
| MinIO | Files on your own hardware | You run the server; it must be reachable over public https |
Where files go
Each SFTP user gets their own folder in the bucket:
<bucket>/<folder>/<username>/<path>
The folder is optional and set per server in Settings → Storage. Leave it empty to put user folders at the root of the bucket. Several servers can share one bucket if each uses a different folder.
Permissions
The access key needs these permissions on the bucket:
| Permission | Used for |
|---|---|
s3:ListBucket |
Listing folders |
s3:GetObject |
Downloads and download links |
s3:PutObject |
Uploads, renames and new folders |
s3:DeleteObject |
Deletes and renames |
s3:AbortMultipartUpload |
Cleaning up interrupted large uploads |
Limit the key to this one bucket. We encrypt the secret key before storing it and never show it again.
Switching storage
You can move a server between CloudFile storage and your buckets at any time. Files are not copied. After the switch, users see what is in the new location. To keep existing files, copy them first, for example with rclone, into <folder>/<username>/.
Deleting a server or a user never deletes files in your bucket.
Quotas and webhooks
User quotas still work on your own bucket and don’t use your plan’s storage. Quota usage is measured by scanning the user’s folder, so very large folders take a little longer to update.
Webhook payloads include a download_url. On your own bucket it’s a presigned link to your bucket, valid for one hour.
Requirements
- The endpoint must use
httpsand be reachable from the internet. - The bucket must already exist. We never create or delete buckets.
- Path-style URLs (
https://endpoint/bucket/key) are used for Cloudflare R2, Google Cloud Storage, IDrive e2, MinIO and Other S3-compatible, and are needed by most self-hosted services such as Ceph. Virtual-hosted URLs (https://bucket.endpoint/key) are used for the other providers. The provider presets pick the right one.