Registry10x is a highly available OCI/Docker container registry written in Rust. Every service is stateless and horizontally scalable, storage is pluggable across filesystem, S3, GCS and Azure Blob, and images are replicated across regions with circuit-breaker-protected failover. This page is the complete inventory — what ships today, what it is configured with, and what is still landing.
Supply-chain substrate for rebuild, promote, and admission: a tamper-evident registry audit log and cosign-compatible image signing with verify-on-pull. Both ship behind kill-switches defaulting to OFF.
registry10x-signing signs and verifies manifest digests with keyed cosign simple-signing
(sigstore-rs). Signatures store as OCI artifacts under the cosign tag convention
sha256-<hex>.sig, with Postgres metadata, OCI referrers, and a typed
Sign audit event. Keys resolve from PEM files or HashiCorp Vault (KV + Transit).
An ImageVerificationPolicy CRD (and matching admin API) scopes which projects and
repositories require a trusted signature. On pull, get_manifest enforces the policy:
block returns 403 DENIED; warn / log audit and allow.
Flip with [signing] enabled = true in Helm or config.
Registry write ops dual-write into registry10x-audit: an HMAC-SHA256 hash chain over
registry_audit_log (separate from the scanner’s audit_log). Push and
delete fail closed when the Postgres backend is configured and unavailable. Query, verify, and
export over /v2/_audit, with Merkle checkpoints for off-box retention.
registry10x-sign CLI Newfile://, vault://kv/…,
or vault://transit/… key refs. Emits a SignatureArtifact ready to
POST to /v2/…/signatures/{digest}.
POST /v2/_verify New[signing] enabled = false and [audit] backend = "memory" keep
existing clients unchanged until you opt in. Helm values mirror the same defaults.
| Change | Slice | Impact |
|---|---|---|
Chained registry audit + /v2/_audit | A1–A3 | Tamper-evident trail; push fails closed if PG audit is down |
| Audit export + Merkle checkpoint | A3 | Off-box JSONL retention with verifiable roots |
registry10x-signing keyed cosign (sigstore-rs) | B1–B2 | Sign/verify digests with PEM or Vault keys |
Signature store + cosign .sig tags + referrers | B3 | Push signatures via API or OCI tag; audit Sign |
ImageVerificationPolicy + verify-on-pull | B4 | Unsigned pulls blocked (or warned) per policy |
| Multipart large-layer uploads | #35 | Multi-GB layers push instead of failing with a 500 |
Pure-Rust cosign simple-signing via sigstore-rs. Kill-switch:
[signing] enabled = false (Helm signing.enabled). When enabled, signatures
attach as OCI artifacts; policies gate pulls.
file://, vault://kv/…, vault://transit/…registry10x-sign keygen | sign | verify CLIsha256-<hex>.sig in the same repoPOST/GET /v2/{tenant}/{project}/{repo}/signatures/{digest}signatures table for metadata and listingImageVerificationPolicy CRD with project/repo scopeonViolation: block, warn, or logrequire_for_pull global fallback when no CRD matchesPUT /v2/_signing/policies/{tenant}/{name}| Config / API | Purpose |
|---|---|
signing.enabled | Master kill-switch (default false) |
signing.require_for_pull | Refuse unsigned pulls when no scoped policy matches |
POST /v2/_verify | List or cryptographically verify signatures for a digest |
ImageVerificationPolicy | Namespaced CRD reconciled into verification_policies |
Durable, verifiable audit for registry mutations. Tables use the registry_audit_* prefix
so they never collide with the scanner’s audit_log.
registry10x-audit)GET /v2/_audit — filter by category / subjectGET /v2/_audit/{id} — single chained rowPOST /v2/_audit/verify — verify a rangePOST /v2/_audit/export — pending or ranged dumpA full implementation of the OCI Distribution Specification, compatible with Docker, Podman, Buildah, containerd, and any OCI-compliant client. One Rust binary, no runtime dependencies.
PATCH) and monolithic blob uploads/v2/_catalog APIorg/image)tenant/project/image)docker, podman and containerd:5000, auth on :5001Machine-learning and data-science images routinely carry layers of a gigabyte or more. Registry10x writes those blobs as multipart uploads so a single request deadline never caps object size.
PUT, the
PATCH-appended buffer, and upload completion.
| Config key | Environment override | Default | Purpose |
|---|---|---|---|
storage.multipart_threshold_mb | REGISTRY10X_STORAGE_MULTIPART_THRESHOLD_MB | 64 | Blobs above this size use a multipart upload |
storage.multipart_part_size_mb | REGISTRY10X_STORAGE_MULTIPART_PART_SIZE_MB | 32 | Size of each part (raised to 5 MiB if lower) |
storage.multipart_concurrency | REGISTRY10X_STORAGE_MULTIPART_CONCURRENCY | 4 | Parts uploaded at once |
storage.retry_max_retries | REGISTRY10X_STORAGE_RETRY_MAX_RETRIES | 10 | Retries per storage request |
storage.retry_timeout_secs | REGISTRY10X_STORAGE_RETRY_TIMEOUT_SECS | 180 | Deadline for one request including retries |
storage.connect_timeout_secs | REGISTRY10X_STORAGE_CONNECT_TIMEOUT_SECS | 30 | TCP connect timeout |
storage.request_timeout_secs | REGISTRY10X_STORAGE_REQUEST_TIMEOUT_SECS | 300 | Total timeout for one request attempt |
Diagnostics for large-push failures are in docs/troubleshooting.md, alongside the 429 and 413 sections.
Storage is an abstraction over the object_store crate, so the same registry binary runs on
a laptop volume or a multi-region bucket without a code change.
| Backend | Value | Key settings |
|---|---|---|
| Local filesystem | filesystem | root, PVC size |
| Amazon S3 / MinIO / S3-compatible | s3 | bucket, region, endpoint, encrypt |
| Google Cloud Storage | gcs | bucket, keyfile |
| Azure Blob Storage | azure | container, accountName |
Both services are stateless, so availability is a matter of running more replicas. What sits underneath is the part that matters: retries, breakers and failover that distinguish a real fault from ordinary traffic.
NotFound counts as healthyTenant CRD/health endpoint for probes and load balancersManifests and blobs replicate across regions on an event-driven pipeline, with failover handled by the same resilience layer the storage path uses.
Mirror upstream registries transparently to cut egress costs and survive upstream rate limits.
docker pullZero static credentials in production. Identity comes from your existing provider, and every token is short-lived and scoped.
nck_) with per-permission scoping/auth/tokenAccessPolicy CRD with subjects, resources, actions, conditionsOne registry serves many teams, each with its own quotas, policies and isolation, declared as Kubernetes resources so they live in Git alongside everything else.
| CRD | Scope | Purpose |
|---|---|---|
Tenant | Cluster | Top-level org with quotas, IP restrictions, OIDC mapping |
Project | Namespace | Groups repositories; visibility, retention, scanning policy |
AccessPolicy | Namespace | Fine-grained RBAC: subjects, resources, actions, conditions |
TokenPolicy | Namespace | Token lifetime, rotation, revocation, robot accounts |
ImageVerificationPolicy | Namespace | Require cosign signatures on pull; block / warn / log |
Scanning is built into the registry, not bolted on. Every push is scanned in-process by
registry10x-scanner — no Trivy daemon, no Grype shell-out, no external scanner pod.
dpkg, apk, rpm/admin/vulndb/ingest| Endpoint | Purpose |
|---|---|
GET /v2/scan/live/{digest} | Poll-until-complete scan result |
POST /v2/scan | Trigger a scan for a (repo, tag) |
GET /v2/scan/{id}/report | Rendered scan report |
GET /v2/scan/{id}/sbom | CycloneDX SBOM |
GET /v2/cve/search | Cross-image CVE search |
POST /v2/cve/suppress | Manage suppressions (audited) |
POST /v2/vex | Ingest CycloneDX VEX statements |
POST /v2/policy/evaluate | Standalone policy evaluation |
POST /v2/export/s3/{id} | Export a scan to an S3 prefix |
Nightly automation runs as an in-cluster CronJob (03:17 UTC) that enumerates
/v2/_catalog and scans every (repo, tag), rolls the results into a PDF, and uploads it to Slack.
CVE commentary is generated by a local LLM through Ollama, so image contents and findings never leave your infrastructure.
/v2/scan/{id}/dockerfile-fix)
A dark-themed operations dashboard is embedded in the registry binary and served at
/dashboard — nothing extra to deploy.
Prometheus metrics, structured logs and OpenTelemetry traces, with Grafana dashboards in the repo.
| Metric | Meaning |
|---|---|
registry10x_http_requests_total | Request count by method, path and status |
registry10x_http_request_duration_seconds | Request latency histogram |
registry10x_storage_operations_total | Storage operations by backend |
registry10x_auth_tokens_issued_total | Token issuance count |
:9090, auth on :9091deploy/observabilityHelm is the primary path, but the same binary runs under Docker Compose, Ansible on bare metal, or directly on a host.
oci://ghcr.io/bwalia/charts/registry10x
Ready-to-copy examples for every major platform, all under examples/ in the repository.
| Platform | Auth method | Example |
|---|---|---|
| GitHub Actions | OIDC (zero secrets) | examples/github-actions/push-image.yml |
| GitLab CI | OIDC | examples/gitlab-ci/push-image.yml |
| Jenkins | Token-based | examples/jenkins/Jenkinsfile |
| Tekton | ServiceAccount | examples/tekton/push-task.yml |
| ArgoCD | Image updater | examples/argocd/image-updater.yml |
bwalia/registry10xghcr.io/bwalia/registry10xlatest, vX.Y.Z, X.Y, edge-D warnings, full test suiteThese crates exist in the workspace with their traits, models and database schema landed, and are being completed in slices. They are listed for transparency — do not plan a production rollout around them yet.
| Capability | Crate | Landed so far |
|---|---|---|
| Online garbage collection | registry10x-gc | Live blob refcount writer, atomic with manifest mutations |
| Lazy pull / partial layers | registry10x-lazy | TOC indexer trait and media types (eStargz, zstd-chunked, SOCI) |
| P2P pull acceleration | registry10x-peer | Peer mesh trait, in-process mesh, membership store |
| Usage & cost telemetry | registry10x-cost | Usage event model and Postgres recorder |
| Build attestation (SLSA/DSSE) | registry10x-attest | DSSE envelope parser, SLSA level extractor, attestation store |
| Ephemeral repos & TTL tags | registry10x-ephemeral | TTL header parser, per-project default cap, schema |
| Auto-rebuild on base CVE patch | registry10x-rebuild | Lineage extractor; subscriptions + CI dispatch still incubating |
| Promotion API | (design 006) | Depends on signing + audit; cross-repo copy next |
| Admission gate | (design 002) | Depends on signing verify-on-pull + scanner policy |
| Registry migration import | registry10x-import | Source trait plus an OCI Distribution adapter; Nexus/Harbor/ACR next |
| Typed artifacts | registry10x-artifact-types | Validator registry and Helm chart validator |
| Registry AI agent | registry10x-pilot | Tool registry with four read-only tools; MCP surface next |
Deploy in a few minutes with Helm, Docker Compose, or a single binary.