AdGuard Home on Proxmox with EdgeRouter X-SFP: DNS, Ad Blocking, and Reverse DNS

The Problem My homelab has multiple VLANs, a Tailscale overlay network, and no ad blocking. DNS was handled entirely by the EdgeRouter X-SFP forwarding to Cloudflare. I wanted: Network-wide ad blocking without per-device configuration Conditional DNS forwarding so LAN clients can resolve Tailscale hostnames Non-Tailscale devices (Rokus, smart TVs) able to reach Tailscale services like Jellyfin Client names on the DNS dashboard instead of raw IPs The Architecture 1 2 3 4 5 6 7 8 9 10 11 12 13 LAN Clients (10.150.10.0/24) │ ├─ DNS ──→ dns01 (AdGuard Home, 10.150.60.11) │ ├─ Upstream: Cloudflare DoH, Google DoH │ ├─ Conditional: *.<tailnet>.ts.net → 100.100.100.100 │ └─ Reverse DNS: PTR queries → EdgeRouter (10.150.10.1) │ ├─ DHCP ──→ EdgeRouter X-SFP (dnsmasq) │ ├─ Primary DNS: 10.150.60.11 (AdGuard) │ ├─ Secondary DNS: 10.150.10.1 (router fallback) │ └─ Search domain: <tailnet>.ts.net │ └─ 100.x.x.x traffic ──→ static route → dns01 → MASQUERADE → tailscale0 dns01 is an LXC container on pve01 running AdGuard Home and acting as a Tailscale subnet router advertising all four LAN subnets. ...

March 25, 2026 · 4 min · Adam Behn

Rebuilding My Homelab: From 9 Nodes to 3 with Proxmox 9 and Ceph

The Problem My homelab had grown organically into a 9-node Proxmox 8 cluster on a flat 10.150.10.0/24 network. Six i5/i7 machines (pve001-006) with 16GB RAM each, plus three Ryzen 9 5900X machines (pve007-009) with 64-128GB RAM and dedicated GPUs. The old nodes were underpowered, the network was a mess, and managing it all was getting painful. It was time to consolidate. The Plan Rebuild the three Ryzen machines as a proper 3-node cluster with: ...

March 7, 2026 · 7 min · Adam Behn

Setting Up Tiered Ceph Storage with CephFS and RBD on Proxmox 9

The Setup I have a 3-node Proxmox 9 cluster, each with a 4TB SSD and 2TB HDD dedicated to Ceph. The NVMe drives stay local for fast VM storage. The question was: how do I use the SSDs for performance-sensitive workloads and the HDDs for bulk storage? 1 2 3 4 Per Node: 2TB NVMe → nvme-local (LVM-thin, not Ceph) 4TB SSD → Ceph OSD (fast tier) 2TB HDD → Ceph OSD (bulk tier) CRUSH Rules: Telling Ceph Where to Put Data Ceph already knows which OSDs are SSDs and which are HDDs — it assigns device classes automatically. But by default, it’ll spread data across all OSDs regardless of type. CRUSH rules let you pin pools to specific device classes. ...

March 7, 2026 · 5 min · Adam Behn

Building an AI-Powered Job Search System with Claude Projects

The Problem Job hunting is repetitive. Every application means re-reading your own resume, figuring out how to position your experience for this specific role, writing yet another cover letter, and hoping a recruiter connects the dots. Multiply that by dozens of applications and it gets exhausting fast. I wanted a system where I could drop in a job posting and get back an honest fit assessment, a tailored resume, and a cover letter without re-explaining my entire background every time. ...

February 26, 2026 · 7 min · Adam Behn

Replacing a Discrete GPU with Intel iGPU for Jellyfin Transcoding

I migrated Jellyfin from an AMD RX 570 to the Intel HD Graphics 630 integrated into the host CPU. The result: 4 simultaneous HEVC transcodes at ~10% CPU each, with a ~105-135W power reduction. Why Switch The AMD RX 570 was overkill for transcoding. It pulled 50-70W at idle and 120-150W under load — running 24/7 in a media server that mostly handles a few streams at a time. The Intel iGPU built into the i5-7500 has Quick Sync Video, which is purpose-built for exactly this workload. ...

November 30, 2025 · 3 min · Adam Behn

Two Kids, One Server: Building a Dual-GPU Gaming Setup on Proxmox

The Problem My two boys each had their own gaming PC. Two towers, two sets of peripherals, two machines to maintain, update, and troubleshoot. When I started consolidating everything into a Proxmox homelab, it seemed wasteful to keep two standalone gaming rigs around. The plan: one host, two GPUs, two Windows VMs. Each boy gets a dedicated GPU, their own monitor, keyboard, and mouse. They can game simultaneously without knowing they’re on virtual machines. ...

November 12, 2025 · 6 min · Adam Behn

X1 Carbon Memory Crisis and the zram Solution

Started with ‘why won’t Brave start?’ and ended with compressed RAM giving the equivalent of 16GB+ on hardware that can’t be upgraded.

October 23, 2025 · 10 min · Adam Behn

Building a CI/CD Pipeline Over Tailscale VPN

One of those satisfying days where a pile of “almost working” became a fully operational CI/CD pipeline. The goal: get GitHub Actions runners to test Ansible playbooks against real infrastructure over Tailscale VPN. The Problem I had Ansible playbooks managing Proxmox hosts, but no automated testing. Every change was a manual ansible-playbook --check from my laptop. I wanted PRs to automatically lint and dry-run against the real cluster before merge. ...

October 18, 2025 · 4 min · Adam Behn