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: Supported with HMAC keys
replicas:
- type: s3
bucket: bucket-name
path: database-name
endpoint: https://storage.googleapis.com
region: us-east-1
force-path-style: true
access-key-id: your-hmac-access-key
secret-access-key: your-hmac-secret
Litestream automatically excludes Accept-Encoding from SigV4 signatures for
Cloud Storage endpoints under the exact googleapis.com domain when storage
is an exact segment of the first hostname label. This covers global, regional,
locational, mTLS, and legacy upload and download endpoints while rejecting
external lookalike domains.
Status: 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 in bytes | 5242880 (5MB) |
storageClass | storage-class | Storage class for uploaded objects | None |
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 |
| Google Cloud Storage | Exact googleapis.com suffix with a first-label storage segment | Excludes Accept-Encoding from SigV4 signatures |
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