Skip to content

feat: CUE GitOps template with Flux/Argo delivery and alpha-01 Talos cluster - #19

Merged
selfuryon merged 18 commits into
mainfrom
talos-alpha-01
Oct 21, 2026
Merged

selfuryon merged 18 commits into
mainfrom
talos-alpha-01

Conversation

@selfuryon

Copy link
Copy Markdown
Owner

Rebuilds the repo as a reusable CUE GitOps template for Talos clusters: manifests are rendered in CI, published to GHCR as signed OCI artifacts and delivered by Flux (platform) and Argo CD (user apps). Old ArgoCD/Crossplane/gitops manifests are removed.

Layout

  • apps/<category>/<component>: each component defined once (chart, values, manifests). Initial set: flux-operator + FluxInstance, Cilium, cert-manager, local-path-provisioner, headless Argo CD (no UI/Dex/notifications/ApplicationSet), whoami example.
  • clusters/defaults.cue: shared cluster definitions #Core / #Homelab (version resolution, rendering, release layer).
  • clusters/<cluster>/: config, extra components and overrides, pins.json, releases.json, generated release/, SOPS secrets/<set>/, Talos config.
    • alpha-01: the Beelink single-node cluster (dual-stack, IPv6 primary, Cilium native routing + netkit, nodeIPAM).
    • beta-01: manifest-only example (publish: false) with a different component set, IPv4-only, stable channel with older pins.

Sets, versions, releases

  • Sets are projects, like etherno-infra: system (Flux) and apps (Argo, after system) by default. Each set is its own artifact <cluster>-<set>, release and rollback.
  • Versions: apps/registry/latest.json (Renovate) → per-cluster pins.json. Channel fast = latest with pins on top, stable = pins only. cue cmd promote -t to=… -t from=<latest|cluster> and the Promote workflow move versions between clusters.
  • No latest anywhere: content-addressed artifacts, a committed release layer pins them by digest (cosign-verified by Flux); publishing opens a release PR per cluster (auto-merge for alpha-01); rollback = revert.

CI

  • Integration: nix checks, cue vet, release-layer sync, Talos validation, per-project manifest diff comments, final-check gate.
  • Publish, Flake Updates (auto-merge), Renovate (auto-merge minor/patch), Promote, weekly GHCR cleanup, labeler.
  • CUE version is not pinned; CI uses the devshell from flake.lock.

Before/after merge

See docs/bootstrap.md: GitHub App (APP_CLIENT_ID / APP_PRIVATE_KEY), Renovate app, auto-merge + ruleset requiring final-check, make GHCR packages public after the first publish, then bootstrap the cluster (sops-age secret, flux-operator, cue cmd dump -t project=bootstrap).

Not yet verified live: helm-controller adopting the hand-installed Cilium release, Argo CD accepting a digest targetRevision for OCI sources.

🤖 Generated with Claude Code

…setup

Remove argocd, crossplane, gitops and generated cue.mod definitions,
trim the devshell to the tools in use and switch pre-commit hooks
from the stale hercules-ci flakeModule branch to cachix/git-hooks.nix,
which provides the cue-fmt and zizmor hooks.
Talos v1.14 multi-document config patches and a gen.sh that renders
controlplane.yaml/talosconfig into .secrets/talos/alpha-01:

- install to the SATA SSD via UnattendedInstallConfig, EPHEMERAL capped
  at 64GiB, the rest of the disk as the local-storage user volume
- dual-stack (IPv6 primary): node IP and API endpoint on the Starlink
  ULA prefix, IPv4 stays on DHCP
- no Flannel, kube-proxy or discovery; workloads on the control plane
- Cilium 1.20 values: native routing, netkit, BPF host routing and
  masquerade, kube-proxy replacement, node IPAM LoadBalancer
Components are defined once in apps/base and rendered either as a Flux
source + HelmRelease or as an Argo CD Application; apps/bundles wires
them with flex (Renovate) and stable version channels, clusters/<name>
picks a channel, pins and overrides.

