doran/deploy/k8s
2026-03-29 10:28:09 +02:00
..
base feat: bootstrap hetzner k3s deployment 2026-03-28 20:53:29 +01:00
overlays/hetzner-single-node feat: add headlamp web ui for cluster ops 2026-03-29 10:28:09 +02:00
platform/base feat: add headlamp web ui for cluster ops 2026-03-29 10:28:09 +02:00
projects fix: wait for redpanda before bootstrapping topics 2026-03-28 21:09:49 +01:00
secrets feat: add headlamp web ui for cluster ops 2026-03-29 10:28:09 +02:00
README.md feat: add headlamp web ui for cluster ops 2026-03-29 10:28:09 +02:00

Kubernetes bootstrap assets

This directory is the repo-driven deployment target for the single-node Hetzner+k3s bootstrap.

Layout

  • base/ — shared bootstrap manifests plus the current unrip project manifests
  • projects/ — conventions for hosting multiple isolated projects on the same cluster
  • overlays/hetzner-single-node/ — first-node overlay with concrete hostnames, local-path storage, and generated secret references
  • secrets/ — examples and instructions for supplying required secrets out-of-band

Shared cluster model

Shared platform namespaces:

  • forgejo
  • registry
  • observability (grafana, loki, promtail, headlamp)
  • ingress-nginx
  • cert-manager

Project-specific namespaces:

  • unrip
  • future projects should get their own namespace instead of sharing unrip

Apply flow

After Terraform/cloud-init has produced a working kubeconfig, the canonical path is:

bash scripts/hetzner/bootstrap.sh

That script renders the Hetzner overlay inputs, creates platform and project registry auth secrets using the active project naming, and applies:

kubectl apply -k deploy/k8s/overlays/hetzner-single-node

Secret management

The overlay intentionally references generated or pre-created Secrets instead of committing credentials:

  • unrip/unrip-secrets
  • unrip/unrip-registry-creds
  • forgejo/forgejo-secrets
  • observability/observability-secrets
  • registry/registry-secrets

The bootstrap script creates them from local environment variables. By default it targets the unrip project, but its kubeconfig context name, bootstrap image tag, project secret env filename, project namespace, and project registry secret name are derived from PROJECT_NAME, PROJECT_NAMESPACE, and CLUSTER_NAME instead of hard-coding legacy trading-system values.