A Helm chart for deploying S3Proxy - Access other storage backends via the S3 API
| Repository | Name | Version |
|---|---|---|
| oci://ghcr.io/comet-ml | comet-common | 0.3.0 |
- Kubernetes 1.19+
- Helm 3.2.0+
- PV provisioner support in the underlying infrastructure (if using filesystem backend with persistence)
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— theaws-s3AWS SDK provider; serves AWS or any S3-compatible endpoint (setendpoint). Supports keyless auth: leaveaccessKeyID/secretAccessKeyempty and sets3.keyless: trueto use the AWS default credential chain (IRSA / EKS Pod Identity / EC2 instance profile).azureblob— the Azure SDK; supports Managed/Workload Identity viaazureblob.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); setprojectNameand, 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, elseappVersion) parses as semver and is older than4.0.0, so it cannot render a 4.x-only config against a 3.x image. Use chart0.xfor S3Proxy 3.x.
# 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.yamlThe following section lists the configurable parameters of the s3proxy chart and their default 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 |
[] |
# values-filesystem.yaml
config:
auth:
type: "aws-v4"
identity: "myaccesskey"
secret: "mysecretkey"
backends:
filesystem:
enabled: true
basedir: "/data/s3proxy"
persistence:
enabled: true
size: 20GiInstall:
helm install s3proxy-fs ./s3proxy -f values-filesystem.yaml# 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 backendFor 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: trueInstall:
helm install s3proxy-s3 ./s3proxy -f values-aws-s3.yaml# 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 backendInstall:
helm install s3proxy-azure ./s3proxy -f values-azure.yamlOn 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: falseThe 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# values-anonymous.yaml
config:
auth:
type: "none"
backends:
transient:
enabled: true # In-memory storage
persistence:
enabled: falseconfig.auth.identity / config.auth.secret are the S3 Access Key ID and Secret
Access Key that clients present to S3Proxy.
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 Keykubectl 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.
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.
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/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 namedhttps. - 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.
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-passwordProvide 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=changeitTesting over HTTPS (the CI keystore above is self-signed, so skip verification):
aws --endpoint-url https://localhost:9000 --no-verify-ssl s3 lsTo 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: trueS3Proxy 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 mockingMap virtual bucket names to actual backend buckets:
config:
buckets:
alias:
virtual-bucket: "real-backend-bucket"
another-bucket: "actual-bucket-name"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)Check S3Proxy logs:
kubectl logs deployment/my-s3proxyhelm upgrade my-s3proxy ./s3proxy -f my-values.yamlhelm uninstall my-s3proxyThis will remove all resources created by the chart. If using persistence, the PVC will be retained by default.
-
Authentication failures: Ensure
config.auth.identityandconfig.auth.secretare set correctly (or, withconfig.auth.existingSecret, that the Secret exists and itsidentityKey/secretKeyentries are present) for client authentication. -
Backend connection issues: Verify backend credentials are correctly configured in the appropriate section (e.g.,
config.backend.awsS3.*). -
Persistence issues: Check that your cluster has a default StorageClass or specify one explicitly.
-
Port conflicts: If port 8080 is already in use, change
service.portandservice.targetPort.
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