#pragma once ///@file #include "binary-cache-store.hh" #include namespace nix { struct S3BinaryCacheStoreConfig : virtual BinaryCacheStoreConfig { std::string bucketName; using BinaryCacheStoreConfig::BinaryCacheStoreConfig; S3BinaryCacheStoreConfig(std::string_view uriScheme, std::string_view bucketName, const Params & params); const Setting profile{ this, "", "profile", R"( The name of the AWS configuration profile to use. By default Nix will use the `default` profile. )"}; protected: constexpr static const char * defaultRegion = "us-east-1"; public: const Setting region{ this, defaultRegion, "region", R"( The region of the S3 bucket. If your bucket is not in `us–east-1`, you should always explicitly specify the region parameter. )"}; const Setting scheme{ this, "", "scheme", R"( The scheme used for S3 requests, `https` (default) or `http`. This option allows you to disable HTTPS for binary caches which don't support it. > **Note** > > HTTPS should be used if the cache might contain sensitive > information. )"}; const Setting endpoint{ this, "", "endpoint", R"( The URL of the endpoint of an S3-compatible service such as MinIO. Do not specify this setting if you're using Amazon S3. > **Note** > > This endpoint must support HTTPS and will use path-based > addressing instead of virtual host based addressing. )"}; const Setting narinfoCompression{ this, "", "narinfo-compression", "Compression method for `.narinfo` files."}; const Setting lsCompression{this, "", "ls-compression", "Compression method for `.ls` files."}; const Setting logCompression{ this, "", "log-compression", R"( Compression method for `log/*` files. It is recommended to use a compression method supported by most web browsers (e.g. `brotli`). )"}; const Setting multipartUpload{this, false, "multipart-upload", "Whether to use multi-part uploads."}; const Setting bufferSize{ this, 5 * 1024 * 1024, "buffer-size", "Size (in bytes) of each part in multi-part uploads."}; const std::string name() override { return "S3 Binary Cache Store"; } static std::set uriSchemes() { return {"s3"}; } std::string doc() override; }; class S3BinaryCacheStore : public virtual BinaryCacheStore { protected: S3BinaryCacheStore(const Params & params); public: struct Stats { std::atomic put{0}; std::atomic putBytes{0}; std::atomic putTimeMs{0}; std::atomic get{0}; std::atomic getBytes{0}; std::atomic getTimeMs{0}; std::atomic head{0}; }; virtual const Stats & getS3Stats() = 0; }; }