neuron-explorer
Qwen3.5‑4B 전용 조향형 뉴런 탐색기, 모든 MLP 뉴런을 밀어 결과를 보관·탐색
DeltaGlider Proxy: 유사 파일을 감지해 전체 복사본 대신 작은 바이너리 차이로 저장하는 S3 프록시
An S3 proxy that spots similar files and stores them as small binary diffs instead of full copies. The S3 API stays the same and clients don't change. It adds IAM, SSO, replication, and encryption on
개발 도구Rust · AstroGitHub @beshu-tech온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
S3-compatible proxy with transparent delta compression using xdelta3
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
DeltaGlider is an S3 control plane in front of the storage you already run. It is not an object store or a storage cluster. It routes buckets across existing backends and local filesystems. It adds a centralized admin UI for IAM, OAuth, lifecycle, replication, event outbox delivery, audits, caching, and encryption. It also reduces storage growth for repeated binaries with xdelta3 deltas. It is one binary on one port, and your existing S3 workflows keep working.README 전문 보기 ↗DeltaGlider is an S3 control plane in front of the storage you already run. It is not an object store or a storage cluster. It routes buckets across existing backends and local filesystems. It adds a centralized admin UI for IAM, OAuth, lifecycle, replication, event outbox delivery, audits, caching, and encryption. It also reduces storage growth for repeated binaries with xdelta3 deltas. It is one binary on one port, and your existing S3 workflows keep working.
Organizations run storage across multiple providers: AWS S3, lower-cost S3-compatible SaaS, Hetzner Object Storage, Backblaze B2, MinIO, and local NFS. Each provider has its own credentials, endpoints, and access policies. Teams share credentials in Slack. There is no audit trail and no prefix-level access control, and you cannot publish a folder without exposing the whole bucket.
DeltaGlider Proxy sits in front of all your backends and presents a single, authenticated S3 endpoint. It is the policy, routing, cache, lifecycle, replication, event, audit, encryption, and compression layer that operators usually have to build around an object store:
┌──────────────────────┐
┌───▶│ AWS S3 (us-east-1) │
┌──────────────┐ ┌─────────────┐ │ └──────────────────────┘
│ S3 clients │───▶│ DeltaGlider │──┤ ┌──────────────────────┐
│ (unchanged) │ │ Proxy │──┼───▶│ Hetzner (Helsinki) │
└──────────────┘ └─────────────┘ │ └──────────────────────┘
│ ┌──────────────────────┐
└───▶│ Local filesystem │
└──────────────────────┘
Clients see standard S3. They cannot tell which backend stores their bucket, that repeated binaries are stored as deltas, or that objects are encrypted before an untrusted backend sees them. They authenticate once, with corporate SSO if you want, and the proxy handles the rest.
*@company.com), glob patterns, regex, or identity provider claims. New hires get the right access on their first login.PUT releases/v2.zip ──▶ DeltaGlider ──▶ stored as 1.4MB delta (was 82MB)
GET releases/v2.zip ──▶ DeltaGlider ──▶ reconstructed, streamed back as 82MB
You manage everything from a web UI on the same port as the S3 API, without extra containers or infrastructure:
The proxy refuses to start without credentials, so that a deployment is never open by accident. Supply credentials, or explicitly opt into open access:
docker run -p 9000:9000 \
-e DGP_ACCESS_KEY_ID=admin \
-e DGP_SECRET_ACCESS_KEY=changeme \
beshultd/deltaglider_proxy
Then point any S3 client at http://localhost:9000:
export AWS_ENDPOINT_URL=http://localhost:9000
aws s3 mb s3://builds
aws s3 cp v1.zip s3://builds/releases/v1.zip
aws s3 cp v2.zip s3://builds/releases/v2.zip # stored as delta
aws s3 cp s3://builds/releases/v2.zip ./v2.zip # full file back, byte-identical
The admin GUI is at http://localhost:9000/_/, on the same port, with no setup. On first run, the bootstrap password is auto-generated. The proxy prints it to stderr only when stderr is a terminal (for example with docker run -it); otherwise it writes only the hash, to .deltaglider_bootstrap_hash. To choose the password, set DGP_BOOTSTRAP_PASSWORD_HASH or use the --set-bootstrap-password flag.
Configure the proxy with a YAML config file (canonical) or with environment variables (DGP_* prefix). A five-line config is enough to run:
# deltaglider_proxy.yaml
storage:
s3: https://s3.example.com
access_key_id: admin
secret_access_key: changeme
The canonical format has four top-level sections: admission, access, storage, and advanced. Each section is optional. Exports omit the fields that equal their defaults, so GitOps diffs stay small.
admission:
blocks:
- name: deny-bad-ips
match:
source_ip_list: ["203.0.113.0/24"]
action: deny
access:
access_key_id: admin
secret_access_key: changeme
# iam_mode: gui # (default) encrypted IAM DB is source of truth
# iam_mode: declarative # YAML owns IAM; admin-API mutations return 403
storage:
default_backend: primary
backends:
- name: primary
type: s3
endpoint: https://s3.us-east-1.amazonaws.com
region: us-east-1
- name: europe
type: s3
endpoint: https://hel1.your-objectstorage.com
region: hel1
buckets:
releases:
backend: europe
compression: true
public_prefixes: ["builds/", "artifacts/"]
quota_bytes: 10737418240
docs-site:
public: true # shorthand for public_prefixes: [""]
archive:
backend: primary
alias: prod-archive-2024
compression: false
advanced:
cache_size_mb: 2048
log_level: deltaglider_proxy=info,tower_http=warn
Offline validation: run this before you commit to CI:
deltaglider_proxy config lint deltaglider_proxy.yaml
YAML is the only config format, because v1.4.1 removed TOML support. A .toml config makes the proxy fail at startup with an error that says what to do. If you still use TOML, run deltaglider_proxy config migrate on v1.4.0 to convert it, then upgrade. See How to upgrade the proxy.
Example: deltaglider_proxy.example.yaml.
The admin API supports GitOps with full-document apply, per-section PATCH (RFC 7396 merge-patch), JSON Schema export, and an admission-chain trace endpoint. See the admin API reference.
| Operations | |
|---|---|
| Objects | PutObject, GetObject, HeadObject, DeleteObject, DeleteObjects, CopyObject |
| Listing | ListObjectsV2 (start-after, encoding-type, fetch-owner, continuation tokens), ListObjects (v1) |
| Buckets | CreateBucket, HeadBucket, DeleteBucket, ListBuckets |
| Multipart | Create, UploadPart, UploadPartCopy, Complete, Abort, ListParts, ListUploads |
| Auth | SigV4 header + presigned URLs, per-user IAM, OAuth/OIDC, public prefixes |
| Conditional | If-Match, If-None-Match (304), If-Modified-Since, If-Unmodified-Since (412) |
| Range | Range requests (206 Partial Content) |
| Validation | Content-MD5 on PUT/UploadPart |
| Lifecycle | Expiration and transition/archive rules via scheduler, preview, run-now, pause/resume, and history/failures |
Not implemented: versioning, storage-class transitions, object lock.
The proxy is a single Rust binary, async throughout (Tokio and axum). A single port serves the S3 API on / and the admin UI and APIs under /_/.
S3 request
→ SigV4 auth / OAuth session / public prefix bypass
→ IAM authorization (ABAC with conditions)
→ Multi-backend routing (virtual bucket → real backend + bucket)
→ FileRouter (delta-eligible vs passthrough)
→ DeltaGlider engine (compress / reconstruct / cache)
→ StorageBackend (filesystem, S3, or routed)
Every release publishes multi-arch images (amd64 and arm64). The proxy refuses to start without credentials, so this command for a local trial turns authentication off explicitly:
docker run -p 9000:9000 -e DGP_AUTHENTICATION=none beshultd/deltaglider_proxy
For production, set DGP_ACCESS_KEY_ID and DGP_SECRET_ACCESS_KEY instead of
DGP_AUTHENTICATION=none.
The chart lives in charts/deltaglider-proxy:
helm upgrade --install dgp ./charts/deltaglider-proxy \
--namespace dgp \
--create-namespace
Port-forward:
kubectl -n dgp port-forward svc/dgp-deltaglider-proxy 9000:9000
Open the admin UI at http://127.0.0.1:9000/_/.
The default development bootstrap password is change-me-in-production; do not expose that install outside localhost. For production, create a Kubernetes Secret outside Helm with stable DGP_ACCESS_KEY_ID, DGP_SECRET_ACCESS_KEY, DGP_BOOTSTRAP_PASSWORD_HASH, and any backend credentials, then install with:
helm upgrade --install dgp ./charts/deltaglider-proxy \
--namespace dgp \
--create-namespace \
--set auth.createSecret=false \
--set auth.existingSecret=deltaglider-secrets
The chart mounts the config at /data/deltaglider_proxy.yaml so the encrypted IAM DB is created at /data/deltaglider_config.db on the PVC. Full guide: How to deploy on Kubernetes with Helm.
For deployments with more than one pod, use the official operator in operator/. It manages the proxy pods and the consistent-hashing router that multi-pod S3 traffic requires. Without that router, multipart uploads fail with NoSuchUpload behind a round-robin Service, because the state of an upload lives only on the pod that started it. The operator README states the trade-offs explicitly. Guide: How to scale out with the Kubernetes operator.
Using an AI assistant? Give it llms.txt
(an index of every docs page) or llms-full.txt
(all docs in one file). Every docs page is also plain markdown at its URL plus
.md, for example https://deltaglider.com/docs/reference/configuration.md.
Operator-facing docs are also bundled into the running binary at /_/docs/. Source files:
The docs follow Diátaxis: every page is exactly one of tutorial, how-to, reference, or explanation.
Tutorials (guided lessons):
How-to guides (goal-named recipes): take a proxy to production · Docker Compose · Kubernetes · Kubernetes operator · TLS · upgrade · upgrade to 2.0 · back up & restore · HA · monitor · trace & audit · troubleshooting · diagnose a backend · live logs · · · · · · · · · · · · · · · · ·
Reference (pure facts):
Concepts (how it works and why):
Plus the FAQ index.
Contributor-only (not in the binary):
Business Source License 1.1 (BUSL-1.1). In plain terms:
Contributors must sign the Contributor License Agreement, which assigns copyright to Beshu Limited so the project can be licensed this way. A bot will prompt you to sign on your first pull request.