Each cluster renders a bootstrap project plus flux and argo artifacts.
A committed release layer (releases.json -> release/{flux,argo}) pins
the artifacts by digest and is what the FluxInstance syncs, so no
cluster follows latest. SOPS-encrypted secrets ship in the flux
artifact. alpha-01's Talos config moves under clusters/alpha-01/talos.
Components live in apps/<x> and each cluster lists what it runs.
Versions come from apps/registry/latest.json (channel fast) with
clusters/<name>/pins.json on top, or from pins only (channel stable).
- integration: nix checks, cue vet, release-layer sync, Talos validation,
  per-project manifest diff comments, final-check gate
- publish: content-addressed artifacts to GHCR, cosign keyless signing,
  release PR per cluster with optional auto-merge
- flake updates and Renovate with auto-merge, Pin workflow for
  stable-channel clusters, weekly GHCR cleanup keeping pinned digests
- cue cmd versions exposes what each cluster resolves; scripts/promote.sh
  and the Promote workflow copy versions from latest.json or another
  cluster into a target's pins.json (replaces the Pin workflow)
- config.publish: clusters without it are rendered and diffed in PRs but
  get no artifacts or release PRs
- beta-01: different component set, IPv4-only, stable channel with older
  pinned versions
#Cluster carries version resolution, rendering, the release layer and
projects; #Core (flux-operator, Cilium, Argo CD) and #Homelab (+ cert-
manager, local-path, whoami) are reusable component sets. Clusters
unify one with config, pins and releases and add or override on top.
Promotion now lives next to version resolution in CUE: it reads the
source versions (latest.json or another cluster) and the target's pins,
writes pins.json keeping key order and prints what changed. An explicit
component list can add pins the target does not have yet.
Like etherno-infra projects: config.sets defines the sets of a cluster,
each rendered and published as its own artifact <cluster>-<set> with its
own releases.json entry, release and rollback. A set's controller decides
the wrapper of its components (replaces the per-component controller);
set dependsOn becomes Kustomization dependsOn, and Argo sets wait for
the Flux sets they need. Defaults: system (Flux) and apps (Argo, after
system). SOPS secrets move to secrets/<set>/ and are limited to Flux sets.
@selfuryon

Copy link
Copy Markdown
Owner Author

retrigger

@awesome-cue-infra-bot

awesome-cue-infra-bot Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Manifests diff: alpha-01/apps

3 files changed:

  • A whoami/deployment/whoami.yaml
  • A whoami/namespace/whoami.yaml
  • A whoami/service/whoami.yaml

3 added A

Diff

whoami/deployment/whoami.yaml

@@ -0,0 +1,44 @@
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: whoami
+  namespace: whoami
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app.kubernetes.io/name: whoami
+  template:
+    metadata:
+      labels:
+        app.kubernetes.io/name: whoami
+    spec:
+      containers:
+      - args:
+        - --port
+        - '8080'
+        image: docker.io/traefik/whoami:v1.12.0
+        name: whoami
+        ports:
+        - containerPort: 8080
+          name: http
+        resources:
+          limits:
+            memory: 32Mi
+          requests:
+            cpu: 10m
+            memory: 16Mi
+        securityContext:
+          allowPrivilegeEscalation: false
+          capabilities:
+            drop:
+            - ALL
+          readOnlyRootFilesystem: true
+      securityContext:
+        runAsNonRoot: true
+        runAsUser: 65534
+        seccompProfile:
+          type: RuntimeDefault

whoami/namespace/whoami.yaml

@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: Namespace
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+    pod-security.kubernetes.io/audit: restricted
+    pod-security.kubernetes.io/enforce: restricted
+    pod-security.kubernetes.io/warn: restricted
+  name: whoami

whoami/service/whoami.yaml

@@ -0,0 +1,17 @@
+---
+apiVersion: v1
+kind: Service
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: whoami
+  namespace: whoami
+spec:
+  ipFamilyPolicy: PreferDualStack
+  ports:
+  - name: http
+    port: 80
+    targetPort: http
+  selector:
+    app.kubernetes.io/name: whoami
+  type: LoadBalancer

GitHub Actions

@awesome-cue-infra-bot

awesome-cue-infra-bot Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Manifests diff: alpha-01/bootstrap

2 files changed:

  • A flux-system/fluxinstance/flux.yaml
  • A flux-system/namespace/flux-system.yaml

2 added A

Diff

flux-system/fluxinstance/flux.yaml

