Technology Stack

Table of Contents

This page covers the complete technology landscape and tools that power my infrastructure and projects. Everything runs on a production-grade Kubernetes cluster, providing a solid foundation for experimentation and real-world deployments.

πŸ—ΊοΈ How the K3s Cluster Works

The whole platform runs on K3s β€” a lightweight Kubernetes distribution β€” driven entirely by GitOps. Nothing is changed by hand: I describe the desired state in Git, and the cluster continuously reconciles itself to match. The diagram below traces that loop end to end.

flowchart TB
    Dev["git push"] --> Repo[("fako-cluster<br/>GitOps repo")]
    Repo ==>|"β‘  Flux pulls and reconciles"| API

    subgraph CP["K3s Control Plane Β· Apple Silicon M1 Pro"]
        direction LR
        API["kube-apiserver"]
        ETCD[("embedded etcd<br/>desired state")]
        SCHED["scheduler"]
        CM["controller-manager"]
        API <--> ETCD
        SCHED -. watches .-> API
        CM -. watches .-> API
    end

    API ==>|"β‘‘ schedules pods onto nodes"| Agents

    subgraph Agents["K3s Agent Nodes Β· kubelet + containerd"]
        direction LR
        Workers["x86 / ARM workers<br/>ThinkPad Β· mini-PCs"]
        GPU["GPU node Β· Ryzen 9 3900X<br/>RTX 5070 + RTX 3050<br/>NVIDIA device plugin"]
    end

    Internet([Internet]) --> CF["Cloudflare Tunnel + CDN"]
    CF ==>|"β‘’ request path"| Traefik["Traefik Ingress"]
    Traefik ==> Agents

    AWS[("AWS Secrets Manager")] -. External Secrets .-> API
    NAS[("UGREEN NAS Β· 12TB")] -. NFS / SMB CSI .-> Agents

β‘  Reconcile β€” FluxCD watches the Git repo and applies any change to the kube-apiserver, which persists the desired state in etcd. β‘‘ Schedule β€” the scheduler and controller-manager place the resulting pods onto the right agent nodes (GPU workloads land on the node with the NVIDIA device plugin). β‘’ Serve β€” inbound traffic flows from the internet through a Cloudflare Tunnel to Traefik, which routes it to the pods. Secrets are pulled from AWS Secrets Manager and storage is mounted from the NAS over CSI.

What’s running on top

flowchart LR
    subgraph AICore["AI/ML Platform"]
        Ollama[Ollama LLM]
        Voice["WhisperX Β· Piper Β· OpenWakeWord"]
        LF[Langfuse]
    end
    subgraph AppsG["Applications"]
        AIagents[AI Agent Platforms]
        Auto["Automation Β· n8n Β· Argo"]
        Web["Web & Content"]
    end
    subgraph DataG["Data Layer"]
        PG[(CloudNativePG HA)]
        Redis[(Redis)]
        PV[("Persistent Volumes<br/>NFS / SMB on UGREEN NAS")]
    end
    subgraph ObsG["Observability"]
        Prom[Prometheus] --- Graf[Grafana]
        Loki[Loki] --- Tempo[Tempo]
    end

    AppsG --> AICore
    AppsG --> DataG
    AICore --> DataG
    AICore -. model and data volumes .-> PV
    AppsG -. mounted volumes .-> PV
    ObsG -. scrapes .-> AppsG

πŸ—οΈ Core Infrastructure

Kubernetes Platform

  • K3s: Lightweight Kubernetes distribution
  • Multi-Node: 7 heterogeneous nodes spanning x86_64, ARM64, and Apple Silicon
  • GPU Support: Dual NVIDIA GPUs β€” RTX 5070 (12GB) + RTX 3050 (8GB) β€” for AI/ML workloads
  • GitOps: FluxCD for fully automated, declarative deployments
  • Storage: Dynamic persistent volumes backed by NAS, with automated backups

Infrastructure Services

Core Platform

  • Keycloak: Identity and access management (OIDC/SAML), PostgreSQL-backed
  • CloudNativePG: High-availability PostgreSQL cluster (3-node, streaming replication, auto-failover)
  • pgAdmin: Web-based PostgreSQL administration tool
  • Traefik: Built-in K3s ingress controller β€” load balancing and routing
  • Cert-Manager: Automated Let’s Encrypt TLS certificate management
  • NVIDIA GPU Operator: Device plugin, container toolkit, and Node Feature Discovery for GPU scheduling

Monitoring & Observability

  • Prometheus: Metrics collection and alerting (kube-prometheus-stack)
  • Grafana: Dashboards and data visualization
  • Loki: Log aggregation and querying
  • Tempo: OpenTelemetry-native distributed tracing backend
  • Grafana Alloy: OTEL collector routing metrics, logs, and traces
  • Blackbox & GPU Exporters: Endpoint probing and GPU metrics
  • Headlamp: Kubernetes cluster UI dashboard (with Kubescape plugin)

Security & Compliance

  • External Secrets Operator: Syncs secrets from AWS Secrets Manager
  • SOPS (Age): Encrypted bootstrap secrets committed to Git
  • OAuth2 Proxy: Authentication gateway for protected apps
  • Gitleaks: Automated secret scanning of Git repositories
  • Kubescape: Kubernetes security posture scanning
  • Kube-bench: CIS Kubernetes benchmark assessments

