From a5932ef91a0bf09d8eeccc24438d42cdc14f1013 Mon Sep 17 00:00:00 2001 From: dougal Date: Fri, 10 Oct 2025 14:29:22 +0100 Subject: [PATCH] s3: add rabata as a provider --- README.md | 1 + backend/s3/s3.go | 64 +++++++++++++++++++-- docs/content/_index.md | 1 + docs/content/s3.md | 126 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 187 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 66abe5edf..e0e4e54a7 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,7 @@ directories to and from different cloud storage providers. - Proton Drive [:page_facing_up:](https://rclone.org/protondrive/) - QingStor [:page_facing_up:](https://rclone.org/qingstor/) - Qiniu Cloud Object Storage (Kodo) [:page_facing_up:](https://rclone.org/s3/#qiniu) +- Rabata Cloud Storage [:page_facing_up:](https://rclone.org/s3/#Rabata) - Quatrix [:page_facing_up:](https://rclone.org/quatrix/) - Rackspace Cloud Files [:page_facing_up:](https://rclone.org/swift/) - RackCorp Object Storage [:page_facing_up:](https://rclone.org/s3/#RackCorp) diff --git a/backend/s3/s3.go b/backend/s3/s3.go index 5d2cf669a..dcdecc535 100644 --- a/backend/s3/s3.go +++ b/backend/s3/s3.go @@ -161,6 +161,9 @@ var providerOption = fs.Option{ }, { Value: "Petabox", Help: "Petabox Object Storage", + }, { + Value: "Rabata", + Help: "Rabata Cloud Storage", }, { Value: "RackCorp", Help: "RackCorp Object Storage", @@ -564,6 +567,20 @@ func init() { 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", + Provider: "Rabata", + Examples: []fs.OptionExample{{ + Value: "us-east-1", + Help: "US East (N. Virginia)", + }, { + Value: "eu-west-1", + Help: "EU (Ireland)", + }, { + Value: "eu-west-2", + Help: "EU (London)", + }}, }, { Name: "region", Help: "region - the location where your bucket will be created and your data stored.\n", @@ -680,7 +697,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,ArvanCloud,ChinaMobile,Cloudflare,FlashBlade,FileLu,HuaweiOBS,IDrive,Intercolo,IONOS,Liara,Linode,Magalu,Mega,OVHcloud,Petabox,Qiniu,RackCorp,Scaleway,Selectel,SpectraLogic,Storj,Synology,TencentCOS,Zata", + Provider: "!AWS,Alibaba,ArvanCloud,ChinaMobile,Cloudflare,FlashBlade,FileLu,HuaweiOBS,IDrive,Intercolo,IONOS,Liara,Linode,Magalu,Mega,OVHcloud,Petabox,Qiniu,Rabata,RackCorp,Scaleway,Selectel,SpectraLogic,Storj,Synology,TencentCOS,Zata", Examples: []fs.OptionExample{{ Value: "", Help: "Use this if unsure.\nWill use v4 signatures and an empty region.", @@ -1383,6 +1400,20 @@ func init() { Value: "s3-ap-northeast-1.qiniucs.com", Help: "Northeast Asia Endpoint 1", }}, + }, { + Name: "endpoint", + Help: "Endpoint for Rabata Object Storage.", + Provider: "Rabata", + Examples: []fs.OptionExample{{ + Value: "s3.us-east-1.rabata.io", + Help: "US East (N. Virginia)", + }, { + Value: "s3.eu-west-1.rabata.io", + Help: "EU West (Ireland)", + }, { + Value: "s3.eu-west-2.rabata.io", + Help: "EU West (London)", + }}, }, { Name: "endpoint", Help: "Endpoint for Zata Object Storage.", @@ -1585,7 +1616,7 @@ func init() { }, { Name: "endpoint", Help: "Endpoint for S3 API.\n\nRequired when using an S3 clone.", - Provider: "!AWS,Alibaba,ArvanCloud,ChinaMobile,GCS,HuaweiOBS,IBMCOS,IDrive,Intercolo,IONOS,Liara,Linode,LyveCloud,Magalu,OVHcloud,Petabox,Qiniu,RackCorp,Scaleway,Selectel,StackPath,Storj,Synology,TencentCOS,Zata", + Provider: "!AWS,Alibaba,ArvanCloud,ChinaMobile,GCS,HuaweiOBS,IBMCOS,IDrive,Intercolo,IONOS,Liara,Linode,LyveCloud,Magalu,OVHcloud,Petabox,Qiniu,Rabata,RackCorp,Scaleway,Selectel,StackPath,Storj,Synology,TencentCOS,Zata", Examples: []fs.OptionExample{{ Value: "objects-us-east-1.dream.io", Help: "Dream Objects endpoint", @@ -2055,6 +2086,20 @@ func init() { Value: "ap-northeast-1", Help: "Northeast Asia Region 1", }}, + }, { + Name: "location_constraint", + Help: "location where your bucket will be created and your data stored.\n", + Provider: "Rabata", + Examples: []fs.OptionExample{{ + Value: "us-east-1", + Help: "US East (N. Virginia)", + }, { + Value: "eu-west-1", + Help: "EU (Ireland)", + }, { + Value: "eu-west-2", + Help: "EU (London)", + }}, }, { Name: "location_constraint", Help: "Location constraint - the location where your bucket will be located and your data stored.\n", @@ -2120,7 +2165,7 @@ func init() { }, { 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,ArvanCloud,ChinaMobile,Cloudflare,FlashBlade,FileLu,HuaweiOBS,IBMCOS,IDrive,Intercolo,IONOS,Leviia,Liara,Linode,Magalu,Mega,Outscale,OVHcloud,Petabox,Qiniu,RackCorp,Scaleway,Selectel,SpectraLogic,StackPath,Storj,TencentCOS", + Provider: "!AWS,Alibaba,ArvanCloud,ChinaMobile,Cloudflare,FlashBlade,FileLu,HuaweiOBS,IBMCOS,IDrive,Intercolo,IONOS,Leviia,Liara,Linode,Magalu,Mega,Outscale,OVHcloud,Petabox,Qiniu,Rabata,RackCorp,Scaleway,Selectel,SpectraLogic,StackPath,Storj,TencentCOS", }, { Name: "acl", Help: `Canned ACL used when creating buckets and storing or copying objects. @@ -2135,7 +2180,7 @@ doesn't copy the ACL from the source but rather writes a fresh one. If the acl is an empty string then no X-Amz-Acl: header is added and the default (private) will be used. `, - Provider: "!Cloudflare,FlashBlade,Mega,Selectel,SpectraLogic,Storj,Synology", + Provider: "!Cloudflare,FlashBlade,Mega,Rabata,Selectel,SpectraLogic,Storj,Synology", Examples: []fs.OptionExample{{ Value: "default", Help: "Owner gets Full_CONTROL.\nNo one else has access rights (default).", @@ -2193,7 +2238,7 @@ isn't set then "acl" is used instead. If the "acl" and "bucket_acl" are empty strings then no X-Amz-Acl: header is added and the default (private) will be used. `, - Provider: "!Cloudflare,FlashBlade,Selectel,SpectraLogic,Storj,Synology", + Provider: "!Cloudflare,FlashBlade,Rabata,Selectel,SpectraLogic,Storj,Synology", Advanced: true, Examples: []fs.OptionExample{{ Value: "private", @@ -3780,6 +3825,8 @@ func setQuirks(opt *Options) { virtualHostStyle = false case "OVHcloud": // No quirks + case "Rabata": + // server side copy not supported case "RackCorp": // No quirks useMultipartEtag = false // untested @@ -4060,6 +4107,9 @@ func NewFs(ctx context.Context, name, root string, m configmap.Mapper) (fs.Fs, e if opt.Provider == "AWS" { f.features.DoubleSlash = true } + if opt.Provider == "Rabata" { + f.features.Copy = nil + } if opt.DirectoryMarkers { f.features.CanHaveEmptyDirectories = true } @@ -6195,6 +6245,10 @@ func (o *Object) ModTime(ctx context.Context) time.Time { // SetModTime sets the modification time of the local fs object func (o *Object) SetModTime(ctx context.Context, modTime time.Time) error { + if o.fs.opt.Provider == "Rabata" { + // Rabata does not support copying objects + return fs.ErrorCantSetModTime + } err := o.readMetaData(ctx) if err != nil { return err diff --git a/docs/content/_index.md b/docs/content/_index.md index f44dc7f1e..94b97c4a3 100644 --- a/docs/content/_index.md +++ b/docs/content/_index.md @@ -180,6 +180,7 @@ WebDAV or S3, that work out of the box.) {{< 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="Quatrix by Maytech" home="https://www.maytech.net/products/quatrix-business" config="/quatrix/" >}} +{{< provider name="Rabata Cloud Storage" home="https://rabata.io" config="/s3/#Rabata" >}} {{< 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 53cc8db0f..32f7802a3 100644 --- a/docs/content/s3.md +++ b/docs/content/s3.md @@ -39,6 +39,7 @@ The S3 backend can be used with a number of different providers: {{< provider name="Petabox" home="https://petabox.io/" config="/s3/#petabox" >}} {{< provider name="Pure Storage FlashBlade" home="https://www.purestorage.com/products/unstructured-data-storage.html" config="/s3/#pure-storage-flashblade" >}} {{< provider name="Qiniu Cloud Object Storage (Kodo)" home="https://www.qiniu.com/en/products/kodo" config="/s3/#qiniu" >}} +{{< provider name="Rabata Cloud Storage" home="https://rabata.io" config="/s3/#Rabata" >}} {{< provider name="RackCorp Object Storage" home="https://www.rackcorp.com/" config="/s3/#RackCorp" >}} {{< provider name="Rclone Serve S3" home="/commands/rclone_serve_s3/" config="/s3/#rclone" >}} {{< provider name="Scaleway" home="https://www.scaleway.com/en/object-storage/" config="/s3/#scaleway" >}} @@ -5749,6 +5750,131 @@ secret_access_key = XXX endpoint = s5lu.com ``` +### Rabata {#Rabata} + +[Rabata](https://rabata.io) is an S3-compatible secure cloud storage service that offers flat, transparent pricing (no API request fees) +while supporting standard S3 APIs. It is suitable for backup, application storage,media workflows, and archive use cases. + +Server side copy is not implemented with Rabata, also meaning modification time of objects cannot be updated. + +Rclone config: + +``` +rclone config +No remotes found, make a new one? +n) New remote +s) Set configuration password +q) Quit config +n/s/q> n + +Enter name for new remote. +name> Rabata + +Option Storage. +Type of storage to configure. +Choose a number from below, or type in your own value. +[snip] +XX / Amazon S3 Compliant Storage Providers including AWS, ... + \ (s3) +[snip] +Storage> s3 + +Option provider. +Choose your S3 provider. +Choose a number from below, or type in your own value. +Press Enter to leave empty. +[snip] +XX / Rabata Cloud Storage + \ (Rabata) +[snip] +provider> Rabata + +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> + +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_ID + +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 where your bucket will be created and your data stored. +Choose a number from below, or type in your own value. +Press Enter to leave empty. + 1 / US East (N. Virginia) + \ (us-east-1) + 2 / EU (Ireland) + \ (eu-west-1) + 3 / EU (London) + \ (eu-west-2) +region> 3 + +Option endpoint. +Endpoint for Rabata Object Storage. +Choose a number from below, or type in your own value. +Press Enter to leave empty. + 1 / US East (N. Virginia) + \ (s3.us-east-1.rabata.io) + 2 / EU West (Ireland) + \ (s3.eu-west-1.rabata.io) + 3 / EU West (London) + \ (s3.eu-west-2.rabata.io) +endpoint> 3 + +Option location_constraint. +location where your bucket will be created and your data stored. +Choose a number from below, or type in your own value. +Press Enter to leave empty. + 1 / US East (N. Virginia) + \ (us-east-1) + 2 / EU (Ireland) + \ (eu-west-1) + 3 / EU (London) + \ (eu-west-2) +location_constraint> 3 + +Edit advanced config? +y) Yes +n) No (default) +y/n> n + +Configuration complete. +Options: +- type: s3 +- provider: Rabata +- access_key_id: ACCESS_KEY_ID +- secret_access_key: SECRET_ACCESS_KEY +- region: eu-west-2 +- endpoint: s3.eu-west-2.rabata.io +- location_constraint: eu-west-2 +Keep this "rabata" remote? +y) Yes this is OK (default) +e) Edit this remote +d) Delete this remote +y/e/d> y + +Current remotes: + +Name Type +==== ==== +rabata 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.