@@ -0,0 +1,30 @@
+---
+apiVersion: fluxcd.controlplane.io/v1
+kind: FluxInstance
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: flux
+  namespace: flux-system
+spec:
+  cluster:
+    domain: cluster.local
+    multitenant: false
+    networkPolicy: true
+    size: small
+    type: kubernetes
+  components:
+  - source-controller
+  - kustomize-controller
+  - helm-controller
+  - notification-controller
+  distribution:
+    artifact: oci://ghcr.io/controlplaneio-fluxcd/flux-operator-manifests
+    registry: ghcr.io/fluxcd
+    version: 2.9.6
+  sync:
+    interval: 5m
+    kind: GitRepository
+    path: clusters/alpha-01/release/flux
+    ref: refs/heads/main
+    url: https://github.com/selfuryon/awesome-cue-infra.git

flux-system/namespace/flux-system.yaml

@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: Namespace
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+    pod-security.kubernetes.io/audit: restricted
+    pod-security.kubernetes.io/enforce: baseline
+    pod-security.kubernetes.io/warn: restricted
+  name: flux-system

GitHub Actions

@awesome-cue-infra-bot

awesome-cue-infra-bot Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Manifests diff: alpha-01/system

18 files changed:

  • A argocd/helmrelease/argo-cd.yaml
  • A argocd/namespace/argocd.yaml
  • A argocd/ocirepository/argo-cd.yaml
  • A cert-manager/helmrelease/cert-manager.yaml
  • A cert-manager/namespace/cert-manager.yaml
  • A cert-manager/ocirepository/cert-manager.yaml
  • A flux-system/fluxinstance/flux.yaml
  • A flux-system/helmrelease/flux-operator.yaml
  • A flux-system/namespace/flux-system.yaml
  • A flux-system/ocirepository/flux-operator.yaml
  • A kube-system/helmrelease/cilium.yaml
  • A kube-system/helmrepository/cilium.yaml
  • A kyverno/helmrelease/kyverno.yaml
  • A kyverno/namespace/kyverno.yaml
  • A kyverno/ocirepository/kyverno.yaml
  • A local-path-storage/gitrepository/local-path-provisioner.yaml
  • A local-path-storage/helmrelease/local-path-provisioner.yaml
  • A local-path-storage/namespace/local-path-storage.yaml

18 added A

Diff

argocd/helmrelease/argo-cd.yaml

@@ -0,0 +1,43 @@
+---
+apiVersion: helm.toolkit.fluxcd.io/v2
+kind: HelmRelease
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: argo-cd
+  namespace: argocd
+spec:
+  chartRef:
+    kind: OCIRepository
+    name: argo-cd
+  install:
+    crds: CreateReplace
+  interval: 1h
+  postRenderers:
+  - kustomize:
+      patches:
+      - patch: |-
+          $patch: delete
+          apiVersion: apps/v1
+          kind: Deployment
+          metadata:
+            name: argocd-applicationset-controller
+        target:
+          kind: Deployment
+          name: argocd-applicationset-controller
+  releaseName: argo-cd
+  upgrade:
+    crds: CreateReplace
+  values:
+    applicationSet:
+      replicas: 0
+    crds:
+      install: true
+      keep: true
+    dex:
+      enabled: false
+    fullnameOverride: argocd
+    notifications:
+      enabled: false
+    server:
+      enabled: false

argocd/namespace/argocd.yaml

@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: Namespace
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+    pod-security.kubernetes.io/audit: restricted
+    pod-security.kubernetes.io/enforce: baseline
+    pod-security.kubernetes.io/warn: restricted
+  name: argocd

argocd/ocirepository/argo-cd.yaml

@@ -0,0 +1,16 @@
+---
+apiVersion: source.toolkit.fluxcd.io/v1
+kind: OCIRepository
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: argo-cd
+  namespace: argocd
+spec:
+  interval: 12h
+  layerSelector:
+    mediaType: application/vnd.cncf.helm.chart.content.v1.tar+gzip
+    operation: copy
+  ref:
+    tag: 10.10.3
+  url: oci://ghcr.io/argoproj/argo-helm/argo-cd

cert-manager/helmrelease/cert-manager.yaml

