Skip to main content
v0.2.0 · GPL-3.0 · Go 1.26

Self-hosted package
distribution for the
LTS releases you ship.

Packyard serves RPM, DEB, and OCI artefacts behind subscription-key auth. One docker-compose stack — Traefik, a Go forward-auth service, nginx, Zot, Aptly, RustFS — with a GitHub Actions promotion pipeline that signs and publishes from CI.

ops@host — ~ — 132×36
ops@host:~$ 
formats
3rpm · deb · oci
signing
GPG+ cosign
auth
keyper component
01

quick start

stand up the stack on a docker compose host
01 · clonegit
$git clone https://github.com/no42-org/packyard.git
$cd packyard
02 · bring updocker compose v2
$docker compose \ -f compose.yml \ -f compose.override.ci.yml \ up -d
03 · first keyadmin API · localhost:8080
$curl -X POST http://localhost:8080/api/v1/keys \ -H 'Content-Type: application/json' \ -d '{"component":"core","label":"dev-key"}'
02

what's in the box

six pillars
01
RPM · DEB · OCI

One server, three repository formats. dnf, apt, and docker pull all hit the same Traefik front door with subscription-key auth.

02
Forward-auth gating

Per-subscriber keys scoped per-component. Traefik forwardAuth middleware calls the Go auth service before every request — no client cert dance.

03
Signed artefacts

GPG signs RPM and DEB indices; cosign signs OCI manifests. Public keys served unauthenticated at /gpg for client-side verification.

04
Promotion pipeline

GitHub Actions stage artefacts to RustFS (S3-compatible), sign them, then publish to the rpm / deb / oci backends in one workflow.

05
Observability

Prometheus metrics on the auth service, structured admin API with Code + Message error responses, daily SQLite backup of the key store.

06
Self-hosted

docker compose v2 stack — Traefik, auth, nginx, Zot, Aptly, RustFS. No SaaS dependency, no per-subscriber licensing meter.

03

documentation map

jump in
→ get started

Run your own authenticated package mirror.

GPL-3.0. No SaaS, no per-subscriber meter. A docker-compose stack and a CI workflow you read end-to-end in an afternoon.