Skip to content

About

No description, website, or topics provided.

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

109 Commits

Folders and files

Repository files navigation

s3proxy

Version: 1.0.0 Type: application AppVersion: 4.1.1

A Helm chart for deploying S3Proxy - Access other storage backends via the S3 API

Requirements

Repository Name Version
oci://ghcr.io/comet-ml comet-common 0.3.0

Prerequisites

  • Kubernetes 1.19+
  • Helm 3.2.0+
  • PV provisioner support in the underlying infrastructure (if using filesystem backend with persistence)

S3Proxy version compatibility

Chart 1.x targets S3Proxy 4.x (appVersion currently 4.1.1; override with image.tag). Minimum supported version is 4.0.0.

S3Proxy 4.0.0 removed Apache jclouds and, with it, the Atmos and B2 backends and the -sdk / -nio2 provider-name variants. Each backend now has a single native/SDK implementation selected by its plain name — filesystem, transient, aws-s3, azureblob, google-cloud-storage, openstack-swift — so the chart no longer exposes the aws: / nio2: / azureblob.provider toggles.

  • filesystem / transient — the NIO2 implementations (no toggle).
  • s3 — the aws-s3 AWS SDK provider; serves AWS or any S3-compatible endpoint (set endpoint). Supports keyless auth: leave accessKeyID/secretAccessKey empty and set s3.keyless: true to use the AWS default credential chain (IRSA / EKS Pod Identity / EC2 instance profile).
  • azureblob — the Azure SDK; supports Managed/Workload Identity via azureblob.managedIdentity: true (no static key) — see "Example 3b".
  • googleCloudStorage — the Google SDK; a static service-account JSON key is required (serviceAccountKey.value / .existingSecret). Keyless GCS (Workload Identity/ADC) is not supported by S3Proxy 4.x — an empty credential selects an unauthenticated (emulator-only) client, not ADC.
  • openstackSwift — the openstack4j SDK (Keystone v3); set projectName and, if non-default, projectDomainName / userDomainName.

Removed in chart 1.x: the b2 and rackspaceCloudfiles backends (jclouds-only, dropped upstream). Rackspace Cloud Files is OpenStack-Swift-compatible — configure it via the openstackSwift backend.

  • Guardrail: the chart hard-fails at render time if the effective S3Proxy version (image.tag, else appVersion) parses as semver and is older than 4.0.0, so it cannot render a 4.x-only config against a 3.x image. Use chart 0.x for S3Proxy 3.x.

Installation

Install the chart

# Install with default values (filesystem backend)
helm install my-s3proxy oci://ghcr.io/comet-ml/s3proxy

# Install with custom values
helm install my-s3proxy oci://ghcr.io/comet-ml/s3proxy -f override-values.yaml

Configuration

The following section lists the configurable parameters of the s3proxy chart and their default values.

Values

Scroll sideways to see all columns.

