S3 proxy in rust: saves 1st archive in a dir as reference, but others as diffs, so 4TB fit in ~5GB
10K+
An S3-compatible proxy with transparent delta compression for versioned binary artifacts.
Clients see a standard S3 API. The proxy deduplicates with xdelta3 against a per-prefix reference baseline. On versioned builds, firmware images, and binary releases, this typically saves 60 to 95% of the storage.
docker run -d \
-p 9000:9000 \
-v dgp-data:/data \
-e DGP_ACCESS_KEY_ID=dgpadmin \
-e DGP_SECRET_ACCESS_KEY=change-me-please \
beshultd/deltaglider_proxy
DGP_ACCESS_KEY_ID / DGP_SECRET_ACCESS_KEY: the S3 credentials clients present to the proxy. These are required: the proxy refuses to start without authentication configured (unless you explicitly set DGP_AUTHENTICATION=none for local development). Choose your own values.Then open http://localhost:9000/_/ for the built-in browser and dashboard.
docker run -d \
-p 9000:9000 \
-e DGP_ACCESS_KEY_ID=dgpadmin \
-e DGP_SECRET_ACCESS_KEY=change-me-please \
-e DGP_S3_ENDPOINT=http://minio:9000 \
-e DGP_S3_REGION=us-east-1 \
-e DGP_BE_AWS_ACCESS_KEY_ID=minioadmin \
-e DGP_BE_AWS_SECRET_ACCESS_KEY=minioadmin \
-e DGP_CACHE_MB=1024 \
beshultd/deltaglider_proxy
The DGP_ACCESS_KEY_ID / DGP_SECRET_ACCESS_KEY pair is the S3 credential clients present to the proxy (required to start). The DGP_BE_AWS_* pair is separate: it authenticates the proxy to the MinIO backend behind it.
services:
minio:
# pgsty/silo is the maintained MinIO fork (minio/minio left Docker Hub);
# any S3-compatible store works here.
image: pgsty/silo
command: server /data
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
deltaglider:
image: beshultd/deltaglider_proxy
ports:
- "9000:9000"
environment:
DGP_S3_ENDPOINT: http://minio:9000
DGP_S3_REGION: us-east-1
DGP_BE_AWS_ACCESS_KEY_ID: minioadmin
DGP_BE_AWS_SECRET_ACCESS_KEY: minioadmin
DGP_ACCESS_KEY_ID: myproxykey
DGP_SECRET_ACCESS_KEY: myproxysecret
DGP_CACHE_MB: 1024
depends_on:
- minio
S3 Client ──PUT──▶ DeltaGlider Proxy ──delta──▶ Storage Backend
│ (S3 / filesystem)
xdelta3 encode
reference cache
transparent to clients
You can set all settings through environment variables:
| Variable | Default | Description |
|---|---|---|
DGP_LISTEN_ADDR | 0.0.0.0:9000 | S3 API listen address |
DGP_MAX_DELTA_RATIO | 0.75 | Max delta/original ratio (lower = more aggressive) |
DGP_MAX_OBJECT_SIZE | 104857600 | Max size of an uploaded object (100 MB), for every object and not only for deltas |
DGP_CACHE_MB | 100 | Reference cache size in MB (recommend ≥1024 for production) |
DGP_ACCESS_KEY_ID | (unset) | Proxy SigV4 access key (required: the proxy refuses to start without credentials unless DGP_AUTHENTICATION=none) |
DGP_SECRET_ACCESS_KEY | (unset) | Proxy SigV4 secret key |
DGP_AUTHENTICATION | (auto-detect) | Set to none for open-access dev mode |
DGP_DATA_DIR | ./data | Filesystem backend data directory |
DGP_S3_ENDPOINT | (unset) | S3 backend endpoint URL |
DGP_S3_REGION | us-east-1 | S3 backend region |
DGP_BE_AWS_ACCESS_KEY_ID | (unset) | Backend S3 credentials |
DGP_BE_AWS_SECRET_ACCESS_KEY | (unset) | Backend S3 credentials |
DGP_BOOTSTRAP_PASSWORD_HASH | (auto-generated) | Bootstrap password bcrypt hash (signs session cookies, gates admin GUI). Base64-encoded form avoids $ escaping in Docker. |
DGP_CONFIG_DB_KEY | (key file next to the DB) | Encryption key of the IAM config DB, at least 32 characters. Without it, the proxy generates the key file deltaglider_config.db.key next to the DB on the first start: back up the key file together with the DB. Required, and the same on every instance, with DGP_CONFIG_SYNC_BUCKET |
DGP_LOG_LEVEL | deltaglider_proxy=info,tower_http=info | Log filter (you can change it at runtime in the admin GUI) |
DGP_CONFIG_SYNC_BUCKET | (unset) | S3 bucket for encrypted-DB multi-instance sync. Needs DGP_CONFIG_DB_KEY |
DGP_TLS_ENABLED | false | Enable HTTPS |
Or mount a YAML config file:
docker run -v ./my-config.yaml:/etc/deltaglider_proxy.yaml \
beshultd/deltaglider_proxy -c /etc/deltaglider_proxy.yaml
(YAML is the only config format, because v1.4.1 removed TOML support. Convert a TOML config with deltaglider_proxy config migrate on v1.4.0 before you upgrade.)
The admin GUI is served at /_/ on the same port as the S3 API:
DGP_AUDIT_RING_SIZE, default 500)| Port | Protocol | Purpose |
|---|---|---|
| 9000 | HTTP/S | S3-compatible API + Admin GUI (/_/) + /_/metrics + /_/health + /_/ready + /_/stats |
# Liveness (the process answers; no backend request)
curl http://localhost:9000/_/health
# Readiness (probes the storage backends and the config DB; 503 when not ready)
curl http://localhost:9000/_/ready
# Prometheus metrics (public unless DGP_METRICS_BEARER_TOKEN is set)
curl http://localhost:9000/_/metrics
/_/stats (objects, savings %) answers only an admin session, because it shows the size of every bucket.
The Docker image includes a built-in healthcheck on port 9000 (15s interval).
debian:bookworm-slimxdelta3, ca-certificates, curl, chrony, ntpstatdglinux/amd64, linux/arm64| Tag | Description |
|---|---|
latest | Latest stable release |
2.1.0 | Specific version |
2.0 | Latest patch in 2.0.x |
2 | Latest minor in 2.x.x |
Content type
Image
Digest
sha256:917835328…
Size
77.1 MB
Last updated
4 days ago
docker pull beshultd/deltaglider_proxy