@@ -0,0 +1,21 @@
+---
+apiVersion: helm.toolkit.fluxcd.io/v2
+kind: HelmRelease
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: cert-manager
+  namespace: cert-manager
+spec:
+  chartRef:
+    kind: OCIRepository
+    name: cert-manager
+  install:
+    crds: CreateReplace
+  interval: 1h
+  releaseName: cert-manager
+  upgrade:
+    crds: CreateReplace
+  values:
+    crds:
+      enabled: true

cert-manager/namespace/cert-manager.yaml

@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: Namespace
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+    pod-security.kubernetes.io/audit: restricted
+    pod-security.kubernetes.io/enforce: baseline
+    pod-security.kubernetes.io/warn: restricted
+  name: cert-manager

cert-manager/ocirepository/cert-manager.yaml

@@ -0,0 +1,16 @@
+---
+apiVersion: source.toolkit.fluxcd.io/v1
+kind: OCIRepository
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: cert-manager
+  namespace: cert-manager
+spec:
+  interval: 12h
+  layerSelector:
+    mediaType: application/vnd.cncf.helm.chart.content.v1.tar+gzip
+    operation: copy
+  ref:
+    tag: v1.21.2
+  url: oci://quay.io/jetstack/charts/cert-manager

flux-system/fluxinstance/flux.yaml

@@ -0,0 +1,30 @@
+---
+apiVersion: fluxcd.controlplane.io/v1
+kind: FluxInstance
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: flux
+  namespace: flux-system
+spec:
+  cluster:
+    domain: cluster.local
+    multitenant: false
+    networkPolicy: true
+    size: small
+    type: kubernetes
+  components:
+  - source-controller
+  - kustomize-controller
+  - helm-controller
+  - notification-controller
+  distribution:
+    artifact: oci://ghcr.io/controlplaneio-fluxcd/flux-operator-manifests
+    registry: ghcr.io/fluxcd
+    version: 2.9.6
+  sync:
+    interval: 5m
+    kind: GitRepository
+    path: clusters/alpha-01/release/flux
+    ref: refs/heads/main
+    url: https://github.com/selfuryon/awesome-cue-infra.git

flux-system/helmrelease/flux-operator.yaml

@@ -0,0 +1,21 @@
+---
+apiVersion: helm.toolkit.fluxcd.io/v2
+kind: HelmRelease
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: flux-operator
+  namespace: flux-system
+spec:
+  chartRef:
+    kind: OCIRepository
+    name: flux-operator
+  install:
+    crds: CreateReplace
+  interval: 1h
+  releaseName: flux-operator
+  upgrade:
+    crds: CreateReplace
+  values:
+    web:
+      enabled: false

flux-system/namespace/flux-system.yaml

@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: Namespace
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+    pod-security.kubernetes.io/audit: restricted
+    pod-security.kubernetes.io/enforce: baseline
+    pod-security.kubernetes.io/warn: restricted
+  name: flux-system

flux-system/ocirepository/flux-operator.yaml

@@ -0,0 +1,16 @@
+---
+apiVersion: source.toolkit.fluxcd.io/v1
+kind: OCIRepository
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: flux-operator
+  namespace: flux-system
+spec:
+  interval: 12h
+  layerSelector:
+    mediaType: application/vnd.cncf.helm.chart.content.v1.tar+gzip
+    operation: copy
+  ref:
+    tag: 0.61.0
+  url: oci://ghcr.io/controlplaneio-fluxcd/charts/flux-operator

kube-system/helmrelease/cilium.yaml

