The cluster uses an app-of-apps pattern: a single root ArgoCD Application points to the k8s-cluster-config Git repository. Inside that repo, each component has its own application.yaml. ArgoCD reads these and creates child Applications — one per component.
Why app-of-apps? Each component is independently managed. You can sync, roll back, or pause a single component without touching others. ArgoCD tracks drift — if someone manually edits a K8s resource, ArgoCD detects the diff and can auto-heal it.
ArgoCD uses argocd.argoproj.io/sync-wave annotations to control deployment order. Lower waves deploy first and must become healthy before the next wave starts.
Why this order? Each layer depends on the one before:
Every app that needs a secret follows the same pipeline:
kv/authentik/postgresThis means: to add a new secret to a pod, you never edit the pod spec directly. You write the value to Vault, create a VaultStaticSecret CR, and the secret appears automatically.
All components are deployed via ArgoCD. Lower sync waves deploy first.
| Wave | Component | What It Does | Helm Chart | Version | Namespace |
|---|---|---|---|---|---|
| -10 | coredns-custom | Custom CoreDNS config (local DNS overrides) | (raw manifests) | — | kube-system |
| 0 | cert-manager | Automatically issues and renews TLS certificates (Let's Encrypt via ACME) | cert-manager |
1.18.2 | cert-manager |
| 1 | metallb | Assigns real IP addresses (192.168.88.12) to LoadBalancer Services | metallb |
0.15.2 | metallb-system |
| 2 | traefik | HTTP/HTTPS reverse proxy and ingress controller; terminates TLS | traefik |
34.4.1 | traefik |
| 3 | crowdsec | IDS/IPS and WAF: IP reputation (LAPI), per-request deep inspection (AppSec), community blocklist (CAPI); integrates with Traefik via bouncer plugin | crowdsec |
0.22.1 | crowdsec |
| 3 | longhorn | Distributed block storage using K8s node SSDs; provides longhorn (2-replica default) and longhorn-2rep StorageClasses |
longhorn |
1.10.0 | longhorn-system |
| 3 | nfs-synology | NFS provisioner for Synology HDD pool; provides nfs-synology StorageClass |
nfs-subdir-external-provisioner |
4.0.18 | nfs-storage |
| 3 | nfs-subdir-retain | NFS provisioner for TrueNAS NVMe (retain policy) | nfs-subdir-external-provisioner |
4.0.18 | nfs-storage |
| 3 | nfs-subdir-delete | NFS provisioner for TrueNAS NVMe (delete policy — ephemeral) | nfs-subdir-external-provisioner |
4.0.18 | nfs-storage |
| 3 | metrics-server | Provides kubectl top and HPA with CPU/memory usage data |
metrics-server |
3.13.0 | kube-system |
| 4 | vault | Secret store; single source of truth for all passwords and tokens | vault |
0.31.0 | vault |
| 5 | vso | Watches VaultStaticSecret CRs and syncs Vault values into K8s Secrets | vault-secrets-operator |
1.0.1 | vso-system |
| 5 | argocd-oidc | Configures ArgoCD to authenticate via Authentik SSO | (raw manifests) | — | argocd |
| 6 | velero | K8s backup: manifests + NFS PVC data via Kopia fs-backup to MinIO | velero |
8.3.0 | velero |
| 6 | technitium | Primary + secondary DNS servers with ad blocking, DoT/DoH, DNSSEC; serves cluster and home network | (raw manifests) | — | technitium |
| 7 | external-dns | Watches Ingress/Service objects and automatically creates Technitium DNS entries via rfc2136+TSIG | external-dns |
1.19.0 | external-dns |
| 8 | harbor | Private container registry with vulnerability scanning (Trivy) and signing (Cosign) | harbor |
1.18.0 | harbor |
| 8 | syncthing | P2P file sync: K8s pod reads TrueNAS NFS (Send Only) → Synology NAS (Receive Only + Ignore Deletes). Replicates Proxmox VM backups to Synology archive | (raw manifests) | — | syncthing |
| 9 | github-runners-controller | ARC controller that manages the GitHub Actions runner lifecycle | (ARC controller) | 0.12.1 | actions-runner-system |
| 10 | github-runners-scale-set | Self-hosted GHA runners that auto-scale based on queued jobs | (ARC runner set) | 0.12.1 | gha-runners |
| 10 | authentik | Identity Provider (IdP) and SSO gateway; all apps authenticate through it | authentik |
2025.10.3 | authentik |
| 11 | grafana | Dashboards UI for metrics, logs, and traces; authenticated via Authentik OIDC | grafana |
10.1.4 | monitoring |
| 11 | victoria-metrics | Time-series database (Prometheus-compatible); stores 90 days of metrics | victoria-metrics-single |
0.12.1 | monitoring |
| 11 | victoria-logs | Log storage backend; stores 30 days of pod stdout and MikroTik syslog | victoria-logs-single |
0.8.11 | monitoring |
| 11 | vmagent | Metrics scraper DaemonSet; collects from K8s, NAS, Proxmox, network gear | victoria-metrics-agent |
0.14.5 | monitoring |
| 11 | vmalert | Evaluates alerting rules against VictoriaMetrics; sends to Alertmanager | victoria-metrics-alert |
0.31.0 | monitoring |
| 11 | vector | Log collector DaemonSet; ships K8s pod logs and MikroTik syslog to VictoriaLogs | vector |
0.36.1 | monitoring |
| 11 | opentelemetry-collector | OTLP ingestion hub; routes traces → Tempo, metrics → VictoriaMetrics, logs → VictoriaLogs | opentelemetry-collector |
0.146.0 | monitoring |
| 11 | tempo | Distributed trace storage (Grafana Tempo); stores 14 days of traces in MinIO | tempo |
1.10.3 | monitoring |
| 12 | kube-state-metrics | Exposes K8s object state (pod health, PVC status, deployment replicas) as metrics | kube-state-metrics |
6.4.1 | monitoring |
| 13 | nas-ingress | Traefik IngressRoutes for NAS Docker apps (port-forwards to 192.168.88.19) | (raw manifests) | — | nas-ingress |
| 14 | nextcloud | Self-hosted file sync and collaboration (Dropbox/Google Drive alternative) | nextcloud |
8.9.0 | nextcloud |
These components have resources/ directories in k8s-cluster-config containing VSO manifests (ServiceAccount + VaultAuth + VaultStaticSecret).
| Component | Namespace | Vault Path | K8s Secret Created |
|---|---|---|---|
authentik |
authentik | kv/authentik/* |
authentik-secret-key, authentik-db, etc. |
argocd-oidc |
argocd | kv/authentik/argocd-oidc |
argocd-oidc-secret |
grafana |
monitoring | kv/monitoring/grafana/* |
grafana-admin, grafana-oidc |
harbor |
harbor | kv/authentik/harbor-oidc |
harbor-oidc-secret |
nextcloud |
nextcloud | kv/nextcloud/admin |
nextcloud-admin |
technitium |
technitium | kv/technitium/admin |
technitium-admin |
external-dns |
external-dns | kv/external-dns/tsig |
technitium-tsig |
vmalert |
monitoring | kv/monitoring/alertmanager/ntfy |
alertmanager-ntfy |
velero |
velero | kv/velero/minio |
velero-minio-creds |
crowdsec |
crowdsec | kv/crowdsec/bouncer |
crowdsec-bouncer-key |
traefik (crowdsec bouncer key) |
traefik | kv/traefik/crowdsec-bouncer |
crowdsec-bouncer-key |
tempo |
monitoring | kv/monitoring/tempo/minio |
tempo-minio-creds |
vmalert (restore-test) |
monitoring | kv/monitoring/db-backup-minio |
restore-test-minio |