@@ -43,7 +43,9 @@ S3's server-side encryption is great, but your cloud provider holds the keys. S3
4343
4444---
4545
46- ## Quick Start
46+ ## Install
47+
48+ ** Option A** — inline secrets (quick start):
4749
4850``` bash
4951helm install s3proxy oci://ghcr.io/serversidehannes/s3proxy-python/charts/s3proxy-python \
@@ -52,22 +54,36 @@ helm install s3proxy oci://ghcr.io/serversidehannes/s3proxy-python/charts/s3prox
5254 --set secrets.awsSecretAccessKey=" wJalr..."
5355```
5456
57+ ** Option B** — existing K8s secret (recommended for production):
58+
59+ ``` bash
60+ kubectl create secret generic s3proxy-secrets \
61+ --from-literal=S3PROXY_ENCRYPT_KEY=" your-32-byte-key" \
62+ --from-literal=AWS_ACCESS_KEY_ID=" AKIA..." \
63+ --from-literal=AWS_SECRET_ACCESS_KEY=" wJalr..."
64+
65+ helm install s3proxy oci://ghcr.io/serversidehannes/s3proxy-python/charts/s3proxy-python \
66+ --set secrets.existingSecrets.enabled=true \
67+ --set secrets.existingSecrets.name=s3proxy-secrets
68+ ```
69+
70+ Then point any S3 client at the proxy:
71+
5572``` bash
5673aws s3 --endpoint-url http://s3proxy-python:4433 cp file.txt s3://bucket/
5774```
5875
59- That's it. Point any S3 client at the proxy, use the ** same credentials** you configured above.
76+ Use the ** same credentials** you configured above. That's it.
77+
78+ > ** Endpoints** — In-cluster: ` http://s3proxy-python.<ns>:4433 ` · Gateway: ` http://s3-gateway.<ns> ` · Ingress: ` https://s3proxy.example.com `
79+ >
80+ > ** Health** — ` GET /healthz ` · ` GET /readyz ` · ** Metrics** — ` GET /metrics `
6081
6182---
6283
6384## Battle-Tested
6485
65- <p align =" center " >
66- <img src =" https://img.shields.io/badge/PostgreSQL_17-336791?style=flat-square&logo=postgresql&logoColor=white " alt =" PostgreSQL " >
67- <img src =" https://img.shields.io/badge/Elasticsearch_9-005571?style=flat-square&logo=elasticsearch&logoColor=white " alt =" Elasticsearch " >
68- <img src =" https://img.shields.io/badge/ScyllaDB_6-53cadd?style=flat-square&logo=scylladb&logoColor=white " alt =" ScyllaDB " >
69- <img src =" https://img.shields.io/badge/ClickHouse_24-ffcc00?style=flat-square&logo=clickhouse&logoColor=black " alt =" ClickHouse " >
70- </p >
86+ Verified with real database operators: ** backup, cluster delete, restore, data integrity check.**
7187
7288| Database | Operator | Backup Tool |
7389| :--------:| :--------:| :-----------:|
@@ -76,8 +92,6 @@ That's it. Point any S3 client at the proxy, use the **same credentials** you co
7692| ScyllaDB 6.x | Scylla Operator 1.19 | Scylla Manager |
7793| ClickHouse 24.x | Altinity Operator | clickhouse-backup |
7894
79- All verified: ** backup, cluster delete, restore, data integrity check.**
80-
8195---
8296
8397## How It Works
@@ -94,33 +108,6 @@ Master Key → KEK (derived via SHA-256)
94108
95109---
96110
97- ## Production Deployment
98-
99- ### External Secrets (recommended)
100-
101- ``` bash
102- kubectl create secret generic s3proxy-secrets \
103- --from-literal=S3PROXY_ENCRYPT_KEY=" your-32-byte-key" \
104- --from-literal=AWS_ACCESS_KEY_ID=" AKIA..." \
105- --from-literal=AWS_SECRET_ACCESS_KEY=" wJalr..."
106-
107- helm install s3proxy oci://ghcr.io/serversidehannes/s3proxy-python/charts/s3proxy-python \
108- --set secrets.existingSecrets.enabled=true \
109- --set secrets.existingSecrets.name=s3proxy-secrets
110- ```
111-
112- ### Endpoints
113-
114- | Access | Endpoint |
115- | --------| ----------|
116- | In-cluster | ` http://s3proxy-python.<ns>:4433 ` |
117- | Gateway | ` http://s3-gateway.<ns> ` |
118- | Ingress | ` https://s3proxy.example.com ` |
119-
120- Health: ` GET /healthz ` · ` GET /readyz ` · Metrics: ` GET /metrics `
121-
122- ---
123-
124111## Configuration
125112
126113| Value | Default | Description |
@@ -141,15 +128,30 @@ See [chart/README.md](chart/README.md) for all options.
141128
142129## FAQ
143130
144- ** Can I use existing unencrypted data?** Yes. S3Proxy detects unencrypted objects and returns them as-is. Migrate by copying through the proxy.
145-
146- ** What if I lose my encryption key?** Data is unrecoverable. Back up your key.
147-
148- ** What if Redis fails mid-upload?** Upload fails and must restart. Use ` redis-ha.enabled=true ` with persistence.
149-
150- ** MinIO / R2 / Spaces?** Yes. Set ` s3.host ` to your endpoint.
151-
152- ** Presigned URLs?** GET works. PUT/POST don't — the proxy encrypts the body which invalidates the pre-signed signature.
131+ <details >
132+ <summary ><strong >Can I use existing unencrypted data?</strong ></summary >
133+ Yes. S3Proxy detects unencrypted objects and returns them as-is. Migrate by copying through the proxy.
134+ </details >
135+
136+ <details >
137+ <summary ><strong >What if I lose my encryption key?</strong ></summary >
138+ Data is unrecoverable. Back up your key.
139+ </details >
140+
141+ <details >
142+ <summary ><strong >What if Redis fails mid-upload?</strong ></summary >
143+ Upload fails and must restart. Use <code >redis-ha.enabled=true</code > with persistence.
144+ </details >
145+
146+ <details >
147+ <summary ><strong >MinIO / R2 / Spaces?</strong ></summary >
148+ Yes. Set <code >s3.host</code > to your endpoint.
149+ </details >
150+
151+ <details >
152+ <summary ><strong >Presigned URLs?</strong ></summary >
153+ GET works. PUT/POST don't — the proxy encrypts the body which invalidates the pre-signed signature.
154+ </details >
153155
154156---
155157
0 commit comments