AI/ML Platform / LLM Infrastructure

  • Ollama: Local, GPU-accelerated LLM inference
  • Open-WebUI: Multi-user chat interface for local models
  • WhisperX: GPU speech-to-text with speaker diarization (plus a CPU-only Whisper for lighter workloads)
  • Piper: Natural text-to-speech synthesis
  • OpenWakeWord: Privacy-preserving wake word detection
  • Langfuse: Self-hosted LLM observability and tracing
  • Voice Pipeline: Wearable audio ingest β†’ transcription β†’ notes, orchestrated with Argo Workflows

MCP Servers β€” Model Context Protocol

A collection of MCP servers gives AI models structured access to real systems β€” Kubernetes resources, GitHub, PostgreSQL, weather, time, and more β€” fronted by an MCP gateway. This abstraction layer is crucial for building reliable AI agents that can act on live infrastructure.

Development & Productivity Tools

Automation & Workflows

  • n8n: Self-hosted workflow automation platform
  • Argo Workflows: DAG-based orchestration for audio and data pipelines
  • Renovate: Automated dependency and image updates across the GitOps repo

Knowledge & Content

  • Paperless-NGX: Document management with OCR
  • Hugo Blog: This documentation site you’re reading
  • Umami: Privacy-focused, self-hosted web analytics

Applications

Beyond infrastructure, the cluster hosts a range of personal applications β€” AI agent platforms, health and productivity tools, automation bots, and web properties β€” all deployed through the same GitOps workflow.

Supporting Services

Technical Infrastructure

  • Cloudflare Tunnels: Secure external access with no port forwarding
  • NFS & SMB CSI Drivers: Dynamic persistent volume provisioning from NAS
  • Scheduled Backups: Daily etcd snapshots and weekly resource backups via Kubernetes CronJobs

Automation & Agents

  • System Upgrade Controller: Automated K3s patching
  • Housekeeping: Scheduled cleanup of completed/failed pods
  • Backup Jobs: Automated routines for critical data

Technology Patterns

All services follow these common patterns:

Deployment

  • Kubernetes: Container orchestration for all workloads
  • GitOps: Infrastructure as code with FluxCD
  • Kustomize: Templating and configuration management

Security

  • External Secrets: AWS Secrets Manager integration
  • OAuth2/OIDC: Centralized authentication with Keycloak
  • RBAC: Role-based access control
  • Network Policies: Micro-segmentation for security

Observability

  • Prometheus Metrics: Standardized metrics collection
  • Grafana Dashboards: Visual monitoring
  • Structured Logging: Centralized aggregation with Loki
  • Distributed Tracing: Request flow analysis with Tempo + Alloy

Data Management

  • PostgreSQL: Primary database for stateful applications (HA via CloudNativePG)
  • Redis: Caching and session storage across multiple services
  • AWS S3: Object storage for backups and LLM observability data
  • Automated Backups: Regular snapshots of critical data

Hardware

Compute Nodes

  • Control Plane: Apple Silicon (M1 Pro)
  • Worker Nodes: Mix of x86_64 mini-PCs and laptops for general-purpose compute
  • GPU Node: Ryzen 9 3900X with dual NVIDIA GPUs (RTX 5070 + RTX 3050) for AI/ML

Storage

  • NVMe SSDs: Fast local storage for databases
  • NAS: UGREEN NAS (12TB RAID5) for shared storage and backups
  • Cloud Backup: Offsite backup to AWS S3

Networking

  • Cloudflare: CDN, DDoS protection, and zero-trust tunnels
  • Internal: Flat cluster network across heterogeneous nodes

GitOps Structure

Every change ships the same way β€” push to Git, and the cluster reconciles itself:

flowchart LR
    Push[git push] --> GH[GitHub]
    GH --> CI[GitHub Actions<br/>build multi-arch image]
    CI --> Hub[(DockerHub)]
    CI --> Bump[bump image SHA<br/>in fako-cluster]
    Bump --> Flux[FluxCD reconcile]
    Hub --> Flux
    Flux --> Rollout[K3s rollout]

The entire infrastructure is managed through Git:

fako-cluster/
β”œβ”€β”€ clusters/         # Per-cluster Flux entrypoints
β”œβ”€β”€ infrastructure/   # Controllers, configs, CRDs
β”œβ”€β”€ monitoring/       # Prometheus, Grafana, Loki, Tempo
└── apps/
    β”œβ”€β”€ base/         # App definitions
    └── staging/      # Enabled overlays per environment

Future Stack Additions

Planned technology additions:

  • Vector Database: Qdrant or Milvus for RAG and AI applications
  • Service Mesh: mTLS and traffic policy (evaluating Linkerd)
  • Native CI/CD: Tekton or Argo CD for in-cluster pipelines
  • Expanded Tracing: Broader OTEL instrumentation across services

This stack represents years of iteration and learning, optimized for both stability and experimentation. It’s designed to be production-grade while remaining flexible enough for rapid prototyping and learning.