@@ -0,0 +1,80 @@
+---
+apiVersion: helm.toolkit.fluxcd.io/v2
+kind: HelmRelease
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: cilium
+  namespace: kube-system
+spec:
+  chart:
+    spec:
+      chart: cilium
+      interval: 12h
+      sourceRef:
+        kind: HelmRepository
+        name: cilium
+      version: 1.20.2
+  install:
+    crds: CreateReplace
+  interval: 1h
+  releaseName: cilium
+  upgrade:
+    crds: CreateReplace
+  values:
+    bpf:
+      datapathMode: netkit
+      hostLegacyRouting: false
+      masquerade: true
+    cgroup:
+      autoMount:
+        enabled: false
+      hostRoot: /sys/fs/cgroup
+    defaultLBServiceIPAM: nodeipam
+    devices:
+    - enp2s0
+    enableIPv4Masquerade: true
+    enableIPv6Masquerade: true
+    hubble:
+      enabled: false
+    ipam:
+      mode: kubernetes
+    ipv4:
+      enabled: true
+    ipv4NativeRoutingCIDR: 10.244.0.0/16
+    ipv6:
+      enabled: true
+    ipv6NativeRoutingCIDR: fd00:10:244::/56
+    k8s:
+      requireIPv4PodCIDR: true
+      requireIPv6PodCIDR: true
+    k8sServiceHost: localhost
+    k8sServicePort: 7445
+    kubeProxyReplacement: true
+    loadBalancer:
+      acceleration: disabled
+    nodeIPAM:
+      enabled: true
+    operator:
+      replicas: 1
+    prometheus:
+      enabled: false
+    routingMode: native
+    securityContext:
+      capabilities:
+        ciliumAgent:
+        - CHOWN
+        - KILL
+        - NET_ADMIN
+        - NET_RAW
+        - IPC_LOCK
+        - SYS_ADMIN
+        - SYS_RESOURCE
+        - DAC_OVERRIDE
+        - FOWNER
+        - SETGID
+        - SETUID
+        cleanCiliumState:
+        - NET_ADMIN
+        - SYS_ADMIN
+        - SYS_RESOURCE

kube-system/helmrepository/cilium.yaml

@@ -0,0 +1,11 @@
+---
+apiVersion: source.toolkit.fluxcd.io/v1
+kind: HelmRepository
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: cilium
+  namespace: kube-system
+spec:
+  interval: 12h
+  url: https://helm.cilium.io

kyverno/helmrelease/kyverno.yaml

@@ -0,0 +1,21 @@
+---
+apiVersion: helm.toolkit.fluxcd.io/v2
+kind: HelmRelease
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: kyverno
+  namespace: kyverno
+spec:
+  chartRef:
+    kind: OCIRepository
+    name: kyverno
+  install:
+    crds: CreateReplace
+  interval: 1h
+  releaseName: kyverno
+  upgrade:
+    crds: CreateReplace
+  values:
+    crds:
+      install: true

kyverno/namespace/kyverno.yaml

@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: Namespace
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+    pod-security.kubernetes.io/audit: restricted
+    pod-security.kubernetes.io/enforce: baseline
+    pod-security.kubernetes.io/warn: restricted
+  name: kyverno

kyverno/ocirepository/kyverno.yaml

@@ -0,0 +1,16 @@
+---
+apiVersion: source.toolkit.fluxcd.io/v1
+kind: OCIRepository
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: kyverno
+  namespace: kyverno
+spec:
+  interval: 12h
+  layerSelector:
+    mediaType: application/vnd.cncf.helm.chart.content.v1.tar+gzip
+    operation: copy
+  ref:
+    tag: 3.9.1
+  url: oci://ghcr.io/kyverno/charts/kyverno

local-path-storage/gitrepository/local-path-provisioner.yaml

@@ -0,0 +1,13 @@
+---
+apiVersion: source.toolkit.fluxcd.io/v1
+kind: GitRepository
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: local-path-provisioner
+  namespace: local-path-storage
+spec:
+  interval: 12h
+  ref:
+    tag: v0.0.37
+  url: https://github.com/rancher/local-path-provisioner

local-path-storage/helmrelease/local-path-provisioner.yaml

@@ -0,0 +1,34 @@
+---
+apiVersion: helm.toolkit.fluxcd.io/v2
+kind: HelmRelease
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: local-path-provisioner
+  namespace: local-path-storage
+spec:
+  chart:
+    spec:
+      chart: deploy/chart/local-path-provisioner
+      interval: 12h
+      reconcileStrategy: Revision
+      sourceRef:
+        kind: GitRepository
+        name: local-path-provisioner
+  install:
+    crds: CreateReplace
+  interval: 1h
+  releaseName: local-path-provisioner
+  upgrade:
+    crds: CreateReplace
+  values:
+    nodePathMap:
+    - node: DEFAULT_PATH_FOR_NON_LISTED_NODES
+      paths:
+      - /var/mnt/local-storage
+    storageClass:
+      create: true
+      defaultClass: true
+      name: local-path
+      reclaimPolicy: Delete
+      volumeBindingMode: WaitForFirstConsumer

local-path-storage/namespace/local-path-storage.yaml

