K8s S3 Mirror

A Kubernetes-native S3 proxy that intercepts requests, mirrors to backup storage, and maintains a postgres inventory

Key Features

Enterprise-grade S3 mirroring with zero application changes

🔄

Automatic Mirroring

Asynchronously mirrors all S3 operations to a backup endpoint without impacting performance

🔐

Centralized Auth

Manage all S3 credentials in one place. Applications connect via simple HTTP, proxy handles HTTPS

📊

Optional Inventory

PostgreSQL-backed tracking when configured. Works perfectly without database for simpler deployments

Non-blocking

Database logging and backup operations happen asynchronously for minimal latency

🎯

Drop-in Replacement

Works with any S3-compatible client. Just point your apps to the proxy endpoint

📦

Kubernetes Native

Deploy with Helm chart or raw manifests. Runs as a simple, stateless service

Built With

Go Kubernetes Helm PostgreSQL AWS S3 Docker

Quick Start

Deploy in minutes with Helm

# Install directly from GitHub Container Registry (OCI)
helm install s3-mirror oci://ghcr.io/starburst997/charts \
  --set mainS3.endpoint="https://s3.amazonaws.com" \
  --set mainS3.accessKey="YOUR_MAIN_KEY" \
  --set mainS3.secretKey="YOUR_MAIN_SECRET" \
  --set mirrorS3.endpoint="https://backup.s3.com" \
  --set mirrorS3.accessKey="YOUR_MIRROR_KEY" \
  --set mirrorS3.secretKey="YOUR_MIRROR_SECRET"

# Optional: Add PostgreSQL for inventory tracking
# If omitted, proxy works without database logging
helm install s3-mirror oci://ghcr.io/starburst997/charts \
  --set postgres.url="postgresql://user:pass@host:5432/db" \
  --version 1.0.1

Application Integration

Just change the endpoint - that's it!

// Before: Direct S3 connection
const s3Client = new S3Client({
  endpoint: "https://s3.amazonaws.com",
  credentials: { ... },
  region: "us-east-1"
});

// After: Using S3 Mirror proxy (no credentials needed!)
const s3Client = new S3Client({
  endpoint: "http://s3.local",
  region: "us-east-1"
});

// Use S3 operations as normal - everything is automatically mirrored!
await s3Client.send(new PutObjectCommand({
  Bucket: "my-bucket",
  Key: "file.txt",
  Body: "Hello World"
}));