diff --git a/CHANGELOG.md b/CHANGELOG.md index c95d4ea41..be8c73f53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ released version of restic from the perspective of the user. Important Changes in 0.X.Y ========================== + * The s3 backend used the subdir `restic` within a bucket if no explicit path + after the bucket name was specified. Since this version, restic does not use + this default path any more. If you created a repo on s3 in a bucket without + specifying a path within the bucket, you need to add `/restic` at the end of + the repository specification to access your repo: `s3:s3.amazonaws.com/bucket/restic` + https://github.com/restic/restic/issues/1292 + https://github.com/restic/restic/pull/1437 + * We've added a local cache for metadata so that restic doesn't need to load all metadata (snapshots, indexes, ...) from the repo each time it starts. By default the cache is active, but there's a new global option `--no-cache` diff --git a/doc/030_preparing_a_new_repo.rst b/doc/030_preparing_a_new_repo.rst index 37b011bdf..35500b28e 100644 --- a/doc/030_preparing_a_new_repo.rst +++ b/doc/030_preparing_a_new_repo.rst @@ -176,6 +176,15 @@ different location, so you need to create it using a different program. Afterwards, the S3 server (``s3.amazonaws.com``) will redirect restic to the correct endpoint. +Until version 0.8.0, restic used a default prefix of ``restic``, so the files +in the bucket were placed in a directory named ``restic``. If you want to +access a repository created with an older version of restic, specify the path +after the bucket name like this: + +.. code-block:: console + + $ restic -r s3:s3.amazonaws.com/bucket_name/restic [...] + For an S3-compatible server that is not Amazon (like Minio, see below), or is only available via HTTP, you can specify the URL to the server like this: ``s3:http://server:port/bucket_name``. diff --git a/internal/backend/location/location_test.go b/internal/backend/location/location_test.go index f8d05ca78..3160a2af7 100644 --- a/internal/backend/location/location_test.go +++ b/internal/backend/location/location_test.go @@ -169,7 +169,7 @@ var parseTests = []struct { Config: s3.Config{ Endpoint: "eu-central-1", Bucket: "bucketname", - Prefix: "restic", + Prefix: "", Connections: 5, }, }, @@ -180,7 +180,7 @@ var parseTests = []struct { Config: s3.Config{ Endpoint: "hostname.foo", Bucket: "bucketname", - Prefix: "restic", + Prefix: "", Connections: 5, }, }, @@ -202,7 +202,7 @@ var parseTests = []struct { Config: s3.Config{ Endpoint: "eu-central-1", Bucket: "repo", - Prefix: "restic", + Prefix: "", Connections: 5, }, }, @@ -224,7 +224,7 @@ var parseTests = []struct { Config: s3.Config{ Endpoint: "hostname.foo", Bucket: "repo", - Prefix: "restic", + Prefix: "", Connections: 5, }, }, @@ -246,7 +246,7 @@ var parseTests = []struct { Config: s3.Config{ Endpoint: "hostname.foo", Bucket: "repo", - Prefix: "restic", + Prefix: "", UseHTTP: true, Connections: 5, }, diff --git a/internal/backend/s3/config.go b/internal/backend/s3/config.go index 59cdec254..1760f48c2 100644 --- a/internal/backend/s3/config.go +++ b/internal/backend/s3/config.go @@ -34,11 +34,9 @@ func init() { options.Register("s3", Config{}) } -const defaultPrefix = "restic" - // ParseConfig parses the string s and extracts the s3 config. The two // supported configuration formats are s3://host/bucketname/prefix and -// s3:host:bucketname/prefix. The host can also be a valid s3 region +// s3:host/bucketname/prefix. The host can also be a valid s3 region // name. If no prefix is given the prefix "restic" will be used. func ParseConfig(s string) (interface{}, error) { switch { @@ -71,15 +69,15 @@ func ParseConfig(s string) (interface{}, error) { } func createConfig(endpoint string, p []string, useHTTP bool) (interface{}, error) { - var prefix string - switch { - case len(p) < 1: + if len(p) < 1 { return nil, errors.New("s3: invalid format, host/region or bucket name not found") - case len(p) == 1 || p[1] == "": - prefix = defaultPrefix - default: + } + + var prefix string + if len(p) > 1 && p[1] != "" { prefix = path.Clean(p[1]) } + cfg := NewConfig() cfg.Endpoint = endpoint cfg.UseHTTP = useHTTP diff --git a/internal/backend/s3/config_test.go b/internal/backend/s3/config_test.go index 8e5f3a420..77a31fda3 100644 --- a/internal/backend/s3/config_test.go +++ b/internal/backend/s3/config_test.go @@ -9,13 +9,13 @@ var configTests = []struct { {"s3://eu-central-1/bucketname", Config{ Endpoint: "eu-central-1", Bucket: "bucketname", - Prefix: "restic", + Prefix: "", Connections: 5, }}, {"s3://eu-central-1/bucketname/", Config{ Endpoint: "eu-central-1", Bucket: "bucketname", - Prefix: "restic", + Prefix: "", Connections: 5, }}, {"s3://eu-central-1/bucketname/prefix/directory", Config{ @@ -33,13 +33,13 @@ var configTests = []struct { {"s3:eu-central-1/foobar", Config{ Endpoint: "eu-central-1", Bucket: "foobar", - Prefix: "restic", + Prefix: "", Connections: 5, }}, {"s3:eu-central-1/foobar/", Config{ Endpoint: "eu-central-1", Bucket: "foobar", - Prefix: "restic", + Prefix: "", Connections: 5, }}, {"s3:eu-central-1/foobar/prefix/directory", Config{ @@ -57,26 +57,26 @@ var configTests = []struct { {"s3:https://hostname:9999/foobar", Config{ Endpoint: "hostname:9999", Bucket: "foobar", - Prefix: "restic", + Prefix: "", Connections: 5, }}, {"s3:https://hostname:9999/foobar/", Config{ Endpoint: "hostname:9999", Bucket: "foobar", - Prefix: "restic", + Prefix: "", Connections: 5, }}, {"s3:http://hostname:9999/foobar", Config{ Endpoint: "hostname:9999", Bucket: "foobar", - Prefix: "restic", + Prefix: "", UseHTTP: true, Connections: 5, }}, {"s3:http://hostname:9999/foobar/", Config{ Endpoint: "hostname:9999", Bucket: "foobar", - Prefix: "restic", + Prefix: "", UseHTTP: true, Connections: 5, }},