Create Zot OCI Service #48
Labels
No labels
blocked
bug
duplicate
effort
high
effort
low
effort
medium
effort
minimal
enhancement
help wanted
invalid
pr
feedback
pr
reviewing
question
status
backlog
status
document
status
done
status
implement
status
pending
status
planning
status
reviewing
waiting
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
tepichord/milner#48
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Naina:
Overview
Create a new
zot/service root deploying Zot as a single-replica StatefulSet on theworkernode. Zot is an OCI-compliant container image registry; images persist to thepersistentStorageClass via a Terraform-owned PVC. The official Helm chart handles StatefulSet creation, probes, and configuration — the Terraform root owns the namespace, PVC, and (optionally) Tailscale Ingress.Technical Approach
Copy provider boilerplate from
pocket-id/main.tf— terraform block, variables, remote state, locals, providers (identical across all service roots)1Create
zotnamespace withbaselinePSA — PVC-based storage, no hostPath neededCreate Terraform-owned PVC — 15 GiB on
persistentStorageClass,wait_until_bound = false2Helm release from official OCI chart —
oci://ghcr.io/project-zot/helm-charts/zot, version pinned to0.1.1243Tailscale Ingress — reuses the vault-owned
ingress-proxiesProxyGroup4, MagicDNS namezot, port 5000values.yaml— key overrides:README.md— document architecture, deploy steps, push/pull examples, storage contractImplementation Details
Files to create:
zot/main.tf— provider boilerplate (copied verbatim frompocket-id/main.tf), namespace, PVC, Helm release, Ingresszot/values.yaml— Helm value overrides (Terraform-owned PVC, worker nodeSelector, ingress disabled)zot/README.md— service documentationDependencies:
storage/must be applied first (Zot needs thepersistentStorageClass)5vault/must be applied first (Zot Ingress uses theingress-proxiesProxyGroup)6Constraints:
ghcr.io/project-zot/zot) supportslinux/arm64natively, no special handling needed7wait_until_bound = false(same pattern aspocket-id) to avoid deadlock with WaitForFirstConsumer StorageClass10persistence: truecreates a StatefulSet;pvc.create: false+pvc.name: "zot-data"mounts the Terraform-owned claim11Out-of-scope notes:
Acceptance Criteria
zot/main.tfapplies cleanly: namespace, PVC, Helm release, Ingress all createdRunningon a worker node with the PVC boundkubectl -n zot port-forward svc/zot 5000:5000allowscrane manifestandcrane pushagainst localhost:5000https://zot.faun-snapper.ts.netfrom a tailnet devicezot/README.mddocuments architecture, deploy steps, and storage tier contractTesting Plan
terraform -chdir=zot planproduces a valid plan with no errorskubectl -n zot get podsshows a runningzot-0podkubectl -n zot get pvc zot-datashows statusBoundcrane push alpine:latest zot.faun-snapper.ts.net/alpine:testsucceedscrane pull zot.faun-snapper.ts.net/alpine:test /dev/nullsucceedsRelated Issues/PRs
persistentStorageClass Zot depends on)Research Findings
oci://ghcr.io/project-zot/helm-charts/zot(chart version 0.1.124, appVersion v2.1.21). The chart supports both Deployment (no persistence) and StatefulSet (with persistence) modes.12ghcr.io/project-zot/zot) is multi-arch, supportinglinux/amd64andlinux/arm64natively. No special arm64 handling is needed.13/livez,/readyz, and/startupzhealth check endpoints. The Helm chart configures these probes automatically.15/var/lib/registry. Deduplication (dedupe: true) and garbage collection (gc: true) are available but not enabled by default.17