s3: Support Cloudflare R2 - fixes #5642
This commit is contained in:
parent
cf0a72aecd
commit
6f91198b57
5 changed files with 134 additions and 3 deletions
|
@ -29,6 +29,7 @@ Rclone *("rsync for cloud storage")* is a command-line program to sync files and
|
||||||
* Box [:page_facing_up:](https://rclone.org/box/)
|
* Box [:page_facing_up:](https://rclone.org/box/)
|
||||||
* Ceph [:page_facing_up:](https://rclone.org/s3/#ceph)
|
* Ceph [:page_facing_up:](https://rclone.org/s3/#ceph)
|
||||||
* China Mobile Ecloud Elastic Object Storage (EOS) [:page_facing_up:](https://rclone.org/s3/#china-mobile-ecloud-eos)
|
* China Mobile Ecloud Elastic Object Storage (EOS) [:page_facing_up:](https://rclone.org/s3/#china-mobile-ecloud-eos)
|
||||||
|
* Cloudflare R2 [:page_facing_up:](https://rclone.org/s3/#cloudflare-r2)
|
||||||
* Arvan Cloud Object Storage (AOS) [:page_facing_up:](https://rclone.org/s3/#arvan-cloud-object-storage-aos)
|
* Arvan Cloud Object Storage (AOS) [:page_facing_up:](https://rclone.org/s3/#arvan-cloud-object-storage-aos)
|
||||||
* Citrix ShareFile [:page_facing_up:](https://rclone.org/sharefile/)
|
* Citrix ShareFile [:page_facing_up:](https://rclone.org/sharefile/)
|
||||||
* DigitalOcean Spaces [:page_facing_up:](https://rclone.org/s3/#digitalocean-spaces)
|
* DigitalOcean Spaces [:page_facing_up:](https://rclone.org/s3/#digitalocean-spaces)
|
||||||
|
|
|
@ -59,7 +59,7 @@ import (
|
||||||
func init() {
|
func init() {
|
||||||
fs.Register(&fs.RegInfo{
|
fs.Register(&fs.RegInfo{
|
||||||
Name: "s3",
|
Name: "s3",
|
||||||
Description: "Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, China Mobile, ArvanCloud, Digital Ocean, Dreamhost, IBM COS, Lyve Cloud, Minio, Netease, RackCorp, Scaleway, SeaweedFS, StackPath, Storj, Tencent COS and Wasabi",
|
Description: "Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, China Mobile, Cloudflare, ArvanCloud, Digital Ocean, Dreamhost, IBM COS, Lyve Cloud, Minio, Netease, RackCorp, Scaleway, SeaweedFS, StackPath, Storj, Tencent COS and Wasabi",
|
||||||
NewFs: NewFs,
|
NewFs: NewFs,
|
||||||
CommandHelp: commandHelp,
|
CommandHelp: commandHelp,
|
||||||
Options: []fs.Option{{
|
Options: []fs.Option{{
|
||||||
|
@ -79,6 +79,9 @@ func init() {
|
||||||
}, {
|
}, {
|
||||||
Value: "ChinaMobile",
|
Value: "ChinaMobile",
|
||||||
Help: "China Mobile Ecloud Elastic Object Storage (EOS)",
|
Help: "China Mobile Ecloud Elastic Object Storage (EOS)",
|
||||||
|
}, {
|
||||||
|
Value: "Cloudflare",
|
||||||
|
Help: "Cloudflare R2 Storage",
|
||||||
}, {
|
}, {
|
||||||
Value: "ArvanCloud",
|
Value: "ArvanCloud",
|
||||||
Help: "Arvan Cloud Object Storage (AOS)",
|
Help: "Arvan Cloud Object Storage (AOS)",
|
||||||
|
@ -298,10 +301,18 @@ func init() {
|
||||||
Value: "fr-par",
|
Value: "fr-par",
|
||||||
Help: "Paris, France",
|
Help: "Paris, France",
|
||||||
}},
|
}},
|
||||||
|
}, {
|
||||||
|
Name: "region",
|
||||||
|
Help: "Region to connect to.",
|
||||||
|
Provider: "Cloudflare",
|
||||||
|
Examples: []fs.OptionExample{{
|
||||||
|
Value: "auto",
|
||||||
|
Help: "R2 buckets are automatically distributed across Cloudflare's data centers for low latency.",
|
||||||
|
}},
|
||||||
}, {
|
}, {
|
||||||
Name: "region",
|
Name: "region",
|
||||||
Help: "Region to connect to.\n\nLeave blank if you are using an S3 clone and you don't have a region.",
|
Help: "Region to connect to.\n\nLeave blank if you are using an S3 clone and you don't have a region.",
|
||||||
Provider: "!AWS,Alibaba,ChinaMobile,ArvanCloud,RackCorp,Scaleway,Storj,TencentCOS",
|
Provider: "!AWS,Alibaba,ChinaMobile,Cloudflare,ArvanCloud,RackCorp,Scaleway,Storj,TencentCOS",
|
||||||
Examples: []fs.OptionExample{{
|
Examples: []fs.OptionExample{{
|
||||||
Value: "",
|
Value: "",
|
||||||
Help: "Use this if unsure.\nWill use v4 signatures and an empty region.",
|
Help: "Use this if unsure.\nWill use v4 signatures and an empty region.",
|
||||||
|
@ -1271,7 +1282,7 @@ func init() {
|
||||||
}, {
|
}, {
|
||||||
Name: "location_constraint",
|
Name: "location_constraint",
|
||||||
Help: "Location constraint - must be set to match the Region.\n\nLeave blank if not sure. Used when creating buckets only.",
|
Help: "Location constraint - must be set to match the Region.\n\nLeave blank if not sure. Used when creating buckets only.",
|
||||||
Provider: "!AWS,IBMCOS,Alibaba,ChinaMobile,ArvanCloud,RackCorp,Scaleway,StackPath,Storj,TencentCOS",
|
Provider: "!AWS,IBMCOS,Alibaba,ChinaMobile,Cloudflare,ArvanCloud,RackCorp,Scaleway,StackPath,Storj,TencentCOS",
|
||||||
}, {
|
}, {
|
||||||
Name: "acl",
|
Name: "acl",
|
||||||
Help: `Canned ACL used when creating buckets and storing or copying objects.
|
Help: `Canned ACL used when creating buckets and storing or copying objects.
|
||||||
|
@ -2238,6 +2249,9 @@ func setQuirks(opt *Options) {
|
||||||
listObjectsV2 = false
|
listObjectsV2 = false
|
||||||
virtualHostStyle = false
|
virtualHostStyle = false
|
||||||
urlEncodeListings = false
|
urlEncodeListings = false
|
||||||
|
case "Cloudflare":
|
||||||
|
virtualHostStyle = false
|
||||||
|
useMultipartEtag = false // currently multipart Etags are random
|
||||||
case "ArvanCloud":
|
case "ArvanCloud":
|
||||||
listObjectsV2 = false
|
listObjectsV2 = false
|
||||||
virtualHostStyle = false
|
virtualHostStyle = false
|
||||||
|
|
|
@ -116,6 +116,7 @@ WebDAV or S3, that work out of the box.)
|
||||||
{{< provider name="Arvan Cloud Object Storage (AOS)" home="https://www.arvancloud.com/en/products/cloud-storage" config="/s3/#arvan-cloud-object-storage-aos" >}}
|
{{< provider name="Arvan Cloud Object Storage (AOS)" home="https://www.arvancloud.com/en/products/cloud-storage" config="/s3/#arvan-cloud-object-storage-aos" >}}
|
||||||
{{< provider name="Citrix ShareFile" home="http://sharefile.com/" config="/sharefile/" >}}
|
{{< provider name="Citrix ShareFile" home="http://sharefile.com/" config="/sharefile/" >}}
|
||||||
{{< provider name="C14" home="https://www.online.net/en/storage/c14-cold-storage" config="/s3/#scaleway" >}}
|
{{< provider name="C14" home="https://www.online.net/en/storage/c14-cold-storage" config="/s3/#scaleway" >}}
|
||||||
|
{{< provider name="Cloudflare R2" home="https://blog.cloudflare.com/r2-open-beta/" config="/s3/#cloudflare-r2" >}}
|
||||||
{{< provider name="DigitalOcean Spaces" home="https://www.digitalocean.com/products/object-storage/" config="/s3/#digitalocean-spaces" >}}
|
{{< provider name="DigitalOcean Spaces" home="https://www.digitalocean.com/products/object-storage/" config="/s3/#digitalocean-spaces" >}}
|
||||||
{{< provider name="Digi Storage" home="https://storage.rcs-rds.ro/" config="/koofr/#digi-storage" >}}
|
{{< provider name="Digi Storage" home="https://storage.rcs-rds.ro/" config="/koofr/#digi-storage" >}}
|
||||||
{{< provider name="Dreamhost" home="https://www.dreamhost.com/cloud/storage/" config="/s3/#dreamhost" >}}
|
{{< provider name="Dreamhost" home="https://www.dreamhost.com/cloud/storage/" config="/s3/#dreamhost" >}}
|
||||||
|
|
|
@ -12,6 +12,7 @@ The S3 backend can be used with a number of different providers:
|
||||||
{{< provider name="Alibaba Cloud (Aliyun) Object Storage System (OSS)" home="https://www.alibabacloud.com/product/oss/" config="/s3/#alibaba-oss" >}}
|
{{< provider name="Alibaba Cloud (Aliyun) Object Storage System (OSS)" home="https://www.alibabacloud.com/product/oss/" config="/s3/#alibaba-oss" >}}
|
||||||
{{< provider name="Ceph" home="http://ceph.com/" config="/s3/#ceph" >}}
|
{{< provider name="Ceph" home="http://ceph.com/" config="/s3/#ceph" >}}
|
||||||
{{< provider name="China Mobile Ecloud Elastic Object Storage (EOS)" home="https://ecloud.10086.cn/home/product-introduction/eos/" config="/s3/#china-mobile-ecloud-eos" >}}
|
{{< provider name="China Mobile Ecloud Elastic Object Storage (EOS)" home="https://ecloud.10086.cn/home/product-introduction/eos/" config="/s3/#china-mobile-ecloud-eos" >}}
|
||||||
|
{{< provider name="Cloudflare R2" home="https://blog.cloudflare.com/r2-open-beta/" config="/s3/#cloudflare-r2" >}}
|
||||||
{{< provider name="Arvan Cloud Object Storage (AOS)" home="https://www.arvancloud.com/en/products/cloud-storage" config="/s3/#arvan-cloud-object-storage-aos" >}}
|
{{< provider name="Arvan Cloud Object Storage (AOS)" home="https://www.arvancloud.com/en/products/cloud-storage" config="/s3/#arvan-cloud-object-storage-aos" >}}
|
||||||
{{< provider name="DigitalOcean Spaces" home="https://www.digitalocean.com/products/object-storage/" config="/s3/#digitalocean-spaces" >}}
|
{{< provider name="DigitalOcean Spaces" home="https://www.digitalocean.com/products/object-storage/" config="/s3/#digitalocean-spaces" >}}
|
||||||
{{< provider name="Dreamhost" home="https://www.dreamhost.com/cloud/storage/" config="/s3/#dreamhost" >}}
|
{{< provider name="Dreamhost" home="https://www.dreamhost.com/cloud/storage/" config="/s3/#dreamhost" >}}
|
||||||
|
@ -2561,6 +2562,115 @@ removed).
|
||||||
Because this is a json dump, it is encoding the `/` as `\/`, so if you
|
Because this is a json dump, it is encoding the `/` as `\/`, so if you
|
||||||
use the secret key as `xxxxxx/xxxx` it will work fine.
|
use the secret key as `xxxxxx/xxxx` it will work fine.
|
||||||
|
|
||||||
|
### Cloudflare R2 {#cloudflare-r2}
|
||||||
|
|
||||||
|
[Cloudflare R2](https://blog.cloudflare.com/r2-open-beta/) Storage
|
||||||
|
allows developers to store large amounts of unstructured data without
|
||||||
|
the costly egress bandwidth fees associated with typical cloud storage
|
||||||
|
services.
|
||||||
|
|
||||||
|
Here is an example of making a Cloudflare R2 configuration. First run:
|
||||||
|
|
||||||
|
rclone config
|
||||||
|
|
||||||
|
This will guide you through an interactive setup process.
|
||||||
|
|
||||||
|
```
|
||||||
|
No remotes found, make a new one?
|
||||||
|
n) New remote
|
||||||
|
s) Set configuration password
|
||||||
|
q) Quit config
|
||||||
|
n/s/q> n
|
||||||
|
name> r2
|
||||||
|
Option Storage.
|
||||||
|
Type of storage to configure.
|
||||||
|
Choose a number from below, or type in your own value.
|
||||||
|
...
|
||||||
|
XX / Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, China Mobile, Cloudflare, ArvanCloud, Digital Ocean, Dreamhost, IBM COS, Lyve Cloud, Minio, Netease, RackCorp, Scaleway, SeaweedFS, StackPath, Storj, Tencent COS and Wasabi
|
||||||
|
\ (s3)
|
||||||
|
...
|
||||||
|
Storage> s3
|
||||||
|
Option provider.
|
||||||
|
Choose your S3 provider.
|
||||||
|
Choose a number from below, or type in your own value.
|
||||||
|
Press Enter to leave empty.
|
||||||
|
...
|
||||||
|
XX / Cloudflare R2 Storage
|
||||||
|
\ (Cloudflare)
|
||||||
|
...
|
||||||
|
provider> Cloudflare
|
||||||
|
Option env_auth.
|
||||||
|
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
|
||||||
|
Only applies if access_key_id and secret_access_key is blank.
|
||||||
|
Choose a number from below, or type in your own boolean value (true or false).
|
||||||
|
Press Enter for the default (false).
|
||||||
|
1 / Enter AWS credentials in the next step.
|
||||||
|
\ (false)
|
||||||
|
2 / Get AWS credentials from the environment (env vars or IAM).
|
||||||
|
\ (true)
|
||||||
|
env_auth> 1
|
||||||
|
Option access_key_id.
|
||||||
|
AWS Access Key ID.
|
||||||
|
Leave blank for anonymous access or runtime credentials.
|
||||||
|
Enter a value. Press Enter to leave empty.
|
||||||
|
access_key_id> ACCESS_KEY
|
||||||
|
Option secret_access_key.
|
||||||
|
AWS Secret Access Key (password).
|
||||||
|
Leave blank for anonymous access or runtime credentials.
|
||||||
|
Enter a value. Press Enter to leave empty.
|
||||||
|
secret_access_key> SECRET_ACCESS_KEY
|
||||||
|
Option region.
|
||||||
|
Region to connect to.
|
||||||
|
Choose a number from below, or type in your own value.
|
||||||
|
Press Enter to leave empty.
|
||||||
|
1 / R2 buckets are automatically distributed across Cloudflare's data centers for low latency.
|
||||||
|
\ (auto)
|
||||||
|
region> 1
|
||||||
|
Option endpoint.
|
||||||
|
Endpoint for S3 API.
|
||||||
|
Required when using an S3 clone.
|
||||||
|
Enter a value. Press Enter to leave empty.
|
||||||
|
endpoint> https://ACCOUNT_ID.r2.cloudflarestorage.com
|
||||||
|
Option acl.
|
||||||
|
Canned ACL used when creating buckets and storing or copying objects.
|
||||||
|
This ACL is used for creating objects and if bucket_acl isn't set, for creating buckets too.
|
||||||
|
For more info visit https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
|
||||||
|
Note that this ACL is applied when server-side copying objects as S3
|
||||||
|
doesn't copy the ACL from the source but rather writes a fresh one.
|
||||||
|
Choose a number from below, or type in your own value.
|
||||||
|
Press Enter to leave empty.
|
||||||
|
/ Owner gets FULL_CONTROL.
|
||||||
|
1 | No one else has access rights (default).
|
||||||
|
\ (private)
|
||||||
|
...
|
||||||
|
acl> 1
|
||||||
|
Edit advanced config?
|
||||||
|
y) Yes
|
||||||
|
n) No (default)
|
||||||
|
y/n> n
|
||||||
|
--------------------
|
||||||
|
y) Yes this is OK (default)
|
||||||
|
e) Edit this remote
|
||||||
|
d) Delete this remote
|
||||||
|
y/e/d> y
|
||||||
|
```
|
||||||
|
|
||||||
|
This will leave your config looking something like:
|
||||||
|
|
||||||
|
```
|
||||||
|
[r2]
|
||||||
|
type = s3
|
||||||
|
provider = Cloudflare
|
||||||
|
access_key_id = ACCESS_KEY
|
||||||
|
secret_access_key = SECRET_ACCESS_KEY
|
||||||
|
region = auto
|
||||||
|
endpoint = https://ACCOUNT_ID.r2.cloudflarestorage.com
|
||||||
|
acl = private
|
||||||
|
```
|
||||||
|
|
||||||
|
Now run `rclone lsf r2:` to see your buckets and `rclone lsf
|
||||||
|
r2:bucket` to look within a bucket.
|
||||||
|
|
||||||
### Dreamhost
|
### Dreamhost
|
||||||
|
|
||||||
Dreamhost [DreamObjects](https://www.dreamhost.com/cloud/storage/) is
|
Dreamhost [DreamObjects](https://www.dreamhost.com/cloud/storage/) is
|
||||||
|
|
|
@ -204,6 +204,11 @@ backends:
|
||||||
- backend: "s3"
|
- backend: "s3"
|
||||||
remote: "TestS3Alibaba:"
|
remote: "TestS3Alibaba:"
|
||||||
fastlist: true
|
fastlist: true
|
||||||
|
- backend: "s3"
|
||||||
|
remote: "TestS3R2:"
|
||||||
|
fastlist: true
|
||||||
|
ignore:
|
||||||
|
- TestIntegration/FsMkdir/FsPutFiles/SetTier
|
||||||
- backend: "sftp"
|
- backend: "sftp"
|
||||||
remote: "TestSFTPOpenssh:"
|
remote: "TestSFTPOpenssh:"
|
||||||
fastlist: false
|
fastlist: false
|
||||||
|
|
Loading…
Reference in a new issue