diff --git a/README.md b/README.md index 8c5b1c6fb..fc8064ac7 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,7 @@ Rclone *("rsync for cloud storage")* is a command-line program to sync files and * premiumize.me [:page_facing_up:](https://rclone.org/premiumizeme/) * put.io [:page_facing_up:](https://rclone.org/putio/) * QingStor [:page_facing_up:](https://rclone.org/qingstor/) + * Qiniu Cloud Object Storage (Kodo) [:page_facing_up:](https://rclone.org/s3/#qiniu) * Rackspace Cloud Files [:page_facing_up:](https://rclone.org/swift/) * RackCorp Object Storage [:page_facing_up:](https://rclone.org/s3/#RackCorp) * Scaleway [:page_facing_up:](https://rclone.org/s3/#scaleway) diff --git a/backend/s3/s3.go b/backend/s3/s3.go index d869efb8d..84da84e91 100644 --- a/backend/s3/s3.go +++ b/backend/s3/s3.go @@ -65,7 +65,7 @@ import ( func init() { fs.Register(&fs.RegInfo{ Name: "s3", - Description: "Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, China Mobile, Cloudflare, ArvanCloud, Digital Ocean, Dreamhost, Huawei OBS, IBM COS, IDrive e2, IONOS Cloud, 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, Huawei OBS, IBM COS, IDrive e2, IONOS Cloud, Lyve Cloud, Minio, Netease, RackCorp, Scaleway, SeaweedFS, StackPath, Storj, Tencent COS, Qiniu and Wasabi", NewFs: NewFs, CommandHelp: commandHelp, Config: func(ctx context.Context, name string, m configmap.Mapper, config fs.ConfigIn) (*fs.ConfigOut, error) { @@ -150,6 +150,9 @@ func init() { }, { Value: "Wasabi", Help: "Wasabi Object Storage", + }, { + Value: "Qiniu", + Help: "Qiniu Object Storage (Kodo)", }, { Value: "Other", Help: "Any other S3 compatible provider", @@ -388,6 +391,34 @@ func init() { Value: "auto", Help: "R2 buckets are automatically distributed across Cloudflare's data centers for low latency.", }}, + }, { + // References: + // https://developer.qiniu.com/kodo/4088/s3-access-domainname + Name: "region", + Help: "Region to connect to.", + Provider: "Qiniu", + Examples: []fs.OptionExample{{ + Value: "cn-east-1", + Help: "The default endpoint - a good choice if you are unsure.\nEast China Region 1.\nNeeds location constraint cn-east-1.", + }, { + Value: "cn-east-2", + Help: "East China Region 2.\nNeeds location constraint cn-east-2.", + }, { + Value: "cn-north-1", + Help: "North China Region 1.\nNeeds location constraint cn-north-1.", + }, { + Value: "cn-south-1", + Help: "South China Region 1.\nNeeds location constraint cn-south-1.", + }, { + Value: "us-north-1", + Help: "North America Region.\nNeeds location constraint us-north-1.", + }, { + Value: "ap-southeast-1", + Help: "Southeast Asia Region 1.\nNeeds location constraint ap-southeast-1.", + }, { + Value: "ap-northeast-1", + Help: "Northeast Asia Region 1.\nNeeds location constraint ap-northeast-1.", + }}, }, { Name: "region", Help: "Region where your bucket will be created and your data stored.\n", @@ -405,7 +436,7 @@ func init() { }, { Name: "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,Cloudflare,IONOS,ArvanCloud,RackCorp,Scaleway,Storj,TencentCOS,HuaweiOBS,IDrive", + Provider: "!AWS,Alibaba,ChinaMobile,Cloudflare,IONOS,ArvanCloud,Qiniu,RackCorp,Scaleway,Storj,TencentCOS,HuaweiOBS,IDrive", Examples: []fs.OptionExample{{ Value: "", Help: "Use this if unsure.\nWill use v4 signatures and an empty region.", @@ -1030,10 +1061,37 @@ func init() { Value: "nz.s3.rackcorp.com", Help: "Auckland (New Zealand) Endpoint", }}, + }, { + // Qiniu endpoints: https://developer.qiniu.com/kodo/4088/s3-access-domainname + Name: "endpoint", + Help: "Endpoint for Qiniu Object Storage.", + Provider: "Qiniu", + Examples: []fs.OptionExample{{ + Value: "s3-cn-east-1.qiniucs.com", + Help: "East China Endpoint 1", + }, { + Value: "s3-cn-east-2.qiniucs.com", + Help: "East China Endpoint 2", + }, { + Value: "s3-cn-north-1.qiniucs.com", + Help: "North China Endpoint 1", + }, { + Value: "s3-cn-south-1.qiniucs.com", + Help: "South China Endpoint 1", + }, { + Value: "s3-us-north-1.qiniucs.com", + Help: "North America Endpoint 1", + }, { + Value: "s3-ap-southeast-1.qiniucs.com", + Help: "Southeast Asia Endpoint 1", + }, { + Value: "s3-ap-northeast-1.qiniucs.com", + Help: "Northeast Asia Endpoint 1", + }}, }, { Name: "endpoint", Help: "Endpoint for S3 API.\n\nRequired when using an S3 clone.", - Provider: "!AWS,IBMCOS,IDrive,IONOS,TencentCOS,HuaweiOBS,Alibaba,ChinaMobile,ArvanCloud,Scaleway,StackPath,Storj,RackCorp", + Provider: "!AWS,IBMCOS,IDrive,IONOS,TencentCOS,HuaweiOBS,Alibaba,ChinaMobile,ArvanCloud,Scaleway,StackPath,Storj,RackCorp,Qiniu", Examples: []fs.OptionExample{{ Value: "objects-us-east-1.dream.io", Help: "Dream Objects endpoint", @@ -1440,10 +1498,36 @@ func init() { Value: "nz", Help: "Auckland (New Zealand) Region", }}, + }, { + Name: "location_constraint", + Help: "Location constraint - must be set to match the Region.\n\nUsed when creating buckets only.", + Provider: "Qiniu", + Examples: []fs.OptionExample{{ + Value: "cn-east-1", + Help: "East China Region 1", + }, { + Value: "cn-east-2", + Help: "East China Region 2", + }, { + Value: "cn-north-1", + Help: "North China Region 1", + }, { + Value: "cn-south-1", + Help: "South China Region 1", + }, { + Value: "us-north-1", + Help: "North America Region 1", + }, { + Value: "ap-southeast-1", + Help: "Southeast Asia Region 1", + }, { + Value: "ap-northeast-1", + Help: "Northeast Asia Region 1", + }}, }, { Name: "location_constraint", Help: "Location constraint - must be set to match the Region.\n\nLeave blank if not sure. Used when creating buckets only.", - Provider: "!AWS,Alibaba,HuaweiOBS,ChinaMobile,Cloudflare,IBMCOS,IDrive,IONOS,ArvanCloud,RackCorp,Scaleway,StackPath,Storj,TencentCOS", + Provider: "!AWS,Alibaba,HuaweiOBS,ChinaMobile,Cloudflare,IBMCOS,IDrive,IONOS,ArvanCloud,Qiniu,RackCorp,Scaleway,StackPath,Storj,TencentCOS", }, { Name: "acl", Help: `Canned ACL used when creating buckets and storing or copying objects. @@ -1710,6 +1794,24 @@ If you leave it blank, this is calculated automatically from the sse_customer_ke Value: "GLACIER", Help: "Archived storage.\nPrices are lower, but it needs to be restored first to be accessed.", }}, + }, { + // Mapping from here: https://developer.qiniu.com/kodo/5906/storage-type + Name: "storage_class", + Help: "The storage class to use when storing new objects in Qiniu.", + Provider: "Qiniu", + Examples: []fs.OptionExample{{ + Value: "STANDARD", + Help: "Standard storage class", + }, { + Value: "LINE", + Help: "Infrequent access storage mode", + }, { + Value: "GLACIER", + Help: "Archive storage mode", + }, { + Value: "DEEP_ARCHIVE", + Help: "Deep archive storage mode", + }}, }, { Name: "upload_cutoff", Help: `Cutoff for switching to chunked upload. @@ -2623,6 +2725,9 @@ func setQuirks(opt *Options) { useMultipartEtag = false // untested case "Wasabi": // No quirks + case "Qiniu": + useMultipartEtag = false + urlEncodeListings = false case "Other": listObjectsV2 = false virtualHostStyle = false diff --git a/docs/content/_index.md b/docs/content/_index.md index cab7b03c7..e42e43ed4 100644 --- a/docs/content/_index.md +++ b/docs/content/_index.md @@ -152,6 +152,7 @@ WebDAV or S3, that work out of the box.) {{< provider name="premiumize.me" home="https://premiumize.me/" config="/premiumizeme/" >}} {{< provider name="put.io" home="https://put.io/" config="/putio/" >}} {{< provider name="QingStor" home="https://www.qingcloud.com/products/storage" config="/qingstor/" >}} +{{< provider name="Qiniu Cloud Object Storage (Kodo)" home="https://www.qiniu.com/en/products/kodo" config="/s3/#qiniu" >}} {{< provider name="Rackspace Cloud Files" home="https://www.rackspace.com/cloud/files" config="/swift/" >}} {{< provider name="rsync.net" home="https://rsync.net/products/rclone.html" config="/sftp/#rsync-net" >}} {{< provider name="Scaleway" home="https://www.scaleway.com/object-storage/" config="/s3/#scaleway" >}} diff --git a/docs/content/s3.md b/docs/content/s3.md index e8b10aae5..a07e2dc27 100644 --- a/docs/content/s3.md +++ b/docs/content/s3.md @@ -21,6 +21,7 @@ The S3 backend can be used with a number of different providers: {{< provider name="IDrive e2" home="https://www.idrive.com/e2/" config="/s3/#idrive-e2" >}} {{< provider name="IONOS Cloud" home="https://cloud.ionos.com/storage/object-storage" config="/s3/#ionos" >}} {{< provider name="Minio" home="https://www.minio.io/" config="/s3/#minio" >}} +{{< provider name="Qiniu Cloud Object Storage (Kodo)" home="https://www.qiniu.com/en/products/kodo" config="/s3/#qiniu" >}} {{< provider name="RackCorp Object Storage" home="https://www.rackcorp.com/" config="/s3/#RackCorp" >}} {{< provider name="Scaleway" home="https://www.scaleway.com/en/object-storage/" config="/s3/#scaleway" >}} {{< provider name="Seagate Lyve Cloud" home="https://www.seagate.com/gb/en/services/cloud/storage/" config="/s3/#lyve" >}} @@ -3764,6 +3765,207 @@ So once set up, for example, to copy files into a bucket rclone copy /path/to/files minio:bucket ``` +### Qiniu Cloud Object Storage (Kodo) {#qiniu} + +[Qiniu Cloud Object Storage (Kodo)](https://www.qiniu.com/en/products/kodo), a completely independent-researched core technology which is proven by repeated customer experience has occupied absolute leading market leader position. Kodo can be widely applied to mass data management. + +To configure access to Qiniu Kodo, follow the steps below: + +1. Run `rclone config` and select `n` for a new remote. + +``` +rclone config +No remotes found, make a new one? +n) New remote +s) Set configuration password +q) Quit config +n/s/q> n +``` + +2. Give the name of the configuration. For example, name it 'qiniu'. + +``` +name> qiniu +``` + +3. Select `s3` storage. + +``` +Choose a number from below, or type in your own value + 1 / 1Fichier + \ (fichier) + 2 / Akamai NetStorage + \ (netstorage) + 3 / Alias for an existing remote + \ (alias) + 4 / Amazon Drive + \ (amazon cloud drive) + 5 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, China Mobile, Cloudflare, ArvanCloud, Digital Ocean, Dreamhost, Huawei OBS, IBM COS, IDrive e2, Lyve Cloud, Minio, Netease, RackCorp, Scaleway, SeaweedFS, StackPath, Storj, Tencent COS, Qiniu and Wasabi + \ (s3) +[snip] +Storage> s3 +``` + +4. Select `Qiniu` provider. +``` +Choose a number from below, or type in your own value +1 / Amazon Web Services (AWS) S3 + \ "AWS" +[snip] +22 / Qiniu Object Storage (Kodo) + \ (Qiniu) +[snip] +provider> Qiniu +``` + +5. Enter your SecretId and SecretKey of Qiniu Kodo. + +``` +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. +Enter a boolean value (true or false). Press Enter for the default ("false"). +Choose a number from below, or type in your own value + 1 / Enter AWS credentials in the next step + \ "false" + 2 / Get AWS credentials from the environment (env vars or IAM) + \ "true" +env_auth> 1 +AWS Access Key ID. +Leave blank for anonymous access or runtime credentials. +Enter a string value. Press Enter for the default (""). +access_key_id> AKIDxxxxxxxxxx +AWS Secret Access Key (password) +Leave blank for anonymous access or runtime credentials. +Enter a string value. Press Enter for the default (""). +secret_access_key> xxxxxxxxxxx +``` + +6. Select endpoint for Qiniu Kodo. This is the standard endpoint for different region. + +``` + / The default endpoint - a good choice if you are unsure. + 1 | East China Region 1. + | Needs location constraint cn-east-1. + \ (cn-east-1) + / East China Region 2. + 2 | Needs location constraint cn-east-2. + \ (cn-east-2) + / North China Region 1. + 3 | Needs location constraint cn-north-1. + \ (cn-north-1) + / South China Region 1. + 4 | Needs location constraint cn-south-1. + \ (cn-south-1) + / North America Region. + 5 | Needs location constraint us-north-1. + \ (us-north-1) + / Southeast Asia Region 1. + 6 | Needs location constraint ap-southeast-1. + \ (ap-southeast-1) + / Northeast Asia Region 1. + 7 | Needs location constraint ap-northeast-1. + \ (ap-northeast-1) +[snip] +endpoint> 1 + +Option endpoint. +Endpoint for Qiniu Object Storage. +Choose a number from below, or type in your own value. +Press Enter to leave empty. + 1 / East China Endpoint 1 + \ (s3-cn-east-1.qiniucs.com) + 2 / East China Endpoint 2 + \ (s3-cn-east-2.qiniucs.com) + 3 / North China Endpoint 1 + \ (s3-cn-north-1.qiniucs.com) + 4 / South China Endpoint 1 + \ (s3-cn-south-1.qiniucs.com) + 5 / North America Endpoint 1 + \ (s3-us-north-1.qiniucs.com) + 6 / Southeast Asia Endpoint 1 + \ (s3-ap-southeast-1.qiniucs.com) + 7 / Northeast Asia Endpoint 1 + \ (s3-ap-northeast-1.qiniucs.com) +endpoint> 1 + +Option location_constraint. +Location constraint - must be set to match the Region. +Used when creating buckets only. +Choose a number from below, or type in your own value. +Press Enter to leave empty. + 1 / East China Region 1 + \ (cn-east-1) + 2 / East China Region 2 + \ (cn-east-2) + 3 / North China Region 1 + \ (cn-north-1) + 4 / South China Region 1 + \ (cn-south-1) + 5 / North America Region 1 + \ (us-north-1) + 6 / Southeast Asia Region 1 + \ (ap-southeast-1) + 7 / Northeast Asia Region 1 + \ (ap-northeast-1) +location_constraint> 1 +``` + +7. Choose acl and storage class. + +``` +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. +Enter a string value. Press Enter for the default (""). +Choose a number from below, or type in your own value + / Owner gets FULL_CONTROL. + 1 | No one else has access rights (default). + \ (private) + / Owner gets FULL_CONTROL. + 2 | The AllUsers group gets READ access. + \ (public-read) +[snip] +acl> 2 +The storage class to use when storing new objects in Tencent COS. +Enter a string value. Press Enter for the default (""). +Choose a number from below, or type in your own value + 1 / Standard storage class + \ (STANDARD) + 2 / Infrequent access storage mode + \ (LINE) + 3 / Archive storage mode + \ (GLACIER) + 4 / Deep archive storage mode + \ (DEEP_ARCHIVE) +[snip] +storage_class> 1 +Edit advanced config? (y/n) +y) Yes +n) No (default) +y/n> n +Remote config +-------------------- +[qiniu] +- type: s3 +- provider: Qiniu +- access_key_id: xxx +- secret_access_key: xxx +- region: cn-east-1 +- endpoint: s3-cn-east-1.qiniucs.com +- location_constraint: cn-east-1 +- acl: public-read +- storage_class: STANDARD +-------------------- +y) Yes this is OK (default) +e) Edit this remote +d) Delete this remote +y/e/d> y +Current remotes: + +Name Type +==== ==== +qiniu s3 +``` + ### RackCorp {#RackCorp} [RackCorp Object Storage](https://www.rackcorp.com/storage/s3storage) is an S3 compatible object storage platform from your friendly cloud provider RackCorp. diff --git a/fstest/test_all/config.yaml b/fstest/test_all/config.yaml index 242ab84f3..282a99367 100644 --- a/fstest/test_all/config.yaml +++ b/fstest/test_all/config.yaml @@ -210,6 +210,17 @@ backends: - backend: "s3" remote: "TestS3Alibaba:" fastlist: true + # - backend: "s3" + # remote: "TestS3Qiniu:" + # fastlist: true + # ignore: + # - TestIntegration/FsMkdir/FsEncoding/control_chars + # - TestIntegration/FsMkdir/FsEncoding/leading_VT + # - TestIntegration/FsMkdir/FsEncoding/trailing_VT + # - TestIntegration/FsMkdir/FsPutFiles/FromRoot/ListR + # - TestIntegration/FsMkdir/FsPutFiles/SetTier + # - TestIntegration/FsMkdir/FsPutFiles/FsPutStream/0 + # - TestIntegration/FsMkdir/FsPutFiles/Internal/Metadata - backend: "s3" remote: "TestS3R2:" fastlist: true