Skip to content

Hardware & Network Topology

Physical Layout

graph TB
    subgraph WAN["WAN / Internet"]
        ext["External Clients"]
        onu["FTTH ONU\n192.168.11.1"]
    end

    subgraph edge["Edge"]
        bpir4["BPI-R4 Router\nOpenWrt 25.12-tillo\nWAN: 31.3.128.50/58"]
    end

    subgraph lan["LAN — 192.168.1.0/24"]
        subgraph jump["Jump Host"]
            mbt["mbptillo\n192.168.1.246\nsslh :4443\nmosh-server :443\nOpenVPN tun10"]
        end

        subgraph k8s["mdapi-prod — Harvester HCI / RKE2"]
            qui["qui — bare metal\niLO 192.168.1.170"]
            quo["quo — bare metal\niLO 192.168.1.181"]
            qua["qua — bare metal\niLO 192.168.1.182"]
            ingress["ingress-nginx\nPureLB 192.168.1.191"]
            gitlab_ing["GitLab nginx\nPureLB 192.168.1.197"]
        end

        subgraph nas["NAS / Object Storage"]
            salt["salt — TrueNAS CORE\nNFS + iSCSI\n(democratic-csi backend)"]
            pepper["pepper — TrueNAS"]
            santillo["santillo — Synology"]
            nastillo["nastillo — Synology"]
            minio["MinIO :30000\nS3-compatible"]
        end

        subgraph mgmt["Management Plane"]
            rancher["Rancher\nrancher.home.tillo.ch"]
            cm["CipherTrust Manager\ncm.home.tillo.ch\n+ Akeyless Gateway"]
        end
    end

    ext --> onu --> bpir4
    bpir4 -->|"DNAT → :4443"| mbt
    mbt -->|"TLS/SSH/VPN demux"| k8s
    k8s --> salt & minio
    rancher -->|"Fleet GitOps"| k8s
    cm -->|"ExternalSecrets"| k8s

IP Address Map

Device IP / Host Role
FTTH ONU 192.168.11.1 Fiber modem
BPI-R4 LAN 192.168.1.1 Router / firewall
BPI-R4 WAN 31.3.128.50 / 31.3.128.58 External IPs (web services / VPN)
mbptillo 192.168.1.246 Jump host / mosh / OpenVPN
qui iLO 192.168.1.170 BMC — node 1
quo iLO 192.168.1.181 BMC — node 2
qua iLO 192.168.1.182 BMC — node 3
ingress-nginx (PureLB) 192.168.1.191 HTTPS for all *.mdapi.ch
GitLab nginx (PureLB) 192.168.1.197 GitLab-dedicated ingress
salt (TrueNAS) salt NFS + iSCSI backend
MinIO minio.home.tillo.ch:30000 S3 object store

PureLB LoadBalancer VIP Pool (192.168.1.40–99)

PureLB provides bare-metal LoadBalancer services by advertising IPs via ARP/NDP on the LAN. Each service gets a stable VIP from the pool.

VIP Namespace Service
192.168.1.40 mqtt Eclipse Mosquitto (MQTT broker)
192.168.1.41 tv Plex Media Server
192.168.1.42 tv Rsync
192.168.1.43 honeypot Trapeye (honeypot)
192.168.1.44 envuassu Nextcloud AIO Apache
192.168.1.45 envuassu Nextcloud AIO Talk
192.168.1.46 mirror Package mirror
192.168.1.47 mail docker-mailserver
192.168.1.48 ntppool Chrony NTP (GPS stratum-1)
192.168.1.49 opennic OpenNIC tier-2 resolver
192.168.1.50 squid HTTP/S proxy
192.168.1.51 znc ZNC IRC bouncer
192.168.1.52 openldap OpenLDAP
192.168.1.53 nameserver BIND9 authoritative DNS
192.168.1.191 kube-system ingress-nginx (all *.mdapi.ch)
192.168.1.197 bootstrap GitLab nginx ingress

Why Bare Metal + Harvester?

Harvester HCI runs RKE2 with KubeVirt integrated, providing both container workloads and VM-based workloads (like the CipherTrust Manager appliance) on the same cluster. iLO access on each node enables remote power management and out-of-band console access — useful when a bad kernel patch or misconfigured network makes SSH inaccessible.

The three-node setup (qui, quo, qua) provides a quorum for the RKE2 control plane (etcd) and allows Longhorn to replicate volumes across two nodes while a third can be taken offline for maintenance.