@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: Namespace
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+    pod-security.kubernetes.io/audit: restricted
+    pod-security.kubernetes.io/enforce: privileged
+    pod-security.kubernetes.io/warn: restricted
+  name: local-path-storage

GitHub Actions

@awesome-cue-infra-bot

awesome-cue-infra-bot Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Manifests diff: beta-01/bootstrap

2 files changed:

  • A flux-system/fluxinstance/flux.yaml
  • A flux-system/namespace/flux-system.yaml

2 added A

Diff

flux-system/fluxinstance/flux.yaml

@@ -0,0 +1,30 @@
+---
+apiVersion: fluxcd.controlplane.io/v1
+kind: FluxInstance
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: flux
+  namespace: flux-system
+spec:
+  cluster:
+    domain: cluster.local
+    multitenant: false
+    networkPolicy: true
+    size: small
+    type: kubernetes
+  components:
+  - source-controller
+  - kustomize-controller
+  - helm-controller
+  - notification-controller
+  distribution:
+    artifact: oci://ghcr.io/controlplaneio-fluxcd/flux-operator-manifests
+    registry: ghcr.io/fluxcd
+    version: 2.9.5
+  sync:
+    interval: 5m
+    kind: GitRepository
+    path: clusters/beta-01/release/flux
+    ref: refs/heads/main
+    url: https://github.com/selfuryon/awesome-cue-infra.git

flux-system/namespace/flux-system.yaml

@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: Namespace
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+    pod-security.kubernetes.io/audit: restricted
+    pod-security.kubernetes.io/enforce: baseline
+    pod-security.kubernetes.io/warn: restricted
+  name: flux-system

GitHub Actions

@awesome-cue-infra-bot

awesome-cue-infra-bot Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Manifests diff: beta-01/apps

3 files changed:

  • A whoami/deployment/whoami.yaml
  • A whoami/namespace/whoami.yaml
  • A whoami/service/whoami.yaml

3 added A

Diff

whoami/deployment/whoami.yaml

@@ -0,0 +1,44 @@
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: whoami
+  namespace: whoami
+spec:
+  replicas: 2
+  selector:
+    matchLabels:
+      app.kubernetes.io/name: whoami
+  template:
+    metadata:
+      labels:
+        app.kubernetes.io/name: whoami
+    spec:
+      containers:
+      - args:
+        - --port
+        - '8080'
+        image: docker.io/traefik/whoami:v1.12.0
+        name: whoami
+        ports:
+        - containerPort: 8080
+          name: http
+        resources:
+          limits:
+            memory: 32Mi
+          requests:
+            cpu: 10m
+            memory: 16Mi
+        securityContext:
+          allowPrivilegeEscalation: false
+          capabilities:
+            drop:
+            - ALL
+          readOnlyRootFilesystem: true
+      securityContext:
+        runAsNonRoot: true
+        runAsUser: 65534
+        seccompProfile:
+          type: RuntimeDefault

whoami/namespace/whoami.yaml

@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: Namespace
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+    pod-security.kubernetes.io/audit: restricted
+    pod-security.kubernetes.io/enforce: restricted
+    pod-security.kubernetes.io/warn: restricted
+  name: whoami

whoami/service/whoami.yaml

@@ -0,0 +1,17 @@
+---
+apiVersion: v1
+kind: Service
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: whoami
+  namespace: whoami
+spec:
+  ipFamilyPolicy: PreferDualStack
+  ports:
+  - name: http
+    port: 80
+    targetPort: http
+  selector:
+    app.kubernetes.io/name: whoami
+  type: LoadBalancer

GitHub Actions

@awesome-cue-infra-bot

awesome-cue-infra-bot Bot commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Manifests diff: beta-01/system

9 files changed:

  • A argocd/helmrelease/argo-cd.yaml
  • A argocd/namespace/argocd.yaml
  • A argocd/ocirepository/argo-cd.yaml
  • A flux-system/fluxinstance/flux.yaml
  • A flux-system/helmrelease/flux-operator.yaml
  • A flux-system/namespace/flux-system.yaml
  • A flux-system/ocirepository/flux-operator.yaml
  • A kube-system/helmrelease/cilium.yaml
  • A kube-system/helmrepository/cilium.yaml

9 added A

Diff

argocd/helmrelease/argo-cd.yaml

