Skip to content

Architecture Overview

Personal infrastructure running on Euronodes VPS and home Proxmox nodes, interconnected via WireGuard mesh and orchestrated with Kubernetes (Talos).

Components

mermaid
graph TB
    subgraph Internet
        CF[Cloudflare DNS]
        PD[PagerDuty]
        GL[GitLab CI]
    end

    subgraph Bastion["Bastion (Euronodes VPS)"]
        WG_HUB[WireGuard Hub]
        OTEL_B[OTel Collector + Relay]
        SEMAPHORE[Ansible Semaphore]
        WEBHOOK[SigNoz Webhook Relay]
    end

    subgraph K8s["Kubernetes Cluster — quinza"]
        CP[Control Plane - K2R4]
        W1[Worker 1 - K4R8]
        W2[Worker 2 - K4R8]
        METALLB[MetalLB L2]
        TRAEFIK[Traefik Ingress]
        EXTDNS[ExternalDNS]
        CNPG[CloudNativePG]
        APPS[Apps Namespace]
        ARGO[ArgoCD]
        GLRUNNER[GitLab Runner]
        OTEL_K8S[OTel DaemonSet]
        OTEL_CNPG[OTel CNPG Collector]
    end

    subgraph EliteDesk["EliteDesk (Proxmox)"]
        SIGNOZ[SigNoz - CT 101]
    end

    subgraph ThinkCentre["ThinkCentre (Proxmox)"]
        ONEUPTIME[OneUptime - CT 100]
    end

    CF -->|HTTPS| TRAEFIK
    METALLB -->|VIP 10.10.1.200| TRAEFIK
    EXTDNS -->|DNS records| CF
    SIGNOZ -->|alerts| WEBHOOK
    WEBHOOK -->|triggers| SEMAPHORE
    SEMAPHORE -->|runs| K8s
    WG_HUB --- CP
    WG_HUB --- W1
    WG_HUB --- W2
    WG_HUB --- EliteDesk
    WG_HUB --- ThinkCentre
    OTEL_K8S -->|OTLP| OTEL_B
    OTEL_B -->|OTLP| SIGNOZ
    SIGNOZ -->|alerts| PD
    GL -->|triggers| ARGO
    ARGO -->|syncs| K8s

Design Decisions

DecisionChoiceRationale
OS for K8sTalos LinuxImmutable, API-driven, minimal attack surface
CNIFlannel over WireGuardSimple, works with --iface=wg0 for mesh routing
Load balancerMetalLB (L2 mode)VIP 10.10.1.200, Traefik behind LoadBalancer service
IngressTraefik (LoadBalancer)Single VIP entry point via MetalLB
DNS automationExternalDNSAuto-creates Cloudflare DNS A records from K8s Ingress
PostgreSQLCloudNativePGOperator-managed, HA-ready, StackGres incompatible with K8s v1.36
Mesh VPNWireGuardKernel-level performance, simple config
ObservabilitySigNoz + OTelOpen-source, OpenTelemetry-native, self-hosted
Incident managementOneUptimeOpen-source PagerDuty alternative, status pages
SecretsSOPS + ageGit-friendly encryption, no external KMS dependency
GitOpsArgoCDDeployed in K8s, syncs from GitLab, auto-prune
Auto-remediationAnsible SemaphoreSigNoz alerts trigger Ansible playbooks via webhook relay
Config managementtalosctl patchestalhelper v3 broken, raw patches are reliable
IaCAnsibleWireGuard and Proxmox host provisioning
Internal CAstep-caRuns on bastion, issues internal TLS certs
CI RunnerGitLab Runner (K8s)Helm chart, Kubernetes executor, no cloud runner dependency
Centralized secretsRejected (Infisical)~20GB RAM for 15 secrets; SOPS + age + Vault + 1Password is enough
NAT forwardingnftablesPersistent MASQUERADE rules for WireGuard-to-LXC traffic

Quinza Infrastructure