docs/PROVIDER_COMPATIBILITY.md
This document details S3-compatible storage provider compatibility with Litestream, including known limitations, required configuration, and tested configurations.
Litestream uses the AWS SDK v2 for S3-compatible storage backends. While most providers implement the S3 API, there are important differences in behavior that can affect Litestream's operation.
Status: Fully supported (primary target)
replicas:
- url: s3://bucket-name/path
region: us-east-1
Notes:
Status: Supported with default configuration
Known Limitations:
aws-chunked content encodingConfiguration:
replicas:
- url: s3://bucket-name/path?endpoint=https://ACCOUNT_ID.r2.cloudflarestorage.com
access-key-id: your-access-key-id
secret-access-key: your-secret-access-key
Automatic Defaults (applied when R2 endpoint detected):
sign-payload=true - Signed payloads requiredconcurrency=2 - Limits concurrent multipart upload partsImportant: The endpoint must use https:// scheme for R2 detection to work.
Related issues: #948, #947, #940, #941
Status: Supported with configuration
Known Limitations:
Configuration:
replicas:
- url: s3://bucket-name/path?endpoint=https://s3.REGION.backblazeb2.com&sign-payload=true&force-path-style=true
access-key-id: your-key-id
secret-access-key: your-application-key
Required Settings:
sign-payload=true - Required for B2 authenticationforce-path-style=true - Required for bucket accesshttps://s3.REGION.backblazeb2.comRelated issues: #918, #894
Status: Supported with configuration
Known Limitations:
aws-chunked content encodingConfiguration:
replicas:
- url: s3://bucket-name/path?endpoint=https://REGION.digitaloceanspaces.com&force-path-style=false
access-key-id: your-spaces-key
secret-access-key: your-spaces-secret
Notes:
Related issues: #943
Status: Fully supported
Configuration:
replicas:
- url: s3://bucket-name/path?endpoint=https://your-minio-server:9000&force-path-style=true
access-key-id: your-access-key
secret-access-key: your-secret-key
Notes:
Status: Supported with configuration
Known Limitations:
MissingContentLength errors with streaming uploadsConfiguration:
replicas:
- url: s3://bucket-name/path?endpoint=https://s3.REGION.scw.cloud&force-path-style=true
access-key-id: your-access-key
secret-access-key: your-secret-key
Related issues: #912
Status: Supported with configuration
Known Limitations:
InvalidArgument errors with default AWS SDK settingsaws-chunked content encodingConfiguration:
replicas:
- url: s3://bucket-name/path?endpoint=https://REGION.your-objectstorage.com&force-path-style=true
access-key-id: your-access-key
secret-access-key: your-secret-key
Status: Supported with configuration
Known Limitations:
Configuration:
replicas:
- url: s3://bucket-name/path?endpoint=https://s3.filebase.com&force-path-style=true
access-key-id: your-access-key
secret-access-key: your-secret-key
Status: Supported with configuration
Configuration:
replicas:
- url: s3://bucket-name/path?endpoint=https://fly.storage.tigris.dev&force-path-style=true
access-key-id: your-access-key
secret-access-key: your-secret-key
Status: Supported (auto-detected)
Known Limitations:
force-path-style=true)Configuration:
replicas:
- url: s3://bucket-name/path?endpoint=https://PROJECT_REF.supabase.co/storage/v1/s3
access-key-id: your-s3-access-key
secret-access-key: your-s3-secret-key
Automatic Defaults (applied when Supabase endpoint detected):
sign-payload=true - Signed payloads requiredforce-path-style=true - Path-style URLs requiredNotes:
https://<PROJECT_REF>.supabase.co/storage/v1/s3Related issues: #1133
Status: Supported
Configuration:
replicas:
- url: s3://bucket-name/path?endpoint=https://s3.REGION.wasabisys.com
access-key-id: your-access-key
secret-access-key: your-secret-key
Status: Fully supported (native client)
replicas:
- url: gcs://bucket-name/path
Authentication:
GOOGLE_APPLICATION_CREDENTIALS environment variableStatus: Fully supported (native client)
replicas:
- url: abs://container-name/path
account-name: your-account-name
account-key: your-account-key
Using SAS Token (for granular container-level access):
replicas:
- url: abs://container-name/path
account-name: your-account-name
sas-token: "sv=2023-01-03&ss=b&srt=co&sp=rwdlacx..."
Or via environment variable: LITESTREAM_AZURE_SAS_TOKEN
Alternative Authentication:
sas-token config or LITESTREAM_AZURE_SAS_TOKEN env varaccount-key config or LITESTREAM_AZURE_ACCOUNT_KEY env varAuthentication Priority: SAS token > Account key > Default credential chain
Status: Supported (native client)
replicas:
- url: oss://bucket-name/path?endpoint=oss-REGION.aliyuncs.com
access-key-id: your-access-key-id
access-key-secret: your-access-key-secret
Status: Supported
replicas:
- url: sftp://hostname/path
user: username
password: password # or use key-path
Parameters with an alias accept both camelCase and hyphenated forms
(e.g., forcePathStyle or force-path-style).
| Parameter | Alias | Description | Default |
|---|---|---|---|
endpoint | Custom S3 endpoint URL | AWS S3 | |
region | AWS region | Auto-detected | |
forcePathStyle | force-path-style | Use path-style URLs | false (auto for custom endpoints) |
skipVerify | skip-verify | Skip TLS verification | false |
signPayload | sign-payload | Sign request payloads | true |
requireContentMD5 | require-content-md5 | Require Content-MD5 header | true |
concurrency | Multipart upload concurrency | 5 | |
partSize | part-size | Multipart upload part size | 5MB |
sseCustomerAlgorithm | sse-customer-algorithm | SSE-C encryption algorithm | None |
sseCustomerKey | sse-customer-key | SSE-C encryption key | None |
sseCustomerKeyMD5 | sse-customer-key-md5 | SSE-C key MD5 checksum | None |
sseKmsKeyId | sse-kms-key-id | KMS key for encryption | None |
Litestream automatically detects certain providers and applies appropriate defaults:
| Provider | Detection Pattern | Applied Settings |
|---|---|---|
| Hetzner | *.your-objectstorage.com | sign-payload=true |
| Cloudflare R2 | *.r2.cloudflarestorage.com | sign-payload=true, concurrency=2 |
| Backblaze B2 | *.backblazeb2.com | sign-payload=true, force-path-style=true |
| DigitalOcean | *.digitaloceanspaces.com | sign-payload=true |
| Scaleway | *.scw.cloud | sign-payload=true |
| Filebase | s3.filebase.com | sign-payload=true, force-path-style=true |
| Tigris | *.tigris.dev | sign-payload=true, require-content-md5=false |
| MinIO | host with port (not cloud provider) | sign-payload=true, force-path-style=true |
| Supabase | *.supabase.co | sign-payload=true, force-path-style=true |
InvalidArgument: Unsupported content encoding: aws-chunked
SignatureDoesNotMatch
sign-payload=true in the URLMissingContentLength
Too many concurrent uploads or timeout errors
?concurrency=2AccessDenied or authentication failures
sign-payload=trueEnable verbose logging to diagnose issues:
LITESTREAM_DEBUG=1 litestream replicate ...
Or in configuration:
logging:
level: debug
Test connectivity without starting replication:
# List any existing backups
litestream snapshots s3://bucket/path?endpoint=...
# Perform a test restore (requires existing backup)
litestream restore -o /tmp/test.db s3://bucket/path?endpoint=...
ReplicaClientV3 interfaceWhen upgrading from v0.3.x, v0.5.x can automatically restore from v0.3.x backups if no v0.4.x+ backup exists. The S3 backend implements ReplicaClientV3 to read the v0.3.x generations/{id}/snapshots/ and generations/{id}/wal/ directory structure. See REPLICA_CLIENT_GUIDE.md for details.
Litestream supports periodic validation of replica integrity:
validation:
interval: "5m" # How often to validate; 0 disables
This runs Store.Validate() on a ticker, comparing local and remote positions. Can also be set per-replica via the validation-interval replica config key.
and cannot restore backups created by v0.3.x. See the upgrade guide for migration
instructions.
When reporting provider compatibility issues, please include:
litestream version)File issues at: GitHub Issues