@@ -0,0 +1,43 @@
+---
+apiVersion: helm.toolkit.fluxcd.io/v2
+kind: HelmRelease
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: argo-cd
+  namespace: argocd
+spec:
+  chartRef:
+    kind: OCIRepository
+    name: argo-cd
+  install:
+    crds: CreateReplace
+  interval: 1h
+  postRenderers:
+  - kustomize:
+      patches:
+      - patch: |-
+          $patch: delete
+          apiVersion: apps/v1
+          kind: Deployment
+          metadata:
+            name: argocd-applicationset-controller
+        target:
+          kind: Deployment
+          name: argocd-applicationset-controller
+  releaseName: argo-cd
+  upgrade:
+    crds: CreateReplace
+  values:
+    applicationSet:
+      replicas: 0
+    crds:
+      install: true
+      keep: true
+    dex:
+      enabled: false
+    fullnameOverride: argocd
+    notifications:
+      enabled: false
+    server:
+      enabled: false

argocd/namespace/argocd.yaml

@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: Namespace
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+    pod-security.kubernetes.io/audit: restricted
+    pod-security.kubernetes.io/enforce: baseline
+    pod-security.kubernetes.io/warn: restricted
+  name: argocd

argocd/ocirepository/argo-cd.yaml

@@ -0,0 +1,16 @@
+---
+apiVersion: source.toolkit.fluxcd.io/v1
+kind: OCIRepository
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: argo-cd
+  namespace: argocd
+spec:
+  interval: 12h
+  layerSelector:
+    mediaType: application/vnd.cncf.helm.chart.content.v1.tar+gzip
+    operation: copy
+  ref:
+    tag: 10.10.2
+  url: oci://ghcr.io/argoproj/argo-helm/argo-cd

flux-system/fluxinstance/flux.yaml

@@ -0,0 +1,30 @@
+---
+apiVersion: fluxcd.controlplane.io/v1
+kind: FluxInstance
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: flux
+  namespace: flux-system
+spec:
+  cluster:
+    domain: cluster.local
+    multitenant: false
+    networkPolicy: true
+    size: small
+    type: kubernetes
+  components:
+  - source-controller
+  - kustomize-controller
+  - helm-controller
+  - notification-controller
+  distribution:
+    artifact: oci://ghcr.io/controlplaneio-fluxcd/flux-operator-manifests
+    registry: ghcr.io/fluxcd
+    version: 2.9.5
+  sync:
+    interval: 5m
+    kind: GitRepository
+    path: clusters/beta-01/release/flux
+    ref: refs/heads/main
+    url: https://github.com/selfuryon/awesome-cue-infra.git

flux-system/helmrelease/flux-operator.yaml

@@ -0,0 +1,21 @@
+---
+apiVersion: helm.toolkit.fluxcd.io/v2
+kind: HelmRelease
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: flux-operator
+  namespace: flux-system
+spec:
+  chartRef:
+    kind: OCIRepository
+    name: flux-operator
+  install:
+    crds: CreateReplace
+  interval: 1h
+  releaseName: flux-operator
+  upgrade:
+    crds: CreateReplace
+  values:
+    web:
+      enabled: false

flux-system/namespace/flux-system.yaml

@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+kind: Namespace
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+    pod-security.kubernetes.io/audit: restricted
+    pod-security.kubernetes.io/enforce: baseline
+    pod-security.kubernetes.io/warn: restricted
+  name: flux-system

flux-system/ocirepository/flux-operator.yaml

@@ -0,0 +1,16 @@
+---
+apiVersion: source.toolkit.fluxcd.io/v1
+kind: OCIRepository
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: flux-operator
+  namespace: flux-system
+spec:
+  interval: 12h
+  layerSelector:
+    mediaType: application/vnd.cncf.helm.chart.content.v1.tar+gzip
+    operation: copy
+  ref:
+    tag: 0.60.0
+  url: oci://ghcr.io/controlplaneio-fluxcd/charts/flux-operator

kube-system/helmrelease/cilium.yaml

