Skip to content

Repository files navigation

kaddy — a caddie for your websites

kaddy

Security-first · spec-driven · Kubernetes-native Website-as-a-Service

CIdeckchainsawtrivyreleasedocs / PagesGolicense

kaddy is an internal developer platform for monitored, TLS-terminated websites. One self-service claim provisions a site behind Caddy with observability, alerting, and progressive delivery. The gridscale Platform Engineer exercise is satisfied as one tenant of the platform — clubhouse — not as a one-off VM script.

Pitch deck:Download from Releases (kaddy-deck.pdf on the latest release).

Table of contents

Live demo

Public GSK cloud-edge with Let's Encrypt prod certs (DNS-01). On-demand / time-boxed cost governance — URLs are live only while the edge is up (runbook).

SurfaceURLProbe (2026-07-20)
✅ Argo CDhttps://argocd.lab.platformrelay.devHTTPS 200 (UI)
✅ Grafanahttps://grafana.lab.platformrelay.devHTTPS 200
✅ Demo sitehttps://demo.lab.platformrelay.devHTTPS 200
✅ Caddy tenanthttps://caddy.lab.platformrelay.devHTTPS 200 (HTTPRoute caddy-lab)
✅ Portalhttps://portal.lab.platformrelay.devHTTPS 200 (Backstage)

Showcase captures

Still captures shipped under slides/public/surfaces/ (used by the deck; paths work on GitHub):

SurfaceCapture
Argo CD app-of-appsArgo CD root app-of-apps
Backstage portalBackstage portal
Grafana (node pods)Grafana compute resources
Upbound Marketplaceprovider-gridscale on Upbound Marketplace

Edge overlays: deploy/gateway-controller/traefik/ · deploy/gateway/cloud-only/.

Caveats (honest)
  • Argo sync ≠ UI up. The Argo CD UI can return 200 while individual apps (e.g. backstage) are OutOfSync / sync-failed under GSK MemoryPressure — do not claim cluster-wide Synced.
  • Bring-up / teardown: task e8b:up → demo → task e8b:down (see the live-demo runbook).

Getting Started

Local path (kind + Cilium): follow docs/getting-started.mdtask cluster:up → bootstrap → demos (task demo:fire / task demo / task demo:chaos).

DocWhy
docs/getting-started.mdBring-up, service catalogue, demos
docs/ARCHITECTURE.mdComponents & security boundaries
docs/ROADMAP.mdPhases 0–2, epics E1–E14
docs/requirements/exercise-traceability.mdBrief → epic mapping

Local-first: phase 1 runs on kind + Cilium (e1e-kind-local-cluster, landed). Phase 2 promotes to GSK + LBaaS + UpjetROADMAP.

Reviewer paths

Five-minute path

  1. Pitch deckDownload from Releases (deck Pages URL unavailable / not yet published as a static site).
  2. Scorecardplatformrelay.github.io/Kaddy (HTTP 200; scorecard-pages).
  3. Local demosdocs/getting-started.md.
  4. Architecturedocs/ARCHITECTURE.md · exercise traceability · ROADMAP.

Deep dive

ADRsARCHITECTUREopenspec/changes/ (Verify: + Test: per requirement).

Status

Brief answered end-to-end on kind + standing GSK lab edge: serve → scrape → fire, progressive delivery, enforcing security baseline, GitOps. Releases: v0.1.0v0.9.1 (working GitHub sign-in gate — same-id override fix, /login redirect; operator-confirmed login).

AreaStateNotes
✅ Phase 1 GitOpsLandedApp-of-apps Synced/Healthy on kind; clubhouse via Cilium Gateway (E4)
✅ ObservabilityLandedPrometheus / Alertmanager / Grafana + Loki / Alloy (E3); task demo:fire (E5)
✅ Progressive deliveryLandedArgo Rollouts + Gateway canary weights / auto-rollback (E7)
✅ Security baselineLandedKyverno Enforce, default-deny NetPol, restricted AppProjects (E1c)
✅ Self-serviceLandedCrossplane Website XRD (E6); Dex + GitHub OAuth (E1d)
✅ Caddy operatorLandedOptional operator on main (after v0.1.1)
✅ Showcase deckRecording-readyE12 / E12d — download from Releases
✅ GSK day-0 IaCOffline + live-provenTerramate stacks; E1g cluster proven then torn down / standing carve-out
✅ Cloud edgeLive (time-boxed)Traefik Gateway + LE on *.lab.platformrelay.dev
✅ Portal (E10)Live routeportal.lab HTTPS 200; NetPol selectors on main
✅ Caddy lab routeLivecaddy.lab HTTPS 200 via HTTPRoute caddy-lab (no Argo name collision)
✅ Grafana publicLivegrafana.lab HTTPS 200
⚠️ Argo app syncPartialUI up; some apps may be OutOfSync under MemoryPressure
⚠️ E6g / E13 liveCost-gatedProvider install + Marketplace deploy follow-ups
🔒 Security reviewFileddocs/security/security-review-2026-07-16.md

Full plan: ROADMAP.

Stack

LayerPhase 1 (kind — local)Phase 2 (gridscale lab)
Substratekind + Cilium (E1e)GSK managed k8s
Day-0 IaChack/cluster/Terramate + stacks/gridscale/
EdgeCilium Gateway + LB-IPAM/L2Traefik + LBaaS + LE (deploy/gateway/cloud-only/)
GitOpsArgo CDdeploy/apps/Same manifests on GSK
IdentityDex + GitHub OAuthSame
SecretsSOPS + age (ADR-0110)Same
Observabilitykube-prometheus-stack + Loki + AlloySame
Self-serviceCrossplane Website XRD+ Upjet provider-gridscale (E6g)
Progressive deliveryArgo Rollouts + Gateway APISame
PolicyKyverno, NetworkPoliciesSame

Named components (the caddie metaphor)

ComponentRole
clubhouseSample website tenant (satisfies the brief)
marshalAlerting pipeline — PrometheusRules + Alertmanager
mulliganBlue/green + canary with automated rollback
scorecardEvidence harness — k6 + metrics/logs → HTML report
driving-rangeDeferred optional 3-node Talos spike (sibling repo; D-025)

Repository layout

Kaddy/
├── deploy/ # GitOps manifests (Argo app-of-apps)
│ ├── apps/ # Application CRs + AppProjects
│ ├── gateway/ # kind Gateway + cloud-only Traefik routes
│ ├── gateway-controller/ # Traefik (cloud) / Cilium edge controllers
│ ├── portal/ # Backstage IDP wiring (E10)
│ ├── workloads/ # clubhouse / caddy-mvp / demos
│ ├── crossplane/ # Website XRD + compositions
│ ├── monitoring/ # marshal rules, ServiceMonitors
│ └── policies/ # Kyverno + NetworkPolicies
├── stacks/ # OpenTofu / Terramate (phase 2)
│ ├── gridscale/ # network · k8s (GSK) · lbaas · object-storage
│ └── gridscale-marketplace/ # caddy · nix Marketplace templates (E13/E14)
├── nix/ # Flake + modules for Nix golden images (E14)
│ ├── flake.nix
│ └── caddy/ · srv/ · modules/
├── hack/
│ ├── cluster/ # kind bring-up (kind-up.sh, Cilium, Gateway API)
│ └── gsk/ # edge-up.sh, cert-manager, image rolls
├── packer/ # Ubuntu Marketplace golden images
├── operator/ # Optional Caddy operator (Go)
├── slides/ # Slidev interview deck sources
├── openspec/changes/ # Spec-driven change proposals
├── tests/ # smoke · chainsaw · deck · meta gates
├── docs/ # Architecture, ROADMAP, ADRs, getting-started
└── evidence/ # Scorecard + live proof notes

Ways to run

PathEntry points
kind (local)hack/cluster/kind/ · hack/cluster/kind-up.sh · task cluster:up · getting-started
GSK edgehack/gsk/edge-up.sh · deploy/gateway/cloud-only/ · live-demo runbook
OpenTofu / Terramatestacks/gridscale/ · stacks/gridscale-marketplace/ · config.tm.hcl / terramate.tm.hcl
Nix golden imagenix/flake.nix · nix/caddy/ · .github/workflows/e14-nix-image.yaml
Packer (Ubuntu)packer/caddy.pkr.hcl · packer/nginx.pkr.hcl
Argo GitOpsdeploy/apps/root.yaml · deploy/apps/
Portaldeploy/portal/ · companion kaddy-portal

Testing (mandatory TDD)

Every requirement carries a Test: artifact and a Verify: command — see docs/development/testing.md and ADR-0701.

task verify # lint + scrub + openspec + spec-coverage + meta smokes
task test:spec # every REQ has Test + Verify
task test# L0 tofu test · L1 conftest + promtool · L2 Chainsaw
LevelToolProves
L0tofu testLabel module outputs
L1conftest · promtoolPlan labels · alert rules fire
L2ChainsawPolicies, routes, rollouts, monitors on a live cluster
L3 / L4k6 · scorecardLoad / alerting · evidence bundle

Cloud & cost

Phase 1 develops on kind ($0). Phase 2 promotes to gridscale-native PaaS (GSK, LBaaS, Object Storage, Upjet) for the employer-facing demo.

Phase 2 monthly cost estimate (EUR)

Lab-sized footprint — estimates from public gridscale pricing (control plane free; billed per minute). Re-check before quoting. Phase 1 is €0 / month.

ResourceSize (typical lab)Est. EUR / month
GSK node pool4× 2C-4G workers (~€46/node; D-048 default 3, 4th operator-approved 2026-07-20)~184
LBaaS1 load balancer~22.50
Object Storageevidence / marketplace .gz (per GB)~0.06 / GB
Total (indicative, excl. storage GB)~207 EUR / month

Documentation

Document
🎯Getting Started · ROADMAP · exercise traceability
🏗️ARCHITECTURE · ADRs
📋DEVELOPMENT · testing · skills
🔒Audits · security review
🎬Slides · Releases (deck)
📊Evidence / scorecard
Reference material (gitignored locally)

references/PocketIDP/ is a local, un-vendored copy of PocketIDP (Gitea + Backstage patterns for E10). Not part of the committed tree.

Contributing

  • Gates: task verify (see DEVELOPMENT).
  • Commits: :gitmoji: <type>(scope): summary — ASCII shortcode, no Unicode emoji in the subject.
  • Spec-driven lanes reference an OpenSpec change under openspec/changes/.
  • Deck sources live in slides/; prefer consuming the published deck from Releases rather than rebuilding locally.

About

Security-first website-as-a-service platform: Caddy as Gateway API dataplane on Talos, ArgoCD GitOps, Crossplane self-service, Prometheus-gated canary rollouts — with default-deny network policies, scanned/signed images, and a labels-everywhere tagging convention.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages