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

S3 connection fields with preset selector

FieldValueNotes
ProviderPreset selectionAuto-fills endpoint and region options
EndpointService endpoint URLAuto-configured from preset, or enter manually
RegionAWS region or equivalente.g. us-east-1, eu-west-1, auto
Access KeyYour access key IDFrom the provider's management console
Secret KeyYour secret access keyStored encrypted in the OS keyring
BucketTarget bucket nameMust 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.

ProviderEndpoint TemplateRegionsFree TierNotes
AWS S3s3.{region}.amazonaws.com30+ worldwide5 GB (12 months)The original S3 implementation
Wasabis3.{region}.wasabisys.comUS, EU, APNone (paid)No egress fees, S3-compatible
Backblaze B2s3.{region}.backblazeb2.comUS, EU10 GB foreverAffordable, S3-compatible API
DigitalOcean Spaces{region}.digitaloceanspaces.comNYC, SFO, AMS, SGP, FRANone (paid)Integrated CDN, flat pricing
Cloudflare R2{accountId}.r2.cloudflarestorage.comAuto-routed10 GB foreverNo egress fees, see below
Storjgateway.storjshare.ioGlobal25 GB foreverDecentralized, end-to-end encrypted
Alibaba OSSoss-{region}.aliyuncs.comCN, AP, EU, US5 GB (China)Dominant in Asia-Pacific
Tencent COScos.{region}.myqcloud.comCN, AP, EU, US50 GB (6 months)Strong China mainland coverage
MinIOCustom endpointN/ASelf-hostedOpen-source, on-premises S3
Yandex Object Storagestorage.yandexcloud.netRussiaNone (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.

Cloudflare R2 connection with Account ID field

The endpoint is computed automatically from your Account ID:

{your-account-id}.r2.cloudflarestorage.com

To generate R2 API tokens:

  1. Go to the Cloudflare Dashboard.
  2. Navigate to R2 > Overview > Manage R2 API Tokens.
  3. Create a token with "Object Read & Write" permissions for your target bucket.
  4. 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:

  1. Select MinIO from the provider dropdown (or leave it on Custom).
  2. Enter your MinIO server URL as the endpoint (e.g. http://minio.local:9000 or https://s3.internal.company.com).
  3. Use your MinIO access key and secret key (configured in the MinIO console or via mc admin user).
  4. 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:

  1. Initiate: AeroFTP starts a multipart upload session and receives an upload ID.
  2. Upload parts: The file is split into parts (typically 5-100 MB each) and uploaded individually. Each part receives an ETag for integrity verification.
  3. 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

ProblemCauseSolution
SignatureDoesNotMatchSystem clock skew or wrong secret keyVerify your system clock is accurate (timedatectl); double-check the secret key
AccessDeniedInsufficient IAM permissionsEnsure the access key has s3:GetObject, s3:PutObject, s3:ListBucket permissions
NoSuchBucketBucket does not exist or wrong regionVerify the bucket name and region in the provider's console
InvalidEndpoint on MinIOEndpoint URL is wrongEnsure the endpoint includes the scheme (http:// or https://) and port
Empty bucket listingPrefix filter mismatchS3 uses / as a delimiter for "folders"; ensure you are listing the correct prefix
Slow listing on large bucketsMillions of objects, paginatedThis 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 LastModified timestamp 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.