@@ -0,0 +1,78 @@
+---
+apiVersion: helm.toolkit.fluxcd.io/v2
+kind: HelmRelease
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: cilium
+  namespace: kube-system
+spec:
+  chart:
+    spec:
+      chart: cilium
+      interval: 12h
+      sourceRef:
+        kind: HelmRepository
+        name: cilium
+      version: 1.20.1
+  install:
+    crds: CreateReplace
+  interval: 1h
+  releaseName: cilium
+  upgrade:
+    crds: CreateReplace
+  values:
+    bpf:
+      datapathMode: netkit
+      hostLegacyRouting: false
+      masquerade: true
+    cgroup:
+      autoMount:
+        enabled: false
+      hostRoot: /sys/fs/cgroup
+    defaultLBServiceIPAM: nodeipam
+    devices:
+    - eth0
+    enableIPv4Masquerade: true
+    hubble:
+      enabled: false
+    ipam:
+      mode: kubernetes
+    ipv4:
+      enabled: true
+    ipv4NativeRoutingCIDR: 10.244.0.0/16
+    ipv6:
+      enabled: false
+    k8s:
+      requireIPv4PodCIDR: true
+      requireIPv6PodCIDR: false
+    k8sServiceHost: localhost
+    k8sServicePort: 7445
+    kubeProxyReplacement: true
+    loadBalancer:
+      acceleration: disabled
+    nodeIPAM:
+      enabled: true
+    operator:
+      replicas: 1
+    prometheus:
+      enabled: false
+    routingMode: native
+    securityContext:
+      capabilities:
+        ciliumAgent:
+        - CHOWN
+        - KILL
+        - NET_ADMIN
+        - NET_RAW
+        - IPC_LOCK
+        - SYS_ADMIN
+        - SYS_RESOURCE
+        - DAC_OVERRIDE
+        - FOWNER
+        - SETGID
+        - SETUID
+        cleanCiliumState:
+        - NET_ADMIN
+        - SYS_ADMIN
+        - SYS_RESOURCE

kube-system/helmrepository/cilium.yaml

@@ -0,0 +1,11 @@
+---
+apiVersion: source.toolkit.fluxcd.io/v1
+kind: HelmRepository
+metadata:
+  labels:
+    app.kubernetes.io/part-of: awesome-cue-infra
+  name: cilium
+  namespace: kube-system
+spec:
+  interval: 12h
+  url: https://helm.cilium.io

GitHub Actions

- nix/overlay.nix pins CUE v0.18.0-rc.1 from the upstream release
  tarball (devshell, CI, treefmt and pre-commit) until v0.18.0 reaches
  nixpkgs
- language.version v0.18.0: aliasv2 and explicitopen are stable, their
  attributes go; try is unused, so no file needs an experiment
- tree reformatted by the v0.18 cue fmt (formatv2)
- ext_tool.cue marshals each object instead of copying them into a list
  for yaml.MarshalStream (CUE never structure-shares a list
  comprehension body), as in etherno-infra

Every (cluster, project) render is the same set of objects as on
v0.17.1; the release layer is byte-identical.
…jects

- each branch renders with its own devshell (its CUE) and scripts, so a
  CUE upgrade in a PR never evaluates the base with the new binary
- .github/split-manifests.py (from etherno-infra) lays out only the
  objects that differ, one normalized file per <namespace>/<kind>/<name>
  with sorted keys; Python + PyYAML join the CI devshell
- every workflow runs on ubuntu-26.04
- cue-expert rewritten for this repo: status of every CUE experiment at
  v0.18, which would help here, v0.18 pitfalls, scope traps, manifest
  typing, comparing renders as objects
- crd-generation: no experiment header, strip-matchn step
- scripts/crd/strip-matchn.py from etherno-infra for future CRDs
- CLAUDE.md: experiment rules, CUE pin, render comparison
…etherno-infra)

- integration: narrow the diff matrix to the clusters whose inputs
  changed (shared inputs keep the full matrix, docs/Talos/release layer
  render nothing); run on merge_group in render-only mode; GOGC=200
- publish: SLSA provenance attestation next to the cosign signature;
  GHCR cleanup keeps .att tags with their artifact
- cue-compat: manual vet + render of every project on another CUE
  release before moving the pin
- renovate: hourly limit, timestamp-optional soak, immediate security
  PRs, assignee
- .github/CLAUDE.md: CI context and workflow security rules
@selfuryon
selfuryon merged commit 97b551d into main Oct 21, 2026
12 checks passed
@selfuryon
selfuryon deleted the talos-alpha-01 branch October 21, 2026 07:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant