Skip to content

Architecture

Ultron Infra is an app-agnostic GitOps platform: a single k3s node named ultron (Oracle Cloud 24GB Ampere A1, arm64) that provides edge, TLS, metrics, delivery, and databases, then lets apps plug in. Traefik is the sole edge; the Kubernetes API is Tailscale-only. A handful of platform operators run as namespaces, all reconciled from the <owner>/gitops repo by Argo CD. Each workload lives under workloads/<app> and onboards the same way (Penvoice is just one such app).

The diagram below shows the platform layer plus a single generic <app> workload. Add more apps by dropping another workloads/<app> alongside it.

flowchart TB
  subgraph ext[Externals]
    SPA[App frontend<br/>e.g. Vercel SPA]
    Oracle[Oracle Object Storage<br/>Postgres backups]
    GHCR[GHCR<br/>container images]
    TS[Tailscale<br/>k8s API access]
  end

  Internet((Internet)) -->|"80 / 443"| Traefik

  subgraph ultron[node: ultron · k3s arm64]
    Traefik[Traefik edge<br/>+ cert-manager TLS]

    subgraph platform[platform layer]
      subgraph argocd[ns: argocd]
        Argo[Argo CD<br/>+ Rollouts / Workflows / Events]
      end
      subgraph cm[ns: cert-manager]
        CM[cert-manager]
      end
      subgraph mon[ns: monitoring]
        Prom[Prometheus / Grafana / Alertmanager]
      end
      subgraph cnpg[ns: cnpg-system]
        CNPG[CloudNativePG operator]
      end
      subgraph kc[ns: keycloak]
        KCop[Keycloak operator]
        KCi[Keycloak instance]
        KCpg[(keycloak-pg)]
      end
    end

    subgraph app[ns: &lt;app&gt; · e.g. Penvoice]
      API[&lt;app&gt; Rollout]
      APIpg[(&lt;app&gt;-pg)]
    end

    Traefik --> Argo
    Traefik --> KCi
    Traefik --> API
    API --> APIpg
    KCi --> KCpg
  end

  SPA -->|JWT to| API
  SPA -->|PKCE login| KCi
  GHCR -->|pulls image| API
  APIpg -->|WAL + base backup| Oracle
  KCpg -->|WAL + base backup| Oracle
  TS -.->|6443| ultron

The k8s API never listens on a public 6443ultron resolves to the node’s Tailscale IP on dev machines. Only 80/443 are open to the internet, both handled by Traefik.

Two delivery mechanisms: a one-time Helm bootstrap for the platform plumbing, then GitOps for everything else (the remaining operators + your apps). See GitOps & the app-of-apps for the reconcile model.

The platform layer is fixed; the app rows are templated — each app you onboard adds one GitOps row under workloads/<app>.

ComponentHowNamespace
cert-managerHelm (bootstrap)cert-manager
kube-prometheus-stack (Prometheus / Grafana / Alertmanager)Helm (bootstrap)monitoring
Argo CD / Rollouts / Workflows / EventsHelm (bootstrap)argocd
CNPG operatorGitOps — apps/cnpg-operatorcnpg-system
Keycloak operatorGitOps — apps/keycloak-operatorkeycloak
Keycloak instance + PostgresGitOps — apps/keycloakkeycloak
<app> + Postgres (e.g. Penvoice)GitOps — workloads/<app><app>

The Helm layer is what you can’t bootstrap with Argo CD because it is Argo CD (plus the issuers and metrics stack it leans on). Once it’s up, bootstrap/root-app.yaml takes over and reconciles the rest — every operator and every workloads/<app>.

Exact chart/operator versions installed during the Helm bootstrap of the platform:

Chart / operatorVersion
cert-managerv1.20.2
kube-prometheus-stack86.2.3
argo-cd9.5.21
argo-rollouts2.41.0
argo-workflows1.0.15
argo-events2.4.21
CloudNativePG0.28.3 (operator v1.29.1)
Keycloak operator26.6.3

Platform consoles are fixed; app endpoints follow each app’s own domain.

URLWhatServed by
argocd.<auth-domain>Argo CD UITraefik → argocd
auth.<auth-domain>Keycloak instanceTraefik → keycloak
api.<domain><app> API (e.g. Penvoice)Traefik → <app>
<domain><app> frontendexternal (e.g. Vercel)

The recipe — Dockerfile, CI to GHCR, Argo Application, Rollout, CNPG database, metric-gated canary — is the Onboard an app playbook. Drop it under workloads/<app> and the platform delivers it like any other.