Key Description Type Default
affinity Affinity for pod assignment object {}
autoscaling.enabled Enable HPA bool false
autoscaling.maxReplicas Maximum number of replicas int 100
autoscaling.minReplicas Minimum number of replicas int 1
autoscaling.targetCPUUtilizationPercentage Target CPU utilization percentage int 80
config.auth.existingSecret Name of an existing Secret holding both client authentication credentials (see identityKey/secretKey). Takes precedence over identity/secret, which are otherwise stored in plaintext in the chart-owned Secret; prefer this when the values file lives in Git. string ""
config.auth.identity S3 Access Key ID for client authentication, stored in the chart-owned Secret. Ignored when existingSecret is set. string ""
config.auth.identityKey Key within existingSecret that holds the S3 Access Key ID string "accessKeyId"
config.auth.secret S3 Secret Access Key for client authentication, stored in the chart-owned Secret. Ignored when existingSecret is set. string ""
config.auth.secretKey Key within existingSecret that holds the S3 Secret Access Key string "secretAccessKey"
config.auth.type Authorization type (none, aws-v2, aws-v4, aws-v2-or-v4) string "aws-v4"
config.backends.azureblob.account Storage account name string ""
config.backends.azureblob.bucketLocators Buckets routed to this backend (S3Proxy bucket-locator; glob patterns supported). Only relevant when multiple backends are enabled; a bucket matching no backend's list falls through to the first-enabled backend. list []
config.backends.azureblob.enabled Enable Azure Blob Storage backend (provider azureblob, Azure SDK) bool false
config.backends.azureblob.endpoint Azure endpoint string https://{{ .Values.config.backends.azureblob.account }}.blob.core.windows.net
config.backends.azureblob.key Storage account key configuration object {"existingSecret":"","secretKey":"accountKey","value":""}
config.backends.azureblob.key.existingSecret Name of existing secret containing the storage account key string ""
config.backends.azureblob.key.secretKey Key in the existing secret containing the storage account key string "accountKey"
config.backends.azureblob.key.value Storage account key value string ""
config.backends.azureblob.managedIdentity Use Azure Managed/Workload Identity instead of a static account key or SAS token. Mutually exclusive with key. and sasToken.. When true the chart renders both jclouds.identity and jclouds.credential empty, which makes the Azure SDK fall back to DefaultAzureCredential (consuming the AKS workload-identity env AZURE_CLIENT_ID/AZURE_TENANT_ID/AZURE_FEDERATED_TOKEN_FILE). Set account (or endpoint) for the storage endpoint, annotate the ServiceAccount with azure.workload.identity/client-id (serviceAccount.annotations) and label the pod azure.workload.identity/use: "true" (podLabels). bool false
config.backends.azureblob.sasToken SAS token configuration object {"existingSecret":"","secretKey":"sasToken","value":""}
config.backends.azureblob.sasToken.existingSecret Name of existing secret containing the SAS token string ""
config.backends.azureblob.sasToken.secretKey Key in the existing secret containing the SAS token string "sasToken"
config.backends.azureblob.sasToken.value SAS token value string ""
config.backends.filesystem.basedir Base directory for filesystem backend string "/data/s3proxy"
config.backends.filesystem.bucketLocators Buckets routed to this backend (S3Proxy bucket-locator; glob patterns supported). Only relevant when multiple backends are enabled; a bucket matching no backend's list falls through to the first-enabled backend. list []
config.backends.filesystem.credential jclouds credential placeholder. S3Proxy requires jclouds.credential in every backend properties file; the filesystem backend ignores the value. An empty value falls back to "local". string "local"
config.backends.filesystem.enabled Enable filesystem backend (provider filesystem, NIO2-backed in S3Proxy 4.x) bool true
config.backends.filesystem.identity jclouds identity placeholder. S3Proxy requires jclouds.identity in every backend properties file; the filesystem backend ignores the value. An empty value falls back to "local". string "local"
config.backends.googleCloudStorage.bucketLocators Buckets routed to this backend (S3Proxy bucket-locator; glob patterns supported). Only relevant when multiple backends are enabled; a bucket matching no backend's list falls through to the first-enabled backend. list []
config.backends.googleCloudStorage.enabled Enable Google Cloud Storage backend (provider google-cloud-storage, Google SDK) bool false
config.backends.googleCloudStorage.endpoint Custom GCS endpoint (jclouds.endpoint), e.g. a fake-gcs-server emulator. Empty uses https://storage.googleapis.com. An emulator needs no serviceAccountKey: with no key the SDK sends unauthenticated requests. string ""
config.backends.googleCloudStorage.projectID GCP project ID, emitted as jclouds.identity (the GCS SDK store reads it as the project id). Optional: when empty the project is taken from the service-account key. string ""
config.backends.googleCloudStorage.serviceAccountKey Service-account key configuration. The full JSON key is passed to the GCS SDK as jclouds.credential (ServiceAccountCredentials.fromStream). NOTE: S3Proxy 4.x does NOT support keyless GCS (Workload Identity/ADC) — an empty credential selects an unauthenticated (emulator-only) client, not ADC — so a static key is required against real GCS. object {"existingSecret":"","secretKey":"key.json","value":""}
config.backends.googleCloudStorage.serviceAccountKey.existingSecret Name of an existing Secret holding the service-account JSON key string ""
config.backends.googleCloudStorage.serviceAccountKey.secretKey Key within the Secret that holds the JSON key string "key.json"
config.backends.googleCloudStorage.serviceAccountKey.value Inline service-account JSON key content, stored in the chart-owned Secret and mounted as a file the initContainer merges into the backend properties (kept out of the ConfigMap). Used only when existingSecret is empty. string ""
config.backends.openstackSwift.authURL Keystone authentication URL (jclouds.endpoint) string ""
config.backends.openstackSwift.bucketLocators Buckets routed to this backend (S3Proxy bucket-locator; glob patterns supported). Only relevant when multiple backends are enabled; a bucket matching no backend's list falls through to the first-enabled backend. list []
config.backends.openstackSwift.enabled Enable OpenStack Swift backend (provider openstack-swift, openstack4j SDK, Keystone v3) bool false
config.backends.openstackSwift.password Password configuration object {"existingSecret":"","secretKey":"password","value":""}
config.backends.openstackSwift.password.existingSecret Name of existing secret containing the password string ""
config.backends.openstackSwift.password.secretKey Key in the existing secret containing the password string "password"
config.backends.openstackSwift.password.value Password value string ""
config.backends.openstackSwift.projectDomainName Keystone domain that owns the project (openstack-swift-sdk.project-domain-name) string "Default"
config.backends.openstackSwift.projectName Keystone project (tenant) name to scope the token to (openstack-swift-sdk.project-name). Required: Swift is only reachable through a project-scoped token. string ""
config.backends.openstackSwift.region Region to select from the service catalog (openstack-swift-sdk.region); empty selects the first/default region string ""
config.backends.openstackSwift.userDomainName Keystone domain that owns the user (openstack-swift-sdk.user-domain-name) string "Default"
config.backends.openstackSwift.userName Username (jclouds.identity) string ""
config.backends.s3.accessKeyID S3 Access Key ID for backend (jclouds.identity). Leave empty when keyless: true. string ""
config.backends.s3.bucketLocators Buckets routed to this backend (S3Proxy bucket-locator; glob patterns supported). Only relevant when multiple backends are enabled; a bucket matching no backend's list falls through to the first-enabled backend. list []
config.backends.s3.enabled Enable S3 backend (provider aws-s3, AWS SDK; also serves S3-compatible endpoints such as MinIO/Ceph via endpoint) bool false
config.backends.s3.endpoint S3 endpoint (jclouds.endpoint) for an S3-compatible backend (MinIO, Ceph). Leave empty for AWS. string ""
config.backends.s3.keyless Use ambient/keyless credentials: leave accessKeyID/secretAccessKey empty and the AWS SDK default credential chain resolves IRSA / EKS Pod Identity / EC2 instance-profile creds. Mutually exclusive with accessKeyID/secretAccessKey.*. bool false
config.backends.s3.region AWS region (jclouds.region). S3Proxy defaults to us-east-1 when empty. string ""
config.backends.s3.secretAccessKey S3 Secret Access Key configuration. Leave empty when keyless: true. object {"existingSecret":"","secretKey":"secretAccessKey","value":""}
config.backends.s3.secretAccessKey.existingSecret Name of existing secret containing the secret access key string ""
config.backends.s3.secretAccessKey.secretKey Key in the existing secret containing the secret access key string "secretAccessKey"
config.backends.s3.secretAccessKey.value Secret access key value string ""
config.backends.transient.bucketLocators Buckets routed to this backend (S3Proxy bucket-locator; glob patterns supported). Only relevant when multiple backends are enabled; a bucket matching no backend's list falls through to the first-enabled backend. list []
config.backends.transient.credential jclouds credential placeholder. S3Proxy requires jclouds.credential in every backend properties file; the transient backend ignores the value. An empty value falls back to "local". string "local"
config.backends.transient.enabled Enable transient (in-memory) backend (provider transient, NIO2-backed in S3Proxy 4.x) bool false
config.backends.transient.identity jclouds identity placeholder. S3Proxy requires jclouds.identity in every backend properties file; the transient backend ignores the value. An empty value falls back to "local". string "local"
config.buckets.alias Map virtual bucket names to actual backend buckets object {}
config.cors.allowCredential Allow credentials bool false
config.cors.allowHeaders Allowed headers list ["Accept","Content-Type"]
config.cors.allowMethods Allowed methods list ["GET","PUT","POST","HEAD","DELETE"]
config.cors.allowOrigins Allowed origins (e.g., ["https://example.com", "https://.+\\.example\\.com"]) list []
config.cors.enabled Enable CORS support bool false
config.logLevel Log level for S3Proxy (DEBUG, INFO, WARN, ERROR) string "INFO"
config.middlewares.eventualConsistency Enable eventual consistency modeling bool false
config.middlewares.largeObjectMocking Enable large object mocking bool false
config.middlewares.readOnly Make backend read-only bool false
config.middlewares.shardedBackend Enable sharded backend containers bool false
config.tls.enabled Enable native in-pod HTTPS (S3Proxy secure-endpoint). When enabled, S3Proxy serves HTTPS only on service.targetPort (the plaintext endpoint is not bound), so TLS is terminated in the pod rather than at the ingress. Requires a PKCS12 (or JKS) keystore and its password. tcpSocket health probes are unaffected (they do not perform a TLS handshake). bool false
config.tls.keystore.existingSecret Name of an existing Secret holding the keystore file (binary PKCS12/JKS). Takes precedence over value. Use this for a customer-provided keystore or a cert-manager-issued one (Certificate.spec.keystores.pkcs12). string ""
config.tls.keystore.secretKey Key within keystore.existingSecret (or, when value is used, within the chart's own Secret) that holds the keystore file string "keystore.p12"
config.tls.keystore.value Inline base64-encoded keystore, stored in the chart's own Secret and mounted as a file. Used only when keystore.existingSecret is empty. Convenient for testing; prefer existingSecret in production. string ""
config.tls.keystorePassword.existingSecret Name of an existing Secret holding the keystore password. Takes precedence over value. string ""
config.tls.keystorePassword.secretKey Key within keystorePassword.existingSecret that holds the keystore password string "keystore-password"
config.tls.keystorePassword.value Inline keystore password, stored in the chart's own Secret and merged into the backend properties by the secret-merge initContainer (kept out of the ConfigMap). Used only when keystorePassword.existingSecret is empty. string ""
config.virtualHost Virtual Host configuration string ""
configMergeImage.pullPolicy Config merge container image pull policy string "IfNotPresent"
configMergeImage.repository Config merge container image repository string "busybox"
configMergeImage.tag Config merge container image tag string "1.36"
extraEnvVars Additional environment variables list []
extraVolumeMounts Additional volume mounts list []
extraVolumes Additional volumes list []
fullnameOverride String to fully override s3proxy.fullname template string ""
image.pullPolicy Image pull policy string "IfNotPresent"
image.repository S3Proxy image repository string "andrewgaul/s3proxy"
image.tag Overrides the image tag whose default is the chart appVersion string ""
imagePullSecrets Image pull secrets list []
ingress.annotations Ingress annotations object {}
ingress.className Ingress class name string ""
ingress.enabled Enable ingress bool false
ingress.hosts Ingress hosts configuration list []
ingress.tls TLS configuration list []
nameOverride String to partially override s3proxy.fullname template string ""
nodeSelector Node selector for pod assignment object {}
persistence.accessMode PVC Access Mode string "ReadWriteOnce"
persistence.annotations PVC annotations object {}
persistence.enabled Enable persistence using PVC bool true
persistence.existingClaim Use existing PVC string ""
persistence.size PVC Storage Request string "10Gi"
persistence.storageClass Storage Class string "" (uses default StorageClass)
podAnnotations Annotations to add to the pod object {}
podLabels Extra labels to add to the pod (merged with the chart's selector labels) object {}
podSecurityContext Pod security context object {}
replicaCount Number of S3Proxy replicas int 1
resources Resource limits and requests object {}
securityContext Container security context object {}
service.annotations Service annotations object {}
service.port Service port int 9000
service.targetPort Target port (controls both the container port and S3Proxy bind port) int 9000
service.type Kubernetes service type string "ClusterIP"
serviceAccount.annotations Annotations to add to the service account object {}
serviceAccount.create Specifies whether a service account should be created bool false
serviceAccount.name The name of the service account to use. If not set and create is true, a name is generated using the fullname template string ""
terminationGracePeriodSeconds Pod termination grace period. Covers the 5s preStop sleep plus the in-flight request drain (up to 30s) that S3Proxy releases after 3.3.0 perform on SIGTERM. int 40
tolerations Tolerations for pod assignment list []

Usage Examples

Example 1: Filesystem Backend with Authentication

# values-filesystem.yaml
config:
  auth:
    type: "aws-v4"
    identity: "myaccesskey"
    secret: "mysecretkey"
  backends:
    filesystem:
      enabled: true
      basedir: "/data/s3proxy"

persistence:
  enabled: true
  size: 20Gi

Install:

helm install s3proxy-fs ./s3proxy -f values-filesystem.yaml

Example 2: AWS S3 Backend

# values-aws-s3.yaml
config:
  auth:
    type: "aws-v4"
    identity: "proxy-access-key"  # For clients connecting to s3proxy
    secret: "proxy-secret-key"
  backends:
    filesystem:
      enabled: false
    s3:
      enabled: true
      region: "us-west-2"
      accessKeyID: "aws-access-key-id"       # For s3proxy to connect to AWS
      secretAccessKey:
        value: "aws-secret-access-key"

persistence:
  enabled: false  # Not needed for S3 backend

For keyless auth on EKS (IRSA / Pod Identity) or EC2, drop the keys and set keyless:

config:
  backends:
    filesystem:
      enabled: false
    s3:
      enabled: true
      region: "us-west-2"
      keyless: true

Install:

helm install s3proxy-s3 ./s3proxy -f values-aws-s3.yaml

Example 3: Azure Blob Storage Backend

# values-azure.yaml
config:
  auth:
    type: "aws-v4"
    identity: "myaccesskey"
    secret: "mysecretkey"
  backends:
    filesystem:
      enabled: false
    azureblob:
      enabled: true
      account: "mystorageaccount"
      key:
        value: "storageaccountkey"

persistence:
  enabled: false  # Not needed for Azure backend

Install:

helm install s3proxy-azure ./s3proxy -f values-azure.yaml

Example 3b: Azure Blob with Managed / Workload Identity (no static key)

On AKS with Workload Identity, set managedIdentity: true instead of an account key or SAS token. The chart then renders both jclouds.identity and jclouds.credential empty, which makes the azureblob-sdk provider fall back to Azure's DefaultAzureCredential — it reads the federated token AKS injects (AZURE_CLIENT_ID / AZURE_TENANT_ID / AZURE_FEDERATED_TOKEN_FILE). The storage account name goes in the endpoint, never in the identity.

# values-azure-mi.yaml
config:
  backends:
    filesystem:
      enabled: false
    azureblob:
      enabled: true
      managedIdentity: true
      account: "mystorageaccount" # used for the endpoint; NOT emitted as jclouds.identity
      # endpoint: "https://mystorageaccount.blob.core.windows.net"  # or set explicitly

# Bind the pod to the AKS user-assigned identity:
serviceAccount:
  create: true
  annotations:
    azure.workload.identity/client-id: "<managed-identity-client-id>"
podLabels:
  azure.workload.identity/use: "true"

persistence:
  enabled: false

Example 4: Google Cloud Storage Backend

The GCS SDK reads the credential as a full service-account JSON key. A static key is required — S3Proxy 4.x does not support keyless GCS (Workload Identity/ADC).

# values-gcs.yaml
config:
  auth:
    type: "aws-v4"
    identity: "myaccesskey"
    secret: "mysecretkey"
  backends:
    filesystem:
      enabled: false
    googleCloudStorage:
      enabled: true
      projectID: "my-project"
      serviceAccountKey:
        # The full service-account JSON key (or use existingSecret / secretKey).
        value: |
          {
            "type": "service_account",
            "project_id": "my-project",
            "private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
            "client_email": "service-account@my-project.iam.gserviceaccount.com"
          }

persistence:
  enabled: false  # Not needed for GCS backend

Example 5: Anonymous Access (No Authentication)

# values-anonymous.yaml
config:
  auth:
    type: "none"
  backends:
    transient:
      enabled: true  # In-memory storage

persistence:
  enabled: false

Client authentication credentials

config.auth.identity / config.auth.secret are the S3 Access Key ID and Secret Access Key that clients present to S3Proxy.

Option A: existing Secret (recommended)

Point config.auth.existingSecret at a Secret you manage yourself, so the credentials never appear in the values file (e.g. in GitOps). It takes precedence over inline identity/secret; both credentials are read from it:

config:
  auth:
    type: "aws-v4"
    existingSecret: my-s3proxy-auth
    identityKey: accessKeyId        # default; key holding the Access Key ID
    secretKey: secretAccessKey      # default; key holding the Secret Access Key
kubectl create secret generic my-s3proxy-auth \
  --from-literal=accessKeyId='myaccesskey' \
  --from-literal=secretAccessKey='mysecretkey'

Rotating the Secret does not restart the pod — roll the Deployment yourself, since the credentials are read once at startup.

Option B: inline credentials

Set config.auth.identity / config.auth.secret directly, as in Example 1. Convenient for testing; both values are stored in plaintext in the chart's own Secret.

Testing the Installation

Once deployed, you can test S3Proxy using the AWS CLI:

# Get the service endpoint
kubectl get svc

# Port-forward for local testing
kubectl port-forward svc/my-s3proxy 8080:8080

# Configure AWS CLI (if authentication is enabled)
export AWS_ACCESS_KEY_ID=myaccesskey
export AWS_SECRET_ACCESS_KEY=mysecretkey

# Test S3 operations
aws --endpoint-url http://localhost:8080 s3 ls
aws --endpoint-url http://localhost:8080 s3 mb s3://test-bucket
aws --endpoint-url http://localhost:8080 s3 cp test.txt s3://test-bucket/
aws --endpoint-url http://localhost:8080 s3 ls s3://test-bucket/

TLS / HTTPS (native, in-pod)

By default S3Proxy binds plain HTTP and TLS is expected to be terminated at the ingress. Set config.tls.enabled=true to have S3Proxy itself terminate HTTPS in the pod (S3Proxy's secure-endpoint). When enabled:

  • S3Proxy serves HTTPS only on service.targetPort (the plaintext endpoint is not bound). The container/Service port is named https.
  • The health probes are tcpSocket, which only check the TCP accept (no TLS handshake), so they keep working unchanged against the TLS port.
  • A PKCS12 keystore is expected (Jetty's default keystore type; JKS also works if supplied). S3Proxy exposes only the keystore path and password, so the chart does not set a keystore type.
  • The keystore password is never written to the ConfigMap; it is merged into the backend properties from the Secret by the config-merge initContainer.

Option A: existing Secret (recommended; also the cert-manager path)

Reference a Secret that already holds the keystore file and the password. This is also how a cert-manager Certificate with spec.keystores.pkcs12 delivers a keystore (point keystore.existingSecret at that Secret, and keystorePassword.existingSecret at the password Secret it references):

config:
  tls:
    enabled: true
    keystore:
      existingSecret: my-tls        # holds the PKCS12 archive
      secretKey: keystore.p12
    keystorePassword:
      existingSecret: my-tls        # holds the password (may be the same Secret)
      secretKey: keystore-password

Option B: inline keystore + password

Provide the base64-encoded keystore and the password inline; both are stored in the chart's own Secret. Convenient for testing; prefer Option A in production.

config:
  tls:
    enabled: true
    keystore:
      value: "<base64-encoded PKCS12 keystore>"
    keystorePassword:
      value: "changeit"

Create a PKCS12 keystore, for example:

# From an existing cert + key:
openssl pkcs12 -export -inkey tls.key -in tls.crt \
  -out keystore.p12 -passout pass:changeit
# Inline value:
base64 -w0 keystore.p12
# Or as an existing Secret (Option A):
kubectl create secret generic my-tls \
  --from-file=keystore.p12=keystore.p12 \
  --from-literal=keystore-password=changeit

Testing over HTTPS (the CI keystore above is self-signed, so skip verification):

aws --endpoint-url https://localhost:9000 --no-verify-ssl s3 ls

CORS Configuration

To enable CORS support:

config:
  cors:
    enabled: true
    allowOrigins:
      - "https://example.com"
      - "https://.+\\.example\\.com"
    allowMethods:
      - "GET"
      - "PUT"
      - "POST"
      - "HEAD"
      - "DELETE"
    allowHeaders:
      - "Accept"
      - "Content-Type"
    allowCredential: true

Middleware Configuration

S3Proxy supports various middlewares:

config:
  middlewares:
    readOnly: false           # Make backend read-only
    eventualConsistency: true # Enable eventual consistency modeling
    shardedBackend: true      # Enable sharded backend containers
    largeObjectMocking: false # Enable large object mocking

Bucket Configuration

Bucket Aliasing

Map virtual bucket names to actual backend buckets:

config:
  buckets:
    alias:
      virtual-bucket: "real-backend-bucket"
      another-bucket: "actual-bucket-name"

Bucket Locator (routing buckets to backends)

When more than one backend is enabled, assign buckets to a specific backend with that backend's own bucketLocators list. S3Proxy reads bucket-locators per backend, so each list is emitted only into that backend's properties file. Glob patterns are supported. A bucket that matches no backend's list falls through to the first-enabled backend (the default).

config:
  backends:
    s3:
      enabled: true
      # ... credentials ...
      bucketLocators:
        - "prod-*"
        - "customer-data"
    filesystem:
      enabled: true
      bucketLocators:
        - "scratch-*"   # everything else also lands here (first-enabled default)

Monitoring

Check S3Proxy logs:

kubectl logs deployment/my-s3proxy

Upgrading

helm upgrade my-s3proxy ./s3proxy -f my-values.yaml

Uninstalling

helm uninstall my-s3proxy

This will remove all resources created by the chart. If using persistence, the PVC will be retained by default.

Troubleshooting

Common Issues

  1. Authentication failures: Ensure config.auth.identity and config.auth.secret are set correctly (or, with config.auth.existingSecret, that the Secret exists and its identityKey/secretKey entries are present) for client authentication.

  2. Backend connection issues: Verify backend credentials are correctly configured in the appropriate section (e.g., config.backend.awsS3.*).

  3. Persistence issues: Check that your cluster has a default StorageClass or specify one explicitly.

  4. Port conflicts: If port 8080 is already in use, change service.port and service.targetPort.

References

License

This Helm chart is provided as-is. S3Proxy itself is licensed under the Apache License 2.0.


Autogenerated from chart metadata using helm-docs v1.14.2

About

No description, website, or topics provided.

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages