Skip to content

feat(apps): add Crossview Crossplane dashboard behind SSO + Headlamp plugin#2153

Merged
devantler merged 1 commit into
mainfrom
claude/crossview-headlamp-ui
Jun 18, 2026
Merged

feat(apps): add Crossview Crossplane dashboard behind SSO + Headlamp plugin#2153
devantler merged 1 commit into
mainfrom
claude/crossview-headlamp-ui

Conversation

@devantler

Copy link
Copy Markdown
Contributor

What

Adds the Crossview (crossplane-contrib) web dashboard as a Hetzner-only Flux app so the cluster's Crossplane resources get a UI — surfaced both as a Homepage tile and inside Headlamp via the crossview-headlamp plugin. Crossplane landed on the platform in #2039; this gives it a frontend.

What's included

  • New app k8s/bases/apps/crossview/
    • helm-release.yaml — chart crossview 4.4.0 (latest stable; 4.5.0-rc.1 skipped as an RC) from https://crossplane-contrib.github.io/crossview/
    • helm-repository.yaml, namespace.yaml (PSS restricted), httproute.yaml, networkpolicy.yaml
  • SSOcrossview.${domain} fronted by oauth2-proxy/Dex, mirroring coroot/opencost/longhorn:
    • auth-proxy ConfigMap router + service → crossview-service.crossview.svc:80
    • oauth2-proxy ReferenceGrant entry for the crossview namespace
    • HTTPRoute backends to oauth2-proxy with X-Auth-Request-Redirect + HSTS filters
  • Headlampcrossview-headlamp plugin 0.1.4 added to the pluginsManager list
  • Registered in bases/apps/kustomization.yaml; Homepage tile via gethomepage.dev/* annotations (group Kubernetes)

Key decisions

  • GitOps-clean embed. Crossview is Flux-managed; the Headlamp plugin only opens/embeds it. The plugin's Install/Update/Uninstall buttons run a cluster-admin Helm Job — intentionally unused (noted in-code). Don't click them.
  • Ephemeral Postgres. The chart bundles Postgres with a 10Gi PVC by default; database.persistence.enabled: false runs it ephemeral so we don't place a stateful Longhorn volume on prod (the autoscaler-node data-loss footgun). Acceptable for a read-only, SSO-fronted dashboard — session/user rows reset on restart.
  • Hetzner-only. Registered via bases/apps, which only the hetzner provider includes (docker deploys no apps). The auth-proxy/ReferenceGrant entries live in the controllers layer (both providers) but are inert on local/CI — no local HTTPRoute routes crossview.${domain} — mirroring the existing longhorn precedent.

Validation

  • ksail workload validate and ksail --config ksail.prod.yaml workload validate347 files validated, exit 0 (all 5 crossview manifests included).
  • kubectl kustomize of clusters/local + clusters/prod, plus the providers/{hetzner,docker}/{apps,infrastructure/controllers} paths → all build; Crossview present in hetzner/apps, absent from docker/apps; auth-proxy router present in both (inert on local).

Note: static validation doesn't render HelmRelease values against the chart (Flux does that at runtime); values keys were taken from the chart's values.yaml.

Runtime-verify / follow-ups (can't be checked statically)

  • SSO identity passthrough — oauth2-proxy gates access (secure regardless), but whether Crossview's auth.mode: session + trustedHeader: X-Auth-User seamlessly adopts the proxy identity may need header mapping (oauth2-proxy emits X-Auth-Request-*).
  • iframe embed inside Headlamp ("Open Crossview") may need CSP/frame-ancestors tuning given the SSO redirect.
  • Bundled postgres:latest under PSS restricted + ephemeral should run but is unverified on this cluster; pin a real tag if it misbehaves.
  • Secrets hardening — chart defaults (admin/password, empty session secret) are used; recommend a SOPS-encrypted override of secrets.adminPassword/sessionSecret/dbPassword.

🤖 Generated with Claude Code

…plugin

Adds the Crossview (crossplane-contrib) web dashboard as a Hetzner-only
Flux app so the cluster's Crossplane resources get a UI — surfaced both as
a Homepage tile and inside Headlamp via the crossview-headlamp plugin.

- apps/crossview: HelmRelease (chart 4.4.0), HelmRepository, SSO HTTPRoute
  (oauth2-proxy/Dex, like coroot/longhorn), CiliumNetworkPolicy, namespace.
  Bundled Postgres runs ephemeral (no Longhorn PVC) for a read-only,
  SSO-fronted dashboard.
- auth-proxy + oauth2-proxy ReferenceGrant: crossview.${domain} routing
  (inert on local/CI, mirroring the longhorn precedent).
- headlamp: add the crossview-headlamp plugin (embeds the Flux-managed
  Crossview; its Install/Uninstall actions are intentionally unused).

Hetzner-only via bases/apps (the docker provider deploys no apps).
Validated: ksail workload validate (local + prod) and kubectl kustomize
of both overlays.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@devantler devantler marked this pull request as ready for review June 18, 2026 14:49
@devantler devantler enabled auto-merge June 18, 2026 14:49
@devantler devantler added this pull request to the merge queue Jun 18, 2026
Merged via the queue into main with commit 1b9afb1 Jun 18, 2026
10 checks passed
@devantler devantler deleted the claude/crossview-headlamp-ui branch June 18, 2026 15:22
@github-project-automation github-project-automation Bot moved this from 🫴 Ready to ✅ Done in 🌊 Project Board Jun 18, 2026
@botantler-1

botantler-1 Bot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 1.67.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

@botantler-1 botantler-1 Bot added the released label Jun 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

Status: ✅ Done

Development

Successfully merging this pull request may close these issues.

1 participant