Three rack servers with blinking LEDs beside a monitor showing a segmented network topology diagram
Concept visualization: the three-node cluster and its VLAN-segmented network map. Generated illustration, not a photo of the actual setup.
2025 to 2026 Infrastructure / Networking / Security GitHub ↗

Overview

This private cloud keeps every self-hosted service reachable with zero open inbound ports. A 3-node Proxmox VE 8.1 cluster provides high availability over Ceph; the network is segmented into four VLANs by trust level; and the only path in from the internet is a Cloudflare Tunnel gated by Access policies, with Tailscale as an authenticated mesh fallback. No inbound ports are open on the homelab router, and tunnel traffic rides Cloudflare's edge network for low-latency global access.

This is a distinct build from the single-host Proxmox Homelab and from the 7-node Kubernetes cluster's own Proxmox underlay: these three nodes are dedicated to this HA cluster, and it is this cluster's services that the Cloudflare Tunnel publishes.

On three nodes, Ceph runs its monitors in quorum with pools at 3x replication, so any single node can fail without data loss, but there is no second failure margin and recovery is I/O heavy on consumer disks. Placement group counts were therefore tuned down from the Ceph defaults, trading slower recovery for stability, and Proxmox HA is set so guests restart on a surviving node when one fails.

Network Topology

Zero-Trust Access Flow

Implementation

1

Form the HA cluster

# On the first node: create the cluster pvecm create tyf-cluster # On the second and third nodes: join pointing at the first node's IP pvecm add 192.168.10.10
2

Expose a service via Cloudflare Tunnel (no open ports)

cloudflared tunnel route dns tyf-tunnel cloud.tyfsadik.org
3

Automate local ZFS snapshots with sanoid

Sanoid protects the nodes' local ZFS pools (rpool). Ceph volumes are a separate scope: they need their own snapshot or backup strategy (Ceph snapshots, rbd mirroring, or vzdump to external storage), since sanoid does not see Ceph RBD images.

sanoid --configdir=/etc/sanoid --cron # hourly/daily/30-day retention
rpool/data@autosnap_2026-06-17_00:00:00_daily   ... 30 kept
took 12 snapshots, pruned 3

Key Results

  • Removed all open inbound ports by routing every external path through Cloudflare Tunnel gated by Access policies.
  • Low-latency global access via Cloudflare's edge network, with Tailscale as an authenticated mesh fallback.
  • Automated local ZFS snapshots (hourly/daily) with 30-day retention via sanoid; Ceph volumes are covered by a separate snapshot strategy.
  • Proxmox HA configured across the 3 nodes so guests restart on a surviving node if one fails.

How I built it

The design brief was strict: every self-hosted service reachable from anywhere, with zero public ingress. That means no open ports at all, identity-checked access at the edge, and a fallback path that stays authenticated.

  1. Phase 1, form the HA cluster: Joined three Proxmox VE 8.1 nodes with pvecm and built Ceph shared storage across them for high availability.
  2. Phase 2, segment the network: Carved the network into four VLANs by trust level: 10 for management, 20 for production, 30 for IoT, and 40 as the DMZ.
  3. Phase 3, close every port: Exposed services exclusively through Cloudflare Tunnel with Access policies, so the only path in from the internet is identity-gated and no inbound ports are open on the homelab router.
  4. Phase 4, add the mesh fallback: Configured Tailscale as an authenticated fallback so admin access survives even if the tunnel path has issues.
  5. Phase 5, automate data protection: Set up sanoid for automated local ZFS snapshots with hourly, daily, and 30-day retention, plus a separate snapshot strategy for Ceph volumes.
  6. Phase 6, deploy services: Ran the Docker-based services in LXC containers on the production VLAN behind the zero-trust front door.

What you need

CategoryItemNotes
Hardware3 Proxmox nodes with redundant networkingQuorum needs three; Ceph wants separate fast links
SoftwareProxmox VE 8.1, Ceph, sanoidClustering, distributed storage, snapshot automation
Softwarecloudflared, Cloudflare AccessTunnel ingress with identity policies
SoftwareTailscaleAuthenticated mesh fallback
AccountsCloudflare account with a domainTunnel DNS routing and Access policies
SkillsVLAN design and Ceph fundamentalsPlacement groups, crush maps, and recovery behavior

Challenges and lessons learned

  • Ceph on three small nodes: Ceph assumes datacenter hardware and complains loudly on consumer gear. Lesson: tune placement group counts down and accept slower recovery in exchange for stability.
  • Quorum sensitivity: losing one node in a three-node cluster leaves no failure margin. Lesson: monitor quorum health as a first-class alert, not an afterthought.
  • Access policy UX: every new service needs its Access policy or users hit a wall. Lesson: template the policy creation alongside the tunnel route so nothing ships ungated.

What is next

  • Enforce device posture checks through WARP before granting access.
  • Move toward short-lived certificates for service-to-service auth.
  • Build an audit logging pipeline for every access decision.
  • Expand automated policy tests that verify each VLAN boundary.
Proxmox VECephVLANCloudflare TunnelTailscaleZFSZero Trust