Getting Started¶
Get a local Packyard stack running and make your first authenticated request in a few minutes.
No public domain or TLS certificate required. The CI override switches Traefik to plain HTTP and exposes the admin API directly on the host.
Prerequisites: Docker Compose v2, curl, jq.
1. Clone and configure¶
Create a minimal .env:
cat > .env <<'EOF'
ACME_EMAIL=dev@localhost
RUSTFS_ACCESS_KEY=dev-access-key
RUSTFS_SECRET_KEY=dev-secret-key-value
EOF
2. Start the stack¶
x86-64:
Apple Silicon (arm64):
Wait for services to be ready:
until curl -sf -o /dev/null http://localhost/gpg/lts.asc; do sleep 1; done
echo "Traefik ready"
until curl -sf http://localhost:8080/health > /dev/null; do sleep 2; done
echo "Auth ready"
3. Create a subscription key¶
The admin API is exposed directly at localhost:8080. The component value must match a name in config/packyard.yml — the default ships with core:
curl -s -X POST http://localhost:8080/api/v1/keys \
-H 'Content-Type: application/json' \
-d '{"component": "core", "label": "dev-key"}' | jq .
{
"id": "abc123...",
"component": "core",
"label": "dev-key",
"active": true,
"created_at": "2025-01-01T00:00:00Z"
}
4. Make an authenticated request¶
Use the key id as the HTTP Basic password with username subscriber:
KEY=abc123...
# GPG key (unauthenticated)
curl http://localhost/gpg/lts.asc
# RPM repo metadata (authenticated)
curl -u subscriber:${KEY} http://localhost/rpm/core/2025/el9-x86_64/repodata/repomd.xml
# Check auth metrics
curl -s http://localhost:9090/metrics | grep packyard_auth
5. Run the verification suite¶
Expected output: all tests passed, 0 failed.
The script also supports running against a remote production deployment:
6. Tear down¶
Note
The local stack runs HTTP only — no TLS, no ACME. Port 80 serves public and authenticated routes; the admin API is on localhost:8080. Promotion workflows (RPM/DEB/OCI signing) require a running production host with SSH access.
Apple Silicon (arm64)
zot uses an image with the architecture in its name (zot-linux-amd64). Use compose.override.arm64.yml to swap it to the arm64 variant. aptly is published as a multi-arch image and selects the correct binary automatically.