From 7c3909589c939e01036ae1264828ea0db14f0161 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Fri, 1 May 2026 11:06:37 +0100 Subject: [PATCH] s3: add Impossible Cloud as a new S3 provider --- README.md | 1 + backend/s3/provider/ImpossibleCloud.yaml | 21 +++ backend/s3/s3_internal_test.go | 7 + docs/content/_index.md | 1 + docs/content/s3.md | 175 +++++++++++++++++++++++ 5 files changed, 205 insertions(+) create mode 100644 backend/s3/provider/ImpossibleCloud.yaml diff --git a/README.md b/README.md index 2aabfdffe..7f1bc9873 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,7 @@ directories to and from different cloud storage providers. - Internxt [:page_facing_up:](https://rclone.org/internxt/) - Jottacloud [:page_facing_up:](https://rclone.org/jottacloud/) - IBM COS S3 [:page_facing_up:](https://rclone.org/s3/#ibm-cos-s3) +- Impossible Cloud [:page_facing_up:](https://rclone.org/s3/#impossible-cloud) - Intercolo Object Storage [:page_facing_up:](https://rclone.org/s3/#intercolo) - IONOS Cloud [:page_facing_up:](https://rclone.org/s3/#ionos) - Koofr [:page_facing_up:](https://rclone.org/koofr/) diff --git a/backend/s3/provider/ImpossibleCloud.yaml b/backend/s3/provider/ImpossibleCloud.yaml new file mode 100644 index 000000000..4784e705c --- /dev/null +++ b/backend/s3/provider/ImpossibleCloud.yaml @@ -0,0 +1,21 @@ +name: ImpossibleCloud +description: Impossible Cloud Object Storage +region: + eu-central-2: Frankfurt, Germany + eu-west-1: Amsterdam, Netherlands + eu-west-2: London, UK + eu-west-3: Paris, France + eu-east-1: Poznań, Poland + eu-north-1: Copenhagen, Denmark + us-east-1: New York, USA +endpoint: + eu-central-2.storage.impossibleapi.net: Frankfurt, Germany + eu-west-1.storage.impossibleapi.net: Amsterdam, Netherlands + eu-west-2.storage.impossibleapi.net: London, UK + eu-west-3.storage.impossibleapi.net: Paris, France + eu-east-1.storage.impossibleapi.net: Poznań, Poland + eu-north-1.storage.impossibleapi.net: Copenhagen, Denmark + us-east-1.storage.impossibleapi.net: New York, USA +location_constraint: {} +acl: {} +bucket_acl: true diff --git a/backend/s3/s3_internal_test.go b/backend/s3/s3_internal_test.go index ebb0ee80e..5a67ffbdb 100644 --- a/backend/s3/s3_internal_test.go +++ b/backend/s3/s3_internal_test.go @@ -44,6 +44,13 @@ func md5sum(t *testing.T, s string) string { } func (f *Fs) InternalTestMetadata(t *testing.T) { + // Impossible Cloud silently drops cache-control, + // content-disposition, content-encoding and content-language + // system metadata on retrieval (and thus also breaks the + // Content-Encoding response header that --s3-decompress relies on). + if f.opt.Provider == "ImpossibleCloud" { + t.Skip("Impossible Cloud does not preserve all S3 system metadata") + } ctx := context.Background() original := random.String(1000) contents := gz(t, original) diff --git a/docs/content/_index.md b/docs/content/_index.md index 7b6958577..e16bc4e9f 100644 --- a/docs/content/_index.md +++ b/docs/content/_index.md @@ -159,6 +159,7 @@ WebDAV or S3, that work out of the box.) {{< provider name="Jottacloud" home="https://www.jottacloud.com/en/" config="/jottacloud/" >}} {{< provider name="IBM COS S3" home="http://www.ibm.com/cloud/object-storage" config="/s3/#ibm-cos-s3" >}} {{< provider name="IDrive e2" home="https://www.idrive.com/e2/?refer=rclone" config="/s3/#idrive-e2" >}} +{{< provider name="Impossible Cloud" home="https://www.impossiblecloud.com/" config="/s3/#impossible-cloud" >}} {{< provider name="Intercolo Object Storage" home="https://intercolo.de/object-storage" config="/s3/#intercolo" >}} {{< provider name="IONOS Cloud" home="https://cloud.ionos.com/storage/object-storage" config="/s3/#ionos" >}} {{< provider name="Koofr" home="https://koofr.eu/" config="/koofr/" >}} diff --git a/docs/content/s3.md b/docs/content/s3.md index a70f77962..15e8984a2 100644 --- a/docs/content/s3.md +++ b/docs/content/s3.md @@ -31,6 +31,7 @@ The S3 backend can be used with a number of different providers: {{< provider name="Huawei OBS" home="https://www.huaweicloud.com/intl/en-us/product/obs.html" config="/s3/#huawei-obs" >}} {{< provider name="IBM COS S3" home="http://www.ibm.com/cloud/object-storage" config="/s3/#ibm-cos-s3" >}} {{< provider name="IDrive e2" home="https://www.idrive.com/e2/?refer=rclone" config="/s3/#idrive-e2" >}} +{{< provider name="Impossible Cloud" home="https://www.impossiblecloud.com/" config="/s3/#impossible-cloud" >}} {{< provider name="Intercolo Object Storage" home="https://intercolo.de/object-storage" config="/s3/#intercolo" >}} {{< provider name="IONOS Cloud" home="https://cloud.ionos.com/storage/object-storage" config="/s3/#ionos" >}} {{< provider name="Leviia Object Storage" home="https://www.leviia.com/object-storage/" config="/s3/#leviia" >}} @@ -6177,6 +6178,180 @@ d) Delete this remote y/e/d> y ``` +### Impossible Cloud {#impossible-cloud} + +[Impossible Cloud](https://www.impossiblecloud.com/) is a European +S3-compatible object storage provider with regions in Europe and the +US. + +Note: Impossible Cloud does not preserve the `Cache-Control`, +`Content-Disposition`, `Content-Encoding` or `Content-Language` system +metadata fields on retrieval, even when they were set at upload time. +Because the `Content-Encoding` response header is also dropped, the +`--s3-decompress` flag has no effect on objects stored there. Other +metadata such as `Content-Type` and the modification time round-trip +normally. + +Here is an example of making an Impossible Cloud configuration. First run: + +```console +rclone config +``` + +This will guide you through an interactive setup process. + +```text +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> my-impossible-cloud +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, Alibaba, ArvanCloud, Ceph, ChinaMobile, Cloudflare, DigitalOcean, Dreamhost, GCS, Hetzner, HuaweiOBS, IBMCOS, IDrive, ImpossibleCloud, IONOS, LyveCloud, Leviia, Liara, Linode, Magalu, Minio, Netease, Outscale, Petabox, RackCorp, Rclone, Scaleway, SeaweedFS, Selectel, Storj, Synology, TencentCOS, Wasabi, Qiniu and others + \ (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 / Impossible Cloud Object Storage + \ (ImpossibleCloud) +[snip] +provider> ImpossibleCloud +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 +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_KEY +Option region. +Region to connect to. +Choose a number from below, or type in your own value. +Press Enter to leave empty. + 1 / Frankfurt, Germany + \ (eu-central-2) + 2 / Amsterdam, Netherlands + \ (eu-west-1) + 3 / London, UK + \ (eu-west-2) + 4 / Paris, France + \ (eu-west-3) + 5 / Poznań, Poland + \ (eu-east-1) + 6 / Copenhagen, Denmark + \ (eu-north-1) + 7 / New York, USA + \ (us-east-1) +region> 1 +Option endpoint. +Endpoint for Impossible Cloud Object Storage +Choose a number from below, or type in your own value. +Press Enter to leave empty. + 1 / Frankfurt, Germany + \ (eu-central-2.storage.impossibleapi.net) + 2 / Amsterdam, Netherlands + \ (eu-west-1.storage.impossibleapi.net) + 3 / London, UK + \ (eu-west-2.storage.impossibleapi.net) + 4 / Paris, France + \ (eu-west-3.storage.impossibleapi.net) + 5 / Poznań, Poland + \ (eu-east-1.storage.impossibleapi.net) + 6 / Copenhagen, Denmark + \ (eu-north-1.storage.impossibleapi.net) + 7 / New York, USA + \ (us-east-1.storage.impossibleapi.net) +endpoint> 1 +Option location_constraint. +Location constraint - must be set to match the Region. +Leave blank if not sure. Used when creating buckets only. +Enter a value. Press Enter to leave empty. +location_constraint> +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. +If the acl is an empty string then no X-Amz-Acl: header is added and +the default (private) will be used. +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) + / Owner gets FULL_CONTROL. + 2 | The AllUsers group gets READ access. + \ (public-read) +acl> +Edit advanced config? +y) Yes +n) No (default) +y/n> +Configuration complete. +Options: +- type: s3 +- provider: ImpossibleCloud +- access_key_id: ACCESS_KEY +- secret_access_key: SECRET_KEY +- region: eu-central-2 +- endpoint: eu-central-2.storage.impossibleapi.net +Keep this "my-impossible-cloud" remote? +y) Yes this is OK (default) +e) Edit this remote +d) Delete this remote +y/e/d> +Current remotes: + +Name Type +==== ==== +my-impossible-cloud s3 + +e) Edit existing remote +n) New remote +d) Delete remote +r) Rename remote +c) Copy remote +s) Set configuration password +q) Quit config +e/n/d/r/c/s/q> +``` + +This will leave the config file looking like this. + +```ini +[my-impossible-cloud] +type = s3 +provider = ImpossibleCloud +access_key_id = ACCESS_KEY +secret_access_key = SECRET_KEY +region = eu-central-2 +endpoint = eu-central-2.storage.impossibleapi.net +acl = private +``` + ### Intercolo Object Storage {#intercolo} [Intercolo Object Storage](https://intercolo.de/object-storage) offers