Skip to main content
>_
Homelab Journal // Network Security Engineer
// welcome

Enterprise security by day, homelab tinkerer by night.

Security engineer by day, homelab tinkerer by night. Building self-hosted infrastructure and documenting the journey.

4
Proxmox Nodes
50+
Services
11
MCP Tools
47
Guests

Recent journal

All entries →
  1. Graylog JVM Heap Optimization
    What Changed # Pinned Graylog’s JVM heap to 1GB by adding explicit GRAYLOG_SERVER_JAVA_OPTS to …
    Graylog Jvm
  2. Graylog Upgrade to 7.0.3 + MongoDB 7.0
    What Changed # Upgraded the Graylog logging stack: Graylog: 6.x → 7.0.3 MongoDB: 6.x → 7.0 Why # …
    Graylog Mongodb
  3. Semaphore Proxmox Power Management Automation
    What Changed # Added Ansible playbooks to Semaphore for automated Proxmox cluster power management: …
    Semaphore Proxmox
  4. Watchtower Discord Embed Notifications
    What Changed # Upgraded Watchtower notifications from plain text to Discord embeds using Shoutrrr …
    Watchtower Discord
  5. Semaphore Caddy Domain Management Playbooks
    What Changed # Added three Ansible playbooks to Semaphore for managing Caddy reverse proxy domains: …
    Semaphore Caddy

Recent

Your Firewall Baseline Should Fail Builds

Most organizations can tell you whether their firewalls are healthy. Fewer can prove every allow rule is inspected, logged, owned, and still required. The gap between those two things is where audits become painful. Multiple firewall admins, emergency changes at 2am, quarterly reviews that turn into archaeology digs, vendor access rules that were “temporary” in February and are still there in October. Nobody disabled them because nobody noticed they were still there. No alert fires when a rule that was supposed to be temporary quietly becomes permanent.

Meet Gilfoyle: I Hired a Sarcastic AI to Watch My Homelab 24/7

The Problem: Nobody’s Watching at 3 AM # My homelab runs 47 guests across 4 Proxmox nodes, with HA pairs for DNS and reverse proxy, a Wazuh XDR deployment, centralized logging in Graylog, and CI/CD automation through Semaphore. It’s a lot of infrastructure for one person to monitor. I had alerts. Grafana fires when RAM hits 75%. Wazuh flags suspicious file changes. n8n emails me when workflows fail. But alerts are reactive. They tell you something broke. They don’t tell you something is about to break.

I Built 15 Blog Posts Before Noticing My Own Site Was Broken

·652 words·4 mins
TL;DR # My technical blog was squeezing code blocks, tables, and ASCII diagrams into a 650px column designed for novel paragraphs. One CSS line fixed it. The real lesson: defaults optimized for one use case silently degrade another. The Problem I Didn’t See # I’d been publishing posts for months. Tutorials with wide code blocks. Architecture posts with ASCII flow diagrams. Tables comparing tools and alternatives. Every single one was being crushed into 65ch — roughly 650 pixels of width.

How I Got Every Device Named in My Firewall Logs (Without Active Directory)

TL;DR # A Python script that identifies every device on your network in PAN-OS traffic logs, without Active Directory. Combines Pi-hole DNS, UniFi Controller, and DHCP leases into one priority merge. 124 devices named on my PA-440. Before: 1 2 3 192.168.10.128 → 8.8.8.8 user: unknown 192.168.30.240 → 1.1.1.1 user: unknown 172.30.50.77 → 52.26.132.60 user: unknown After:

One MCP Server to Rule Them All: Unifying 9 Homelab Services

The Problem: Six Interfaces for One Question # “Is anything broken in my homelab?” Answering that question used to mean: SSH into Proxmox to check guest status. Curl the Pi-hole API for DNS health. Open Grafana to scan Prometheus alerts. Check Graylog for error spikes. Look at Semaphore for failed automation runs. Glance at Caddy logs for 502s.