S3-Compatible Storage
AeroFTP supports Amazon S3 and any S3-compatible object storage service. The S3 protocol has become the de facto standard for cloud object storage, and dozens of providers offer compatible APIs. AeroFTP includes built-in presets for 10 major providers with automatic endpoint configuration, plus support for any custom S3-compatible endpoint including self-hosted MinIO.
Connection Settings

| Field | Value | Notes |
|---|---|---|
| Provider | Preset selection | Auto-fills endpoint and region options |
| Endpoint | Service endpoint URL | Auto-configured from preset, or enter manually |
| Region | AWS region or equivalent | e.g. us-east-1, eu-west-1, auto |
| Access Key | Your access key ID | From the provider's management console |
| Secret Key | Your secret access key | Stored encrypted in the OS keyring |
| Bucket | Target bucket name | Must already exist on the provider |
When you select a provider from the preset dropdown, the endpoint and available regions are populated automatically. For providers with multiple regions (AWS, Wasabi, DigitalOcean), a region selector appears. Selecting a region computes the final endpoint URL from the template.
Provider Presets
AeroFTP includes 10 preconfigured S3 presets. Each preset defines an endpoint URL template where {region} is replaced with your selected region.
| Provider | Endpoint Template | Regions | Free Tier | Notes |
|---|---|---|---|---|
| AWS S3 | s3.{region}.amazonaws.com | 30+ worldwide | 5 GB (12 months) | The original S3 implementation |
| Wasabi | s3.{region}.wasabisys.com | US, EU, AP | None (paid) | No egress fees, S3-compatible |
| Backblaze B2 | s3.{region}.backblazeb2.com | US, EU | 10 GB forever | Affordable, S3-compatible API |
| DigitalOcean Spaces | {region}.digitaloceanspaces.com | NYC, SFO, AMS, SGP, FRA | None (paid) | Integrated CDN, flat pricing |
| Cloudflare R2 | {accountId}.r2.cloudflarestorage.com | Auto-routed | 10 GB forever | No egress fees, see below |
| Storj | gateway.storjshare.io | Global | 25 GB forever | Decentralized, end-to-end encrypted |
| Alibaba OSS | oss-{region}.aliyuncs.com | CN, AP, EU, US | 5 GB (China) | Dominant in Asia-Pacific |
| Tencent COS | cos.{region}.myqcloud.com | CN, AP, EU, US | 50 GB (6 months) | Strong China mainland coverage |
| MinIO | Custom endpoint | N/A | Self-hosted | Open-source, on-premises S3 |
| Yandex Object Storage | storage.yandexcloud.net | Russia | None (paid) | Russian cloud provider |
Cloudflare R2
Cloudflare R2 uses your Account ID instead of a traditional region. AeroFTP provides a dedicated Account ID input field for R2 connections.

The endpoint is computed automatically from your Account ID:
{your-account-id}.r2.cloudflarestorage.com
To generate R2 API tokens:
- Go to the Cloudflare Dashboard.
- Navigate to R2 > Overview > Manage R2 API Tokens.
- Create a token with "Object Read & Write" permissions for your target bucket.
- Copy the Access Key ID and Secret Access Key into AeroFTP.
R2 has no egress fees, making it ideal for content delivery and backup workloads where you read data frequently.
MinIO (Self-Hosted)
For MinIO and other self-hosted S3-compatible servers:
- Select MinIO from the provider dropdown (or leave it on Custom).
- Enter your MinIO server URL as the endpoint (e.g.
http://minio.local:9000orhttps://s3.internal.company.com). - Use your MinIO access key and secret key (configured in the MinIO console or via
mc admin user). - Leave the region blank or set it to
us-east-1(MinIO defaults).
Path-Style vs Virtual-Hosted-Style Addressing
S3 supports two URL styles for accessing objects:
- Path-style:
https://endpoint/bucket/key-- the bucket name is part of the URL path. - Virtual-hosted-style:
https://bucket.endpoint/key-- the bucket name is a subdomain.
AeroFTP uses path-style addressing by default, which is compatible with all S3 providers including MinIO, Ceph, and other self-hosted solutions. AWS has been deprecating path-style for its own service, but path-style continues to work and is the only option for non-AWS endpoints.
Multipart Upload
For files larger than a configurable threshold, AeroFTP uses S3's multipart upload API:
- Initiate: AeroFTP starts a multipart upload session and receives an upload ID.
- Upload parts: The file is split into parts (typically 5-100 MB each) and uploaded individually. Each part receives an ETag for integrity verification.
- Complete: AeroFTP sends the list of part ETags to finalize the upload. S3 assembles the parts into the final object.
Multipart upload provides several benefits:
- Resumability: If a part fails, only that part needs to be re-uploaded.
- Parallelism: Multiple parts can be uploaded concurrently for faster throughput.
- Large file support: Single-part uploads are limited to 5 GB on AWS; multipart supports up to 5 TB.
Pagination
S3 bucket listings are paginated using continuation tokens. AeroFTP handles this transparently -- it fetches all pages automatically when listing a directory, even for buckets containing millions of objects. The continuation token loop was hardened in v2.4.0 to prevent infinite loops on malformed responses.
CLI Usage
The AeroFTP CLI supports S3 connections using URL syntax with embedded credentials:
# List bucket contents
aeroftp ls s3://AKIAIOSFODNN7EXAMPLE:wJalrXUtnFEMI@s3.us-east-1.amazonaws.com --bucket my-bucket
# List with a specific region
aeroftp ls s3://key:secret@s3.eu-west-1.amazonaws.com --bucket data-eu -l
# Download a file
aeroftp get s3://key:secret@s3.us-east-1.amazonaws.com --bucket my-bucket /reports/2024.pdf ./
# Upload a file
aeroftp put s3://key:secret@s3.us-east-1.amazonaws.com --bucket my-bucket / ./backup.tar.gz
# MinIO (custom endpoint)
aeroftp ls s3://minioadmin:minioadmin@minio.local:9000 --bucket backups /
# Cloudflare R2
aeroftp ls s3://key:secret@ACCOUNT_ID.r2.cloudflarestorage.com --bucket assets /
# Show bucket storage usage
aeroftp df s3://key:secret@s3.us-east-1.amazonaws.com --bucket my-bucket
# JSON output for scripting
aeroftp ls s3://key:secret@endpoint --bucket name / --json
Security note: Embedding credentials in URLs is convenient for scripting but exposes them in shell history. For production use, save the connection as a profile in the AeroFTP GUI and use
--profile "My S3"instead.
Common Issues
| Problem | Cause | Solution |
|---|---|---|
SignatureDoesNotMatch | System clock skew or wrong secret key | Verify your system clock is accurate (timedatectl); double-check the secret key |
AccessDenied | Insufficient IAM permissions | Ensure the access key has s3:GetObject, s3:PutObject, s3:ListBucket permissions |
NoSuchBucket | Bucket does not exist or wrong region | Verify the bucket name and region in the provider's console |
InvalidEndpoint on MinIO | Endpoint URL is wrong | Ensure the endpoint includes the scheme (http:// or https://) and port |
| Empty bucket listing | Prefix filter mismatch | S3 uses / as a delimiter for "folders"; ensure you are listing the correct prefix |
| Slow listing on large buckets | Millions of objects, paginated | This is expected; S3 lists 1,000 objects per API call |
Tips
- S3 does not have a traditional directory structure. AeroFTP emulates folders using
/prefix delimiters, which is the standard convention across all S3 tools. - When editing a saved S3 connection, the endpoint is auto-resolved from the provider registry if it was not stored previously. This ensures backward compatibility with connections saved in older AeroFTP versions.
- For AeroSync with S3, use the size compare mode. S3 objects do not have traditional modification times -- the
LastModifiedtimestamp reflects when the object was written to S3, not the original file's mtime. - Backblaze B2 and Cloudflare R2 both offer free tiers with no egress fees, making them excellent choices for